1

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

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

4

5 回答 5

5

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

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

正如吉姆建议的那样,通过模拟进行交叉检查......

于 2013-07-15T22:36:17.560 回答
2

你可以自己合成。

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

更新
我被丢失的格式误导了——事实上,正如另一个答案已经显示的那样,它实际上是在下降沿切换。

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

http://www.gmvhdl.com/process.htm
信号分配如何在进程中工作?

于 2013-07-15T16:41:35.780 回答
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 Standard for VHDL Register Transfer Level (RTL) Synthesis,6.2.1.1 Level-sensitive storage from process with sensitive list:

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

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

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

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

在此处输入图像描述

于 2013-07-16T05:02:35.860 回答
0

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

于 2013-07-15T16:42:23.100 回答
0

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

    elsif CLK'event and CLK='1' then

CLK 是您的定时信号(又名时钟)。

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

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

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

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

    elsif CLK'event and CLK='0' then
于 2015-11-14T00:26:06.837 回答