触发器实现与过程。 [VHDL]


绵绵
2025-03-13 08:11:04 (11天前)
  1. temp_siglt; = I;
  2. 万一;
  3. Qlt; = temp_sig;
  4. 结束过程;

end exam_arc;

似乎这段代码模拟了一个在上升时运行的D触发器

边缘
</跨度>
时钟,但 答案[这个问题来自考试]这个问题声称这个D触发器操作下降

边缘
</跨度>
时钟

这个VHDL代码模拟什么样的触发器?

6 条回复
  1. 0# 红蜻蜓 | 2019-08-31 10-32



    这是一个棘手的问题。注意,该过程在时钟上升沿和下降沿唤醒,并且在rising_edge上分配中间信号temp_sig。



    把它与信号分配的语义(推迟分配)放在一起,看看你得到了什么。



    吉姆建议通过模拟进行交叉检查……


  2. 1# 扬尘 | 2019-08-31 10-32



    将赋值分配到具有相同灵敏度列表的自己的流程语句中。尽管过程数量不同,但模拟模型的行为将是相同的。




    1. DUT:
      process (CLK,RESET)
      begin
      if RESET = 1 then
      temp_sig <=’0’;
      elsif CLKevent and CLK =’1 then
      temp_sig <= I;
      end if;
      Q <= temp_sig;
      end process;

    2. QDEVICE:
      process (CLK, RESET)
      begin
      Q <= temp_sig;
      end process;

    3. </code>


    分配temp_sig的边缘敏感存储设备显然是对CLK敏感的正边沿时钟触发器,并且由RESET(高)异步复位。



    QDEVICE流程是一个综合目标构造吗?它表现为temp_sig触发器的跟随器锁存器,但没有关于使能极性的指示。参见IEEE Std 1076.6-2004 IEEE标准VHDL寄存器
    传输级别(RTL)综合,6.2.1.1具有敏感性列表的进程的级别敏感存储:




    当满足以下所有条件时,应对信号(或变量)建模一个对电平敏感的存储元件:



    c)执行过程中没有执行显式操作
    赋值(通过赋值语句)到信号(或变量)。




    没有资格(按级别),则不符合规则c。此外,在原始过程中,您引用的行为未映射到IEEE Std 1076.6-2004 6.2时钟边缘规范之一,其中没有一个包括使用中间信号。



    布莱恩是对的,这是一个技巧问题。一个带有跟随者的触发器 - 其他东西提供延迟。并且在模拟q中的’U’值直到CLK或RESET上的事件应该说明。





  3. 2# 满目山河 | 2019-08-31 10-32



    你可以自己合成它。



    也可以看看

    ffv3


    http://www.cs.uregina.ca/Links/class-info/301/register/lecture.html

    几乎是一样的。




    更新
    </强>

    我被错过的格式missC所误导,实际上它实际上是在下降边缘切换,因为另一个答案已经显示。



    尽管所有的输入都按顺序完成,但信号分配仍然在过程结束时发生,因此

    temp_signal

    是半个时钟周期(下一个下降沿)并且不包含最近的赋值。




    http://www.gmvhdl.com/process.htm




    信号分配如何在一个过程中发挥作用?


  4. 3# 明天会更好 | 2019-08-31 10-32



    你有模拟吗? Q什么时候改变,为什么?信号什么时候更新?在上升沿期间,Q是否获得I的值?一定要模拟它。


  5. 4# 你瞎啊!撞我心了 | 2019-08-31 10-32



    让我们看看以下代码行:




    1. elsif CLKevent and CLK=’1 then

    2. </code>


    CLK是您的定时信号(也就是时钟)。



    当CLK的值发生变化时触发CLK’event。
    CLK =’1’表示时钟等于高。



    因此,如果时钟已更改且当前处于高状态,那么我们将在此ELSIF语句中执行代码。



    我们知道位变量只有2种状态,所以如果CLK改变并且它变为高状态则它最初处于低状态。这意味着代码仅在时钟从低到高时执行。



    如果您想在高到低的触发器上执行,那么您可以将语句更改为如下所示:




    1. elsif CLKevent and CLK=’0 then

    2. </code>

登录 后才能参与评论