【问题标题】:Output of D flip-flop not as expectedD触发器的输出不如预期
【发布时间】:2019-08-28 14:00:19
【问题描述】:

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

Verilog:

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

对应波形:

【问题讨论】:

    标签: verilog modelsim


    【解决方案1】:

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

    always @ (posedge clk or posedge reset)
    

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

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

    当您将negedge reset 添加到您的敏感度列表时,当您退出重置状态(在您的逻辑中为1 --&gt; 0)时,它确实会立即改变。 然而,这通常是不希望的。而是you should synchronize the deassertion of your reset to your clock signal。引用上述网站:

    大多数设计的建模方式都需要异步 重置断言和同步解除断言。大多数人的要求 这些天的设计是:

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

    【讨论】:

    • " i.stack.imgur.com/1BtDD.png " 但是在这张图片中,reset 的置低是用时钟为什么输出不去 1 尽管 clk 为 1 而 D 为 1
    • 啊,我最初错过了你问题中的图片!原因可能是您定义时钟信号的方式。请查看 Sutherland & Mills 的 Verilog and SystemVerilog Gotchas 中的 Gotcha 29。本章描述了由于非阻塞分配的时钟生成而可能出现的竞争条件。 (此外,通常您应该在一个完整的时钟周期内保存数据。)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-03-11
    • 1970-01-01
    • 1970-01-01
    • 2023-02-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多