2016-03-08 46 views
-1

我正在尝试为3输入简单加法器编写VHDL代码。当我键入下面的代码时,S得到正确的输出值,但S1得到零,因此add_out也会得到错误的值。VHDL:体系结构中定义的信号未取得分配的值

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

您需要提供更多信息,以便其他人可以尝试重现您的问题。你的for循环存在于一个进程中;敏感性列表将很重要。另外,要回答这个问题,需要通过创建实体,体系结构和测试平台来完成一些工作。为什么不为他们做呢? –

+2

您的代码仍然不是[最小,完整和可验证示例](http://stackoverflow.com/help/mcve)。循环语句是在子程序或进程语句中找到的顺序语句。因为你提到的实体让我们想象一下进程语句,第二个for循环所在的进程语句在其敏感列表中缺少S1。为你的mcve填写所有缺失的部分,并将S1加入敏感列表给出[正确答案](http://i.stack.imgur.com/Ug​​onR.png)。 – user1155120

+0

在测试平台中,我使用了A <=“1111”,B <=“1111”和C <='0' – ayerhs7

回答

0

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

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

具体来说,你有一个新的值,但没有办法唤醒过程再次传播到任何其他信号。

最好的解决办法可能是将addOutcarryOut分配移到流程之外,在那里他们会立即反映他们自己输入的任何变化,并减少sim/synth不匹配的可能性。

相关问题