現在、VHDL で 32 ビット ALU (Add/Sub) を作成しています。オーバーフロー ビットに問題があります。演算(足し算、引き算)や入力値によって、いつオーバーフローを設定すればいいのかわかりません。
手伝って頂けますか ?
よろしく、 アンドレ
マーティンの答えに少し情報を追加するだけで、2 の補数演算でオーバーフローを検出することに注意する必要があります。
たとえば、2 の補数形式で表された 3 ビットの符号付きの値があり、オーバーフローを検出したい場合は、余分なビットに符号拡張し、余分なビットが必要な最上位ビットと異なるかどうかを確認する必要があります。 :
たとえば、a = b + c を計算する場合:
--Declare the signals
signal overflow : std_logic;
signal a : signed(2 downto 0);
signal b : signed(2 downto 0);
signal c : signed(2 downto 0);
-- Declare some additional signals with one more MSB than the original signals
signal a_extended : std_logic(3 downto 0);
signal b_extended : std_logic(3 downto 0);
signal c_extended : std_logic(3 downto 0);
-- Sign extend the MSB
b_extended <= b(2) & b;
c_extended <= c(2) & c;
-- Perform the addition
a_extended <= b_extended + c_extended;
-- Detect the overflow case
overflow <= '1' when a_extended(3) /= a_extended(2) else '0';
-- Calculate the answer
-- Limit to 100 (-4) or 011 (+3) in the case of overflow
process(a_extended)
begin
if a_extended(3) /= a_extended(2) then
if a_extended(3) = '1' then
a <= "100";
else
a <= "011";
end if;
else
a <= a_extended(2 downto 0);
end if;
end process;
仕様は何をすべきだと言っていますか?どのような条件下でオーバーフロー フラグを設定する必要があるかについての説明が必要です。
通常、オーバーフロー ビットは、出力がストレージに対して大きすぎる場合に設定されます。2 つの 32 ビット数を合計する答えの 33 番目のビットと考えることができます。符号付き演算では、符号に関係なく、演算結果の大きさが大きすぎる場合に発生する可能性があります。2 の補数演算では、最大の負の数は、指定されたビット数で表すことができる最大の正の数よりもわずかに負であるため、少し注意する必要があります。
実際にそれを行うという点ではnumeric_std
、入力よりも 1 ビット広いベクトルを作成するだけです。
a<=b+c;
シンセサイザーにロジックを作成させます。その後、詳細について心配する必要はありません。
"a" の MSB を取り除くことができます (使用a(a'high)
して、オーバーフローとして使用します。