VHDL:体系结构中定义的信号未采用指定值

VHDL: Signal defined in the architecture not taking the assigned value

我正在尝试为 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 相同的值?

S1 可能(几乎可以肯定)得到与 S.

相同的值

但是,由于进程敏感度列表中的错误,您不会期望在 addOut 上看到 S1 的值。研究信号分配(又名 "postponed assignment")和增量循环的语义,一切都会变得清晰。 (My usual explanation on this topic,如果你不介意自我宣传的话)

具体来说,您在 S1 上有一个新值,但无法再次唤醒进程以将其传播到任何其他信号。

最好的解决方法可能是将 addOutcarryOut 赋值移动到流程之外,它们将立即反映对自己输入的任何更改,并减少 sim/synth 不匹配。