同步复位就是指复位信号只有在时钟上升沿到来时,才能有效
module flip_flop
( input wire sys_clk,
input wire sys_rset_n,
input wire key_in,
output reg led_out
);
always@(posedge sys_clk )//上升沿,同步复位
if(sys_rset_n == 1'b0)
led_out<= 1'b0;
else
led_out<= key_in;
endmodule
仅在时钟信号的上升沿时刻 led_out=key_in 延迟一个单位
测试文件
`timescale 1ns/1ns
module tb_flip_flop();
reg sys_clk;
reg sys_rset_n;
reg key_in;
wire led_out;
initial
begin
sys_clk=1'b1;
sys_rset_n<=1'b0;
key_in=1'b0;
#20
sys_rset_n<=1'b1;
#210
sys_rset_n<=1'b0;
#40
sys_rset_n<=1'b1;
end
always #10 sys_clk=~sys_clk;
always #20 key_in<={$random}%2;
initial
begin
$timeformat(-9,0,"ns",6); //时间尺度10e-9ns,小数点后位数0, 打印的最小数字字符
$monitor("@time %t:key_in=%b led_out=%b ",$time,key_in,led_out);
end
flip_flop flip_flop_inst
(
.sys_clk(sys_clk),
.sys_rset_n(sys_rset_n),
.key_in(key_in),
.led_out(led_out)
);
endmodule
异步复位是指无论时钟沿是否到来,只要复位信号有效,就对系统进行复位。
module flip_flop
( input wire sys_clk,
input wire sys_rset_n,
input wire key_in,
output reg led_out
);
always@(posedge sys_clk or negedge sys_rset_n)//时钟上升沿或者复位信号的下降沿执行,异步复位
if(sys_rset_n == 1'b0)
led_out<= 1'b0;
else
led_out<= key_in;
endmodule
寄存器一次延迟
led_out 为key_in延迟一次,在复位信号有效时,上升沿到来,led_out=key_in,并延迟一个单位,在复位信号的下降沿,led_out=key_in,为低电平。
直到复位信号再次变为高电平后,等待时钟信号的上升沿时刻,led_out=key_in,延迟一个时间单位并保持。