`timescale 1ns /1ps
module Dff_tb();
reg clk ;
reg rst;
wire q;
Dff u1(.clk(clk),.rst(rst),.q(q));
always #5 clk = !clk;
initial
begin
clk = 0;
rst = 1;
#7
rst = 0;
#5
rst = 1;
#30
$stop;
end
endmodule
假如一个DFF的复位值是0,那么rst_n=0的信号到来时,该DFF进行复位,当rst_n=1的信号到来时,该DFF正常工作。
问题:当rst_n的信号重新回到1的时间和clk上升沿到来的信号非常接近的时候,DFF可能会输出亚稳态,造成信号无法识别是1还是0
目的:在这个rst=0时不处理,在rst=1时,延迟两个clk上升沿后才rstout置1.(使用非阻塞赋值方法,在块结束后才进行赋值)如:相当于两个q触发器
always @( posedge clk )
begin
b<=a;
c<=b;
end
module Dff(clk,rst,q);
input clk,rst;
output reg q;
reg q_r;
always@(posedge clk or negedge rst)begin
if(!rst)begin
q_r<=0;
q<=0;
end
else begin
q_r<=rst;
q<=q_r;
end
end
endmodule