触发器flip_flop
实验框图与波形图
触发器
对时钟脉冲边沿敏感的状态更新称为触发,具有触发工作特性的储存单元称为触发器。
在实际的数字系统中往往包含大量的存储单元,并且经常要求他们在同一时刻同步动作,为达到这个目的,在每个存储单元电路上引入一个时钟脉冲(CLK)作为控制信号,只有当CLK到来时电路才被“触发”而发生动作,并根据输入信号改变输出状态。把这种在时间信号触发时才能动作的储存单元电路称为触发器,以区别没有时钟信号控制的锁存器。
同步复位和异步复位
同步复位就是指复位信号只有在时钟上升沿到来时才有效。
异步复位是指无论时钟沿是否到来,只要复位信号有效,就对系统进行复位。
同步复位的优缺点:
优点: 一般能够确保电路是百分之百同步的;确保复位只发生在有效时钟沿,可以作为过滤掉毛刺的手段。
缺点:复位信号的有效时长必须大于时钟周期,也能真正被系统识别并完成复位。同时需要考虑如:时钟偏移、组合逻辑路径延时、复位延时等因素。
异步复位的优缺点:
优点:异步复位信号识别方便,并且可以很方便的使用全局复位;由于大多数厂商目标库内的触发器都有异步复位端口,可以节约逻辑资源。
缺点:复位信号容易受到毛刺的影响;复位结束时刻恰在亚稳态窗口内时,无法决定现在的复位状态是1还是0,会导致亚稳态。
异步复位同步释放
异步复位,同步释放:就是在复位信号到来的时候不受时钟信号的同步,而是在复位信号释放的时候受到时钟信号的同步。
使用异步复位同步释放可以消除以上缺点。具体实现过程这里暂不涉及。
实验代码
module flip_flop
(
input wire sys_clk,//50MHZ
input wire sys_rst_n,
input wire key_in,
output reg led_out
);
always@(posedge sys_clk or negedge sys_rst_n)//异步复位,or后注释起就是同步复位
if(sys_rst_n==1'b0)
led_out<=1'b0;
else
led_out<=key_in;
endmodule
仿真代码
`timescale 1ns/1ns
module tb_flip_flop();
reg sys_clk;
reg sys_rst_n;
reg key_in;
wire led_out;
initial
begin
sys_clk=1'b1;
sys_rst_n<=1'b0;
key_in<=1'b0;
#20
sys_rst_n<=1'b1;
#210
sys_rst_n<=1'b0;
#40
sys_rst_n<=1'b1;
end
always #10 sys_clk=~sys_clk;
always #20 key_in<={$random}%2;
initial
begin
$timeformat(-9,0,"ns",6);
$monitor("@time %t:key_in=%b,led_out=%b",$time,key_in,led_out);
end
flip_flop flip_flop_inst
(
.sys_clk(sys_clk),//50MHZ
.sys_rst_n(sys_rst_n),
.key_in(key_in),
.led_out(led_out)
);
endmodule