【问题标题】:Flip flop implementation with process. [VHDL]触发器实现与过程。 [VHDL]
【发布时间】:2013-07-15 16:29:55
【问题描述】:

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

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 代码模拟了什么样的触发器?

【问题讨论】:

  • 正确的代码缩进可以预防眼癌——我听说..

标签: vhdl


【解决方案1】:

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

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

按照 Jim 的建议通过模拟进行交叉检查...

【讨论】:

  • 所以看起来信号分配是在过程结束时完成的,我做对了吗?谢谢!
【解决方案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 寄存器 Transfer Level (RTL) Synthesis,6.2.1.1 来自进程的级别敏感存储,带有敏感度列表:

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

c) 进程的执行不执行显式 给信号(或变量)赋值(通过赋值语句)。

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

Brian 是对的,这是一个诡计问题。带有跟随器的触发器 - 其他东西 - 提供延迟。并且在 CLK 或 RESET 上的事件之前,q 的模拟中的“U”值应该能说明问题。

【讨论】:

    【解决方案3】:

    你可以自己合成。

    另见ffv3http://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?

    【讨论】:

      【解决方案4】:

      你模拟过吗? Q什么时候改变,为什么?信号什么时候更新?在上升沿期间,Q 是否得到 I 的值?确保模拟它。

      【讨论】:

        【解决方案5】:

        让我们看看下面这行代码:

            elsif CLK'event and CLK='1' then
        

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

        CLK'事件在 CLK 值发生变化时触发。 CLK='1' 表示时钟等于高。

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

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

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

            elsif CLK'event and CLK='0' then
        

        【讨论】:

          猜你喜欢
          • 2023-04-02
          • 2013-09-12
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-09-08
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多