VHDLには新しく(3週間)、最新の割り当てでは単純な4ビット加算器でオーバーフローチェックを実装することに問題があります:4ビット加算器/減算器(VHDL)でオーバーフローチェックを実装する
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
entity add_sub_4bit is
Port (a : in STD_LOGIC_VECTOR(3 downto 0);
b : inout STD_LOGIC_VECTOR(3 downto 0);
sel: in STD_LOGIC);
--sum : inout STD_LOGIC_VECTOR(3 downto 0)
end add_sub_4bit;
architecture Behavioral of add_sub_4bit is
signal localflow : STD_LOGIC;
signal localsum : STD_LOGIC_VECTOR (3 downto 0);
begin
localsum <= a + b when sel = '1'
else
a - b;
process(a,b,localsum) begin
if a(3) = '0' AND b(3) = '0' AND localsum(3) = '1' then
localflow <= '1';
elsif a(3) = '1' AND b(3) = '1' AND localsum(3) = '0' then
localflow <='1';
else
localflow <='0';
end if;
end process;
end Behavioral;
すぐ、テストケースのようなある: A = 5、B = -3、SELに0を与えることは、1つの減算を追加します。 A = 6、B = 2、ほとんど同じことをしています。
ここで、数字が署名されているとしたら、もちろん2の補数なので結果も同じです。しかし、オーバーフローは6(0110)と2(0010)を加算して-8(1000)を出力する場合にしか検出できません。これは明らかに4ビットのオーバーフローの場合です。しかし、5 - ( - 3)を実行すると、結果はまったく同じ1000になりますが、私は2つの異なる符号を与えているので、私の方法でオーバーフローを検出することはできません。
先生たちはSELの値に応じて、Bの符号を変更することが示唆されている - 私はそれに基づいて、B < = B +「1000」を作るようなものを試してみましたが、それは助けにはならなかった、と私は知りません他の方法の、非常に言語に新しいです。適切なプログラムを取得するために私は何ができますか?ありがとうございました。まず
HW減算では、Bの2の補数を追加します(b + 1ではなく)+ 1はキャリーインを使用します。減算するときは、オーバーフローのための実際のb加算オペランドの符号を使用する必要があります。これは、sel = '1'の場合はopb_sign <= b(3) (3); '。これを別のマルチプレクサ(セレクタ)として表示したり、XORを使用して '(b(3)xor not sel) 'という用語に展開してください。また、元のオーバーフローセレクタを崩壊させると 'localflow <= a(3)xor b(3)xor not sel xor localsum(3);'括弧は不要であり、XORは可換性です。優先度は高くない。 – user1155120
こんにちは、 あなたの提案はうまくいった - 私はadditonal muxと同じプログラムを保った。どうもありがとう! – xen20