进程敏感列表vhdl
Process sensitivity list vhdl
我遇到以下问题:
我有一个由单个进程驱动的简单实体:
LIBRARY IEEE;
USE ieee.std_logic_1164.ALL;
USE ieee.std_logic_unsigned.ALL;
USE ieee.std_logic_arith.ALL;
entity somma_CDC is
Port
(
A : in std_logic;
B : in std_logic;
Reset : in std_logic;
Internal_Carry_enable : in std_logic;
S : out std_logic
);
end somma_CDC;
architecture Behavioral_somma_CDC of somma_CDC is
signal Internal_Carry: std_logic;
begin
somma_CDC:process (Reset,A,B)
begin
if Reset = '1'
then
Internal_Carry <= '0';
else
S <= A XOR B XOR Internal_Carry ;
if (Internal_Carry_enable = '1')
then
Internal_Carry <= (A AND B) OR (Internal_Carry AND A) OR (Internal_Carry AND B) ;
end if;
end if;
end process;
end architecture;
实际上,它与全加器非常相似。
理想情况下,框图应如下所示:
我的问题出现在第一个循环之后的循环中,我发现操作数的值相等。在这种情况下,进程不会激活,因此无法计算
A = 1,B = 1,Carry_In = 1。
我的系统中有一个时钟信号,但时钟比输入数据变化快。如果我把时钟放在灵敏度列表中,我会得到错误的结果,因为进位以错误的方式“传播”。
我尝试不使用敏感列表并等待“X”时间,“X”是更改操作数 A 和 B 的最短时间。它有效,但它取决于项目中始终可以更改的内容。
还有其他方法可以激活这个过程吗?
长话短说:
将 Internal_Carry 添加到您的敏感列表。
编辑:正如@Tricky 所指出的,Internal_Carry_enable 也应该在敏感列表中。
完整答案:
我认为这里的问题是您可能没有理解如何使用敏感度列表。您将它用作 C 语言,就像编程一样,其中过程将读取重置,A 和 B 作为输入。
但是在 vhdl 中,灵敏度列表中的每个信号都是一个触发器,必须更改其值才能再次重新运行该过程。
所以,这里的主要问题是信号Internal_Carry。由于它不在灵敏度列表中,因此信号 S 不会响应 Internal_Carry 在第一个 运行 之后更改为新值。您需要更改重置、A 或 B 才能看到 Internal_Carry 与上一个 运行.
的效果
您的代码中还有其他问题,但与此无关。
Internal_Carry 是一个锁存器,因为您没有为其分配任何默认值(如果 reset 不是 0 并且 Internal_Carry_enable 不是 1,它应该保持哪个值?) .
您可能需要看一下组合逻辑和时序逻辑之间的区别,因为您在加法器电路中写过时钟。如果添加一个时钟,则将值分配给信号将生成一个寄存器,而在其灵敏度列表中没有时钟的过程将是纯粹的组合。
我遇到以下问题:
我有一个由单个进程驱动的简单实体:
LIBRARY IEEE;
USE ieee.std_logic_1164.ALL;
USE ieee.std_logic_unsigned.ALL;
USE ieee.std_logic_arith.ALL;
entity somma_CDC is
Port
(
A : in std_logic;
B : in std_logic;
Reset : in std_logic;
Internal_Carry_enable : in std_logic;
S : out std_logic
);
end somma_CDC;
architecture Behavioral_somma_CDC of somma_CDC is
signal Internal_Carry: std_logic;
begin
somma_CDC:process (Reset,A,B)
begin
if Reset = '1'
then
Internal_Carry <= '0';
else
S <= A XOR B XOR Internal_Carry ;
if (Internal_Carry_enable = '1')
then
Internal_Carry <= (A AND B) OR (Internal_Carry AND A) OR (Internal_Carry AND B) ;
end if;
end if;
end process;
end architecture;
实际上,它与全加器非常相似。 理想情况下,框图应如下所示:
我的问题出现在第一个循环之后的循环中,我发现操作数的值相等。在这种情况下,进程不会激活,因此无法计算 A = 1,B = 1,Carry_In = 1。 我的系统中有一个时钟信号,但时钟比输入数据变化快。如果我把时钟放在灵敏度列表中,我会得到错误的结果,因为进位以错误的方式“传播”。 我尝试不使用敏感列表并等待“X”时间,“X”是更改操作数 A 和 B 的最短时间。它有效,但它取决于项目中始终可以更改的内容。 还有其他方法可以激活这个过程吗?
长话短说: 将 Internal_Carry 添加到您的敏感列表。
编辑:正如@Tricky 所指出的,Internal_Carry_enable 也应该在敏感列表中。
完整答案:
我认为这里的问题是您可能没有理解如何使用敏感度列表。您将它用作 C 语言,就像编程一样,其中过程将读取重置,A 和 B 作为输入。
但是在 vhdl 中,灵敏度列表中的每个信号都是一个触发器,必须更改其值才能再次重新运行该过程。
所以,这里的主要问题是信号Internal_Carry。由于它不在灵敏度列表中,因此信号 S 不会响应 Internal_Carry 在第一个 运行 之后更改为新值。您需要更改重置、A 或 B 才能看到 Internal_Carry 与上一个 运行.
的效果您的代码中还有其他问题,但与此无关。
Internal_Carry 是一个锁存器,因为您没有为其分配任何默认值(如果 reset 不是 0 并且 Internal_Carry_enable 不是 1,它应该保持哪个值?) .
您可能需要看一下组合逻辑和时序逻辑之间的区别,因为您在加法器电路中写过时钟。如果添加一个时钟,则将值分配给信号将生成一个寄存器,而在其灵敏度列表中没有时钟的过程将是纯粹的组合。