好日子,VHDL:CLA减法器模块级联
我实现了一个8个CLA加法/减法模块和它的伟大工程。代码如下:我已将以下模块中的2个串联起来以创建一个16位加法器/减法器。这16位版本适用于加法,对于较低位,进位由1 8位加法器生成,然后传递到下一个加法器以处理较高位。
问题在于减法。即使在纸上,它也不起作用。让我举一个例子。比方说,我想要做的350 - 50
300: 00000001 00101100
50: 00000000 00110010
因此,如果我让一个加法器具有较低位,而另一个处理高位,这根本是行不通的。这是为什么:
300: 00000001 00101100
50 in 2's compliment: 11111111 11001110
250 is supposed to be 00000000 11111010
第1加法器:加法后产生正确的值11111010.这很酷。现在第二个加法器是个问题。它会做(1的恭维+ 1),它会给00000000(带进位)。它应该是(11111111),但是由于算法中的+1,这是一个普遍的实现,所以它最终的结果就出来了。
正确的,因为加法器0没有进位,所以加法器1不应该做+1。我怎么能够在通用8位子/加法器的逻辑中实现这个?这是正确的想法吗?我是否覆盖了所有可能的后果/边缘情况?
entity CLA_ADD_SUB is
generic (N : integer := 8);
Port (A : in STD_LOGIC_VECTOR (N-1 downto 0);
B : in STD_LOGIC_VECTOR (N-1 downto 0);
Binv : in STD_LOGIC;
C_in: in STD_LOGIC;
S : out STD_LOGIC_VECTOR (N-1 downto 0);
TEST : out STD_LOGIC_VECTOR (N-1 downto 0);
C_out : out STD_LOGIC
);
end CLA_ADD_SUB;
architecture CLA_ADD_SUB_ARCH of CLA_ADD_SUB is
SIGNAL h_sum : STD_LOGIC_VECTOR(N-1 DOWNTO 0);
SIGNAL carry_generate : STD_LOGIC_VECTOR(N-1 DOWNTO 0);
SIGNAL carry_propagate : STD_LOGIC_VECTOR(N-1 DOWNTO 0);
SIGNAL carry_in_internal : STD_LOGIC_VECTOR(N-1 DOWNTO 1);
SIGNAL B_mod : STD_LOGIC_VECTOR(N-1 DOWNTO 0) := B;
SIGNAL C_in_mod: STD_LOGIC := C_in;
signal S_wider : std_logic_vector(N downto 0);
begin
WITH Binv SELECT
B_mod <= B WHEN '0',
not B WHEN '1',
B WHEN OTHERS;
WITH Binv SELECT
C_in_mod <= C_in WHEN '0',
not C_in WHEN '1',
C_in WHEN OTHERS;
-- Sum, P and G
h_sum <= A XOR B_mod;
carry_generate <= A AND B_mod;
carry_propagate <= A OR B_mod;
PROCESS (carry_generate,carry_propagate,carry_in_internal,C_in_mod)
BEGIN
carry_in_internal(1) <= carry_generate(0) OR (carry_propagate(0) AND C_in_mod);
inst: FOR i IN 1 TO (N-2) LOOP
carry_in_internal(i+1) <= carry_generate(i) OR (carry_propagate(i) AND carry_in_internal(i));
END LOOP;
C_out <= carry_generate(N-1) OR (carry_propagate(N-1) AND carry_in_internal(N-1));
END PROCESS;
S(0) <= h_sum(0) XOR C_in_mod;
S(N-1 DOWNTO 1) <= h_sum(N-1 DOWNTO 1) XOR carry_in_internal(N-1 DOWNTO 1);
end CLA_ADD_SUB_ARCH;
你的数学片段说'250应该是00000000 11111010'。在那之下你说第二个加法器输出'00000000'。然后你说这是错误的。我认为我不明白... – fru1tbat 2014-09-23 16:05:05
顺便说一句,50中的2补码是'11001110',而不是'11001101'。 – fru1tbat 2014-09-23 16:07:59
这个想法是,如果我们正在减去(做2的赞美),如果第一个加法器没有进位,我们应该做一个(1的赞美) – raaj 2014-09-23 16:11:07