问题描述
Hw:我正在研究带有溢出检测的 32 位加法和减法。它基于 4 位加法器组件,后者基于全加器组件。
当减为 1 --> 做减法,否则加法
以下是我到目前为止所拥有的,只有 sum 和 overflow 有问题。
我不知道为什么总和不正确(例如:20-12=8)。请帮忙解决这个问题!
对于溢出,我试过
overflow <= '1' when a(31)='1' and var(31)='1' and s(31)='0' else '1' when a(31)='0' and var(31)='0' and s(31)/='0' else '0';
但它不起作用并给我同样的溢出。
32 位加法器/子:
use ieee.std_logic_1164.all;
entity thirty_two_bit_adder is
port (a,b: in std_logic_vector(31 downto 0);
subtract: in std_logic;
sum: out std_logic_vector (31 downto 0);
overflow: out std_logic);
end thirty_two_bit_adder;
architecture fa_arch of thirty_two_bit_adder is
component four_bit_adder
port (a,b: in std_logic_vector(3 downto 0);
cin : in std_logic;
sum: out std_logic_vector (3 downto 0);
cout: out std_logic);
end component;
signal t: std_logic_vector (6 downto 0);
signal var: std_logic_vector (31 downto 0);
signal s: std_logic_vector(31 downto 0);
begin
--LHS: 4-bit compnent ports => RHS: 32-bit entity ports
var(31 downto 0)<= not b(31 downto 0) when subtract='1' else b(31 downto 0);
FA0: four_bit_adder port map (a(3 downto 0) => a(3 downto 0),b(3 downto 0) => var(3 downto 0),cin => subtract,sum(3 downto 0) => s(3 downto 0),cout => t(0));
FA1: four_bit_adder port map (a(3 downto 0) => a(7 downto 4),b(3 downto 0) => var(7 downto 4),cin => t(0),sum(3 downto 0) => s(7 downto 4),cout => t(1));
FA2: four_bit_adder port map (a(3 downto 0) => a(11 downto 8),b(3 downto 0) => var(11 downto 8),cin => t(1),sum(3 downto 0) => s(11 downto 8),cout => t(2));
FA3: four_bit_adder port map (a(3 downto 0) => a(15 downto 12),b(3 downto 0) => var(15 downto 12),cin => t(2),sum(3 downto 0) => s(15 downto 12),cout => t(3));
FA4: four_bit_adder port map (a(3 downto 0) => a(19 downto 16),b(3 downto 0) => var(19 downto 16),cin => t(3),sum(3 downto 0) => s(19 downto 16),cout => t(4));
FA5: four_bit_adder port map (a(3 downto 0) => a(23 downto 20),b(3 downto 0) => var(23 downto 20),cin => t(4),sum(3 downto 0) => s(23 downto 20),cout => t(5));
FA6: four_bit_adder port map (a(3 downto 0) => a(27 downto 24),b(3 downto 0) => var(27 downto 24),cin => t(5),sum(3 downto 0) => s(27 downto 24),cout => t(6));
FA7: four_bit_adder port map (a(3 downto 0) => a(31 downto 28),b(3 downto 0) => var(31 downto 28),cin => t(6),sum(3 downto 0) => s(31 downto 28),cout => overflow);
overflow <= '1' when a(31)/=a(30) and b(31)/=b(30) else
'0';
end fa_arch;
测试用例:
-- -3 + -6 = -9 (0xFFFFFFF7) ***correct sum,but mine is overflow***
subtract <= '0';
a <= "11111111111111111111111111111101";
b <= "11111111111111111111111111111010";
-- 20 - 12 = 8 (0x00000008) ***I got 00000021 for sum***
subtract <= '1';
a <= "00000000000000000000000000010100";
b <= "00000000000000000000000000001100";
-- Large positive - large negative = overflow ***mine is not overflow***
subtract <= '1';
-- large positive + large positive = overflow ***mine is not overflow***
subtract <= '0';
-- large negative - large negative = no overflow ***mine is overflow***
subtract <= '1';
提前致谢!!
解决方法
您已经获得了驱动信号“溢出”的 FA7 组件。您还从内联代码驱动信号“溢出”。你通常不能两者都做,你会得到 X。
如果您的 4 位加法器组件构造正确,则 FA7 输出应该可以工作。