基于D触发器介绍复位设计思想。
同步复位,指的是同步复位信号就是复位信号只在所需时钟边沿到来时才有效,其他时刻则无效,一般复位信号持续时间大于一个时钟周期。
verilog代码实现:
module d_ff_1(
input clk_i,rst_n_i,D,
output Q_o
);
reg Q;
//module d_ff
always@(posedge clk_i) //only one sensitive clk signal to realize synchronize
begin
if (! rst_n_i)
Q <= 1'b0;
else
Q <= D;
end
assign Q_o = Q;
endmodule
测试代码testbench:
module tb_test(
);
reg clk_i, rst_n_i,D;
wire Q;
//模块例化
d_ff_1 u1(
.clk_i(clk_i),
.rst_n_i(rst_n_i),
.D(D),
.Q_o(Q)
);
//initial
initial begin
clk_i = 0;
rst_n_i =0;
D = 1;
#18
repeat(10)
#20 rst_n_i = ~ rst_n_i;
end
always #5 clk_i = ~clk_i;
endmodule
RTL电路图:
仿真结果:
可以看到在每个上升沿到来时,复位端信号置0时,输出Q都会复位置0。置位信号无效后(由0变为1),输出q只能在下一个时钟上升沿到来后,才能停止复位。
异步复位,即无论时钟边沿到来与否,只要复位信号有效输出就会被复位
verilog 代码实现:
always @ (posedge clk or negedge rst_n_i)
if (!rst_n_i)
Q <= 1'b0;
else
Q <= D;
RTL电路图:
仿真结果:
可以看到 异步复位信号只要有效(由1变为0),输出q立即复位。
由上表知道,同步复位中,时钟可以起到了过滤复位信号小毛刺的作用。然而,同步复位需要一个脉宽沿展器来保证复位信号有一定脉冲宽度,以确保时钟的有效沿能采样到。并且又要消耗更多的逻辑资源。而这些又可以采用异步复位解决,但是异步复位最严重的问题,如果异步复位信号在触发器时钟有效沿附近“释放”(复位信号从有效变为无效)的话,可能会导致触发器输出的亚稳态。
参考博客:https://blog.csdn.net/kobesdu/article/details/16356997