我正在尝试使用全加法器的波纹来创建N位加法器/减法器。输入为N位A,N位B,结果长度应为2N (它输出具有2条总线的ALU,每条总线的高和低各为N位,因此我正在尝试扩展带符号位)。
减法进位的问题出现了。例如,当做3-2时(假设N=3是011-010,2的恭维是011+110),我得到了进位1的001,问题是这个进位是垃圾,不能扩展,但在其他情况下它是必要的。例如,当尝试do (-3)+(-3) (101+101,同样是N=3)时,我得到010,进位为1。这一次进位实际上表示符号,所以我想扩展它。
下面是我的代码:
entity FullAdder is
Port (
A : in std_logic;
B : in std_logic;
Cin : in std_logic;
sum : out std_logic;
Cout : out std_logic
);
end FullAdder;
architecture gate of FullAdder is
begin
sum <= A xor B xor Cin ;
Cout <= (A and B) OR (Cin and A) OR (Cin and B) ;
end gate;下面是N位加法器
entity NbitsAdder is
generic(N: integer := 8);
Port(
A : in std_logic_vector((N-1) downto 0);
B : in std_logic_vector((N-1) downto 0);
Cin: in std_logic;
SUM : out std_logic_vector((N-1) downto 0);
Cout : out std_logic
);
end NbitsAdder;
architecture NbitsAdderGate of NbitsAdder is
...
signal temp : std_logic_vector (N downto 0);
begin
temp (0) <= Cin;
arrrayOfFullAdders : for i in 0 to N-1 generate
adder_i: FullAdder port map ( A(i), B(i), temp(i), SUM(i), temp (i+1) );
end generate;
Cout <= temp(N); --which will be extend
end NbitsAdderGate;这是加法器或副加法器
entity NbitsAddOrSub is
generic(N: integer := 8);
port(
A : in std_logic_vector ((N-1) downto 0);
B : in std_logic_vector ((N-1) downto 0);
addOrSub : in std_logic;
sumLo : out std_logic_vector ((N-1) downto 0);
sumHi : out std_logic_vector ((N-1) downto 0)
);
end NbitsAddOrSub;
architecture NbitsAddOrSubGate of NbitsAddOrSub is
signal tempB: std_logic_vector ( (N-1) downto 0);
signal CoutTemp: std_logic;
begin
loop1 : for i in 0 to N-1 generate
xor_i: xorGate port map ( B(i), addOrSub, tempB(i));
end generate;
theOperation : NbitsAdder generic map (N)
port map ( A => A, B => tempB, Cin => addOrSub, sum => sumLo, Cout => CoutTemp);
sumHi <= (N-1 downto 0 => CoutTemp); -- tring to extend the sign bit
end NbitsAddOrSubGate;发布于 2019-03-28 23:28:39
此外,带符号的加法进位没有任何意义。符号位是从和的MSB得到的,而不是从进位得到的。在你的第二个例子中有一个下溢,因为-3+-3小于2^((N=3)-1),因此结果是不正确的。要对结果进行签名扩展,应首先检查有符号加法的上溢/下溢条件。如果没有发生溢出/下溢,则查看和的MSB并扩展该位
https://stackoverflow.com/questions/55395374
复制相似问题