【问题标题】:Process sensitivity list vhdl进程敏感度列表 vhdl
【发布时间】:2023-03-23 14:11:02
【问题描述】:

我有以下问题:

我有一个由单个进程驱动的简单实体:

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 的最短时间。它有效,但它取决于项目中总是可以改变的东西。 还有其他方法可以激活此过程吗?

【问题讨论】:

  • 我看不到你的照片。这应该是组合逻辑还是顺序逻辑?如果它是组合的,那么您就有组合反馈。如果是连续的,时钟在哪里?请提交minimal reproducible example
  • 您的代码没有显示时钟,并且进程缺少灵敏度列表中的信号。等待时间是不可综合的。目标是什么?您的目标是 FPGA 吗?

标签: vhdl


【解决方案1】:

TL;DR: 将 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. 您可能需要了解组合逻辑和时序逻辑之间的区别,因为您曾写过关于加法器电路中的时钟的文章。如果您添加一个时钟,则为信号分配一个值将生成一个寄存器,而在其灵敏度列表中没有时钟的进程将是纯粹的组合。

【讨论】:

  • Internal_Carry_enable 也需要在敏感度列表中
  • @Tricky 你是对的,我将使用更新的信息编辑我的答案
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-08
  • 1970-01-01
相关资源
最近更新 更多