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

时间:2013-07-15 16:29:56

标签: vhdl

我的问题是关于以下代码:

library ieee;
use ieee.std_logic_1164.all;

entity exam is port (
    I,CLK,RESET : in std_logic;
    Q : out std_logic
);
end entity;

architecture exam_arc of exam is
    signal temp_sig : std_logic;
begin
    process (CLK,RESET)
    begin
        if RESET = '1' then
            temp_sig <='0';
        elsif CLK'event and CLK='1' then
            temp_sig <= I;
        end if;
        Q <= temp_sig;
    end process;
end exam_arc;

似乎这段代码模拟了一个在时钟上升沿运行的D触发器,但是这个问题的答案是[这个问题是从考试中得到的]这个问题声称这个D触发器工作在下降沿时钟。

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

5 个答案:

答案 0 :(得分:5)

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

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

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

答案 1 :(得分:2)

你可以自己合成它。

另见ffv3 http://www.cs.uregina.ca/Links/class-info/301/register/lecture.html几乎相同。

<强>更新
我被错过的格式错过了 - 实际上它实际上是在另一个答案已经显示的下降边缘切换。

尽管所有符号都按顺序完成,但信号分配仍然在过程结束时发生,因此temp_signal是半个时钟周期(下一个下降沿)并且不包含最近的符号值。

http://www.gmvhdl.com/process.htm
How does signal assignment work in a process?

答案 2 :(得分:2)

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

DUT:
    process (CLK,RESET)
    begin
        if RESET = '1' then
            temp_sig <='0';
        elsif CLK'event and CLK ='1' then
            temp_sig <= I;
        end if;
--        Q <= temp_sig;
    end process;

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

分配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上的事件应该说明。

enter image description here

答案 3 :(得分:0)

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

答案 4 :(得分:0)

让我们看看以下代码行:

    elsif CLK'event and CLK='1' then

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

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

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

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

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

    elsif CLK'event and CLK='0' then