VHDL:在未采用指定值的架构中定义的信号

时间:2016-03-08 09:33:07

标签: vhdl

我试图为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不相同?

1 个答案:

答案 0 :(得分:0)

S1可能(几乎可以肯定)获得与S相同的价值。

但是,由于过程敏感性列表中的错误,您不希望在S1上看到addOut的值。研究信号分配的语义(又称“推迟分配”)和增量循环,一切都将变得清晰。 (My usual explanation on this topic,如果你能原谅一些自我宣传的话)

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

最好的解决方法可能是将addOutcarryOut分配移到流程之外,它们会立即反映自己输入的任何变化,并降低sim / synth不匹配的可能性。< / p>