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 上有一个新值,但无法再次唤醒进程以将其传播到任何其他信号。
最好的解决方法可能是将 addOut
和 carryOut
赋值移动到流程之外,它们将立即反映对自己输入的任何更改,并减少 sim/synth 不匹配。
我正在尝试为 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 上有一个新值,但无法再次唤醒进程以将其传播到任何其他信号。
最好的解决方法可能是将 addOut
和 carryOut
赋值移动到流程之外,它们将立即反映对自己输入的任何更改,并减少 sim/synth 不匹配。