我的问题是关于以下代码:
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代码模拟了什么样的触发器?
答案 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上的事件应该说明。
答案 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