我试图为3输入简单加法器编写VHDL代码。当我输入以下代码时,S得到正确的输出值但S1得到零,因此add_out也得到错误的值。
library ieee;
use ieee.std_logic_1164.all;
entity adder is
port( A,B : in std_logic_vector(3 downto 0);
C : in std_logic;
carry_out : out std_logic;
S : out std_logic_vector(3 downto 0);
addOut : out std_logic_vector(4 downto 0));
end adder;
architecture behavioral of adder is
signal S1 : std_logic_vector(3 downto 0);
begin
proc : process(A,B,C) is
variable carry : std_logic;
begin
carry := C;
for i in 0 to 3 loop
S(i) <= A(i) xor B(i) xor carry;
S1(i) <= A(i) xor B(i) xor carry;
carry := (A(i) and B(i)) or (B(i) and carry) or (A(i) and carry);
end loop;
carry_out <= carry;
addOut <= carry & S1;
end process proc;
end behavioral;
为什么信号S1的值与S不相同?
答案 0 :(得分:0)
S1
可能(几乎可以肯定)获得与S
相同的价值。
但是,由于过程敏感性列表中的错误,您不希望在S1
上看到addOut
的值。研究信号分配的语义(又称“推迟分配”)和增量循环,一切都将变得清晰。 (My usual explanation on this topic,如果你能原谅一些自我宣传的话)
具体来说,您在S1上有一个新值,但没有办法再次唤醒该过程以将其传播到任何其他信号。
最好的解决方法可能是将addOut
和carryOut
分配移到流程之外,它们会立即反映自己输入的任何变化,并降低sim / synth不匹配的可能性。< / p>