0

VHDL で ALU をビルドして合成しようとしていますが、合成するとすぐに問題が発生します。ALU に、2 つの N ビット入力を追加するためのオペコードと、入力または以前に計算された合計によって設定できるキャリーを持たせたいと考えています。私が興味を持っているコードの部分は次のとおりです。

process (a, b, op) -- a and b are n bits input en op is the op-code
    case op is
        when "011" => -- add a + b + c (with c as carry)
            y <= ('0' & a) + ('0' & b) + c; -- y is the N-bit output
...
end process;

process (clk)
   if (clk'event and clk = '1') then
       if (op = "011" and (to_integer(a)+to_integer(b)+to_integer(c)) > (2**N)) then --basically I'm testing if there is an overflow during the calculation
           c <= '1';
       elsif (op = "011" and (to_integer(a)+to_integer(b)+to_integer(c)) < ((2**N)+1))
           c <= '0';
...
end process;

シグナルの種類を定義していないので、ここでコードが機能するかどうかはわかりませんが、基本的には上に書いたとおりです。これに関する問題は、適切なテストベンチで VHDL をシミュレートすると、正常に動作するのに、このコードを合成して同じテストベンチで合成コードをシミュレートすると、最初のプロセスが何らかの理由で正しく動作しないことです。 a、b、または op が変更されていなくても、もう一度繰り返されます。したがって、合計の結果にキャリーがある場合、この新しいキャリーを使用して計算が再度実行され、a、b、または op が変更されていなくても、結果が 1 増加します。

後で、この記事で、機密リストがコンパイラによって「無視」されていることを発見しました。コンパイラは、コンパイラがプログラムをあなたよりもよく知っていると考え、独自の機密リストを作成します。これが真の場合、コンパイラが最初のプロセスのセンシティビティ リストに clk を追加して、op = "011" のときに clk 周期ごとに計算が実行されるようにします。

私の質問は次のとおりです。計算が一度実行され、その後キャリーが変更されるようにするには、この問題について何ができますか?

敬具

4

1 に答える 1

0

他の人が指摘したように、あなたのコードにはいくつかの問題があります。いくつかの改善点を提案してから、キャリー フラグを計算するための可能な方法を示します。

  1. キャリーイン信号とキャリーアウト信号を区別します。carry_inやなど、信号にわかりやすい名前を使用しますcarry_out。これにより、多くの混乱が解消されます。

  2. ALU 操作の定数または列挙型を定義します。例えば:

    subtype opcode_type is std_logic_vector(2 downto 0);
    constant ADC: opcode_type := "011";  -- ADC: add with carry
    
  3. 最後に、VHDL 2008 を使用している場合は、割り当てターゲットとして集計を使用してキャリーアウトを生成できます。

    (carry_out, y) <= ('0' & a) + ('0' & b) + carry_in;
    

コードは次のようになります。

process (all)
    case op is
        when ADC => -- add a + b + c (with c as carry)
            (carry_out, y) <= ('0' & a) + ('0' & b) + carry_in;
    ...
end process;

process (clk)
    if rising_edge(clk) then
        carry_flag <= carry_out;
    ...
end process;
于 2013-09-27T20:12:49.190 に答える