3

ご覧のとおり、VHDL では、MOD と REM のみをシミュレートできますが、合成することはできません。では、符号なし整数から BCD を取得するにはどうすればよいでしょうか? たとえば、整数は 23 ですが、BCD:0b0010 と 0b0011 を取得するにはどうすればよいでしょうか? ありがとう。

4

3 に答える 3

1

以下の 2 つの VHDL 関数を提供しています。これは、バイナリからパック BCD に、またはその逆に変換するためのものです。これらはザイリンクス Spartan 3AN ファミリで検証済みで、合成可能です。ieee.numeric_std.allを使用します。およびieee.std_logic_1164.all; ライブラリ

関数 1: バイナリから BCD --source: http://vhdlguru.blogspot.com.es/2010/04/8-bit-binary-to-bcd-converter-double.html (SO ユーザー Peque が元の URL を見つけた)

    function to_bcd ( bin : unsigned(7 downto 0) ) return unsigned is
        variable i : integer:=0;
        variable bcd : unsigned(11 downto 0) := (others => '0');
        variable bint : unsigned(7 downto 0) := bin;

        begin
        for i in 0 to 7 loop  -- repeating 8 times.
        bcd(11 downto 1) := bcd(10 downto 0);  --shifting the bits.
        bcd(0) := bint(7);
        bint(7 downto 1) := bint(6 downto 0);
        bint(0) :='0';


        if(i < 7 and bcd(3 downto 0) > "0100") then --add 3 if BCD digit is greater than 4.
        bcd(3 downto 0) := bcd(3 downto 0) + "0011";
        end if;

        if(i < 7 and bcd(7 downto 4) > "0100") then --add 3 if BCD digit is greater than 4.
        bcd(7 downto 4) := bcd(7 downto 4) + "0011";
        end if;

        if(i < 7 and bcd(11 downto 8) > "0100") then  --add 3 if BCD digit is greater than 4.
        bcd(11 downto 8) := bcd(11 downto 8) + "0011";
        end if;

    end loop;
    return bcd;
    end to_bcd;

機能 2: BCD からバイナリへ

    --(c)2012 Enthusiasticgeek for Stack Overflow. 
    --Use at your own risk (includes commercial usage). 
    --These functions are released in the public domain and 
    --free to use as long as this copyright notice is retained.

    --multiplication by 10 is achieved using shift operator   X<<3 + X<<1
    --input should be packed BCD.
    function to_binary ( bcd : unsigned(11 downto 0) ) return unsigned is
        variable i : integer:=0;
        variable binary : unsigned(7 downto 0) := (others => '0');  
        variable temp : unsigned(6 downto 0) := (others => '0');
        variable bcdt : unsigned(11 downto 0) := bcd;   
        variable tens : unsigned(7 downto 0) := (others => '0');
        variable hundreds_stepI : unsigned(7 downto 0) := (others => '0');
        variable hundreds_stepII : unsigned(7 downto 0) := (others => '0');

       begin

         for i in 0 to 11 loop  -- repeating 12 times.

         if(i >=0 and i<4) then
            binary := ((temp&bcdt(i) ) sll i ) + binary;
         end if;         

         if(i >=4 and i<8) then         
            tens := (((temp&bcdt(i) ) sll (i-4) ) sll 3) + (((temp&bcdt(i) ) sll (i-4) ) sll 1); --multiply by 10           
            binary := tens + binary;
         end if;         

         if(i >=8 and i<12) then         
            hundreds_stepI := (((temp&bcdt(i) ) sll (i-8) ) sll 3) + (((temp&bcdt(i) ) sll (i-8) ) sll 1); --multiply by 10
            hundreds_stepII := (hundreds_stepI sll 3) + (hundreds_StepI sll 1); -- multiply by 10 again so the effect is now multiply by 100                
            binary := hundreds_stepII + binary;
         end if;

         end loop;     

       return binary;
    end to_binary;

注: 次のリンクの情報を使用して整数を符号なしに変換できますconvert integer to std_logic

于 2012-12-03T17:02:27.400 に答える
1

これは他の場所でカバーされています:

https://electronics.stackexchange.com/questions/22611/binary-to-bcd-converison

  • ルックアップ テーブルは 1 つのオプションです
  • 大きなケース ステートメントは別です (ルックアップ テーブルに変換されます)。
  • または、余りが 10 未満になるまで 10 を引き続ける反復法 - 引き数の数が 10 の桁、残りが単位の桁です。
于 2012-10-18T10:15:40.857 に答える
0

「ダブル ダブル」アルゴリズムに興味があるかもしれません。

http://en.wikipedia.org/wiki/Double_dabble

基本的に、整数表現の「左側」に配置する BCD 表現のレジスタを作成します。23以下は、数値を BCD 表現に変換する例です。

BCD_1  BCD_0      Original
0000   0000       10111

ここで、元のビットを左にシフトする for ループを作成します (これらのビットを BCD レジスタにプッシュします)。このループでは、各BCD_X桁について、4 より大きいかどうかを確認する必要があります。その場合、その桁に 3 を追加します。

shift_iteration   BCD_1  BCD_0      Original
0                 0000   0000       10111
1                 0000   0001       01110       (no digit greater than 4)
2                 0000   0010       11100       (no digit greater than 4)
3                 0000   0101       11000       (5 in BCD_0! we add 3...)
still 3...        0000   1000       11000       (after addition, shift again)
4                 0001   0001       10000       (no digit greater than 4)
5                 0010   0011       00000       (no digit greater than 4)

すべての元のビットを BCD レジスタにプッシュすると (+3いずれかの数字が 4 より大きい場合のルールを使用)、BCD は0010 0011(23) を表します。

詳細については、ウィキペディアの記事を参照してください。VHDL 実装の例もあります。

于 2015-05-10T20:19:30.983 に答える