进程敏感列表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 与上一个 运行.

的效果

您的代码中还有其他问题,但与此无关。

  1. Internal_Carry 是一个锁存器,因为您没有为其分配任何默认值(如果 reset 不是 0 并且 Internal_Carry_enable 不是 1,它应该保持哪个值?) .

  2. 您可能需要看一下组合逻辑和时序逻辑之间的区别,因为您在加法器电路中写过时钟。如果添加一个时钟,则将值分配给信号将生成一个寄存器,而在其灵敏度列表中没有时钟的过程将是纯粹的组合。