1

VHDL で 2 つの数値 (符号なし 2 の補数形式) を乗算するためのブースのアルゴリズムを実装しています。残念ながら、私は VHDL が苦手で、どこが間違っているのかわかりません。

問題: シミュレーションを進めていくと、y に "1011" の値を割り当てたときに、信号 mult が "0UUU" になっていることに気付きました。なぜそれが起こるのか理解できません。これが私のコードです:

library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;

-- x, y are the n bit numbers to be multiplied.
-- The Algorithm :
-- U = 0, prev_bit = 0;
-- for i = 1 to n do
-- if start of a string of 1's in Y then U = U - X
-- if end of a string of 1's in Y then U = U + X
-- Arithmetic right shift UV
-- Circular right shift Y and copy Y(0) to prev_bit

entity booth is 
  generic(N : natural := 4);
  port(
    x, y : in std_logic_vector(N-1 downto 0);
    result : out std_logic_vector(2*N-1 downto 0);
    clk : in std_logic 
  );
end booth;

architecture booth_arch of booth is
  --temp is equivalent to UV where UV is the result.
  signal temp : std_logic_vector(2*N-1 downto 0) := (others => '0');
  --prev_bit to compare for starting and ending of strings of 1's.
  signal prev_bit : std_logic := '0';
  signal mult : std_logic_vector(N-1 downto 0);

  begin 
    process(x, y)
      begin
        mult <= y;
        prev_bit <= '0';
        for i in 0 to N-1 loop  
          if(mult(0) = '1' and prev_bit = '0') then   --start of a string of 1's
            temp(2*N-1 downto N) <= std_logic_vector(unsigned(temp(2*N-1 downto N)) + unsigned(not(x)) + 1);
          elsif(mult(0) = '0' and prev_bit = '1') then --end of a string of 1's
            temp(2*N-1 downto N) <= std_logic_vector(unsigned(temp(2*N-1 downto N)) + unsigned(x));
          end if;      
        prev_bit <= mult(0);
        mult(N-2 downto 0) <= mult(N-1 downto 1);   --circular right shift y.
        mult(N-1) <= prev_bit;
        temp(2*N-2 downto 0) <= temp(2*N-1 downto 1);  --arithmetic right shift temp.
       end loop; 
       result <= temp; 
  end process;     
end booth_arch;

PS : clk 信号はここでは冗長です。まだ使っていません。

4

2 に答える 2

1

ブライアンのコメントに加えて、同じ組み合わせプロセスでシグナル mult を読み書きしています。自分が何をしているのか本当にわかっていない限り、これを行うべきではありません。合成後、シミュレーターの動作に対応しないものが得られます。

また、(プロセスの最初の行で) 割り当てた値はmult、プロセスが終了して新しい反復を開始するまで表示されないことに注意してください。VHDL で言えば、新しい値は 1 つのデルタ サイクル後に使用可能になると言います。

于 2013-11-10T14:24:39.280 に答える
1

ポートと内部信号が署名されていない場合は、まずそれらを宣言しますunsigned。少なくとも、正しい numeric_std ライブラリを使用しています。それと戦うのではなく、強力なタイプシステムを使用してください!

次に、シミュレーションの開始時に 1 回ではなくTemp、各乗算の開始時に初期化する必要がある場合があります (既に で行っているように)。Mult, Prev_Bit現時点では、以前の乗算 ( *Tempなど) からの古い値を含めることができるようです。UUUUUUUU

第三に、あなたは何に割り当てられているかを教えてくれますが、私が知っている限り、あなたが何に割り当てているのかはまだYわかりません.XUUUU

最小限の VHDL テストベンチを作成し、それを質問に追加することは、さらなる支援を得るための良い方法です。または、問題の本当の原因を自分で発見する可能性が高くなります。

于 2013-11-10T10:29:50.873 に答える