首页 > 解决方案 > D触发器的输出不如预期

问题描述

它是异步重置。D触发器当我将复位从一更改为零时,它不会立即将输出从零提高到一。但是当我添加@always(posedge clk 或 posedge reset 或 negedge reset )时,它会立即改变

验证:

module dff_async_reset (
data   , // Data Input
clk    , // Clock Input
reset  , // Reset input
q        // Q output
);
//-----------Input Ports---------------
input data, clk, reset ; 

//-----------Output Ports---------------
output q;

//------------Internal Variables--------
reg q;

//-------------Code Starts Here---------
always @ ( posedge clk or posedge reset)
begin
if (reset) 
  q =0;
else 
  q <= data;
end

endmodule //End Of Module dff_async_reset

对应波形:

波浪

标签: verilogmodelsim

解决方案


它完全按照您的要求执行:模仿具有异步高电平有效复位的触发器。您的代码中的以下行

always @ (posedge clk or posedge reset)

clk说:“在进行过渡0 --> 1reset进行过渡时执行此程序块0 --> 1。” 换句话说,当reset进行转换时1 --> 0,这个 always 块将不会被评估。

您的值q只会在 的上升沿更新,clk如果您想设计触发器,这正是您想要的。

当您添加negedge reset到您的敏感度列表时,它确实会在您退出重置状态时立即更改(这1 --> 0在您的逻辑中)。然而,这通常是不希望的。相反,您应该将复位的取消断言与时钟信号同步。引用上述网站:

大多数设计的建模方式需要异步复位断言和同步解除断言。如今,大多数设计的要求是:

  • 当复位被断言时,它会传播到所有设计;无论时钟是否切换,都使它们进入重置状态;即断言应该是异步的
  • 当复位无效时,等待时钟沿,然后根据 FSM(有限状态机)将系统移动到下一个状态;即取消断言应该是同步的

推荐阅读