同步和异步时序电路
在了解同步复位和异步复位前,我们要首先了解同步时序电路和异步时序电路的概念。
同步时序电路,指的是电路中所有的触发器的时钟使用统一的clk,状态变化发生在同一个时刻。
异步时序电路,指的是电路中没有统一的clk,触发器的状态变化有先有后。
复位的用途
- 使电路在仿真时具有可知的初始值
- 电路运行异常时,能通过复位回到初始状态
同步复位
同步复位,指的是在同步时序逻辑电路中复位信号受统一的时钟控制。
以最简单的同步复位,上升沿触发的D触发器为例,
1.原理图
2.Verilog实现
moudle synchronous_reset(
input clk,
input a_in,
output reg b_out,
input rst_n);
always @(posedge clk) begin
if(!rst_n)
b_out <= 0;
else
b_out <= a_in;
endmodule
3.TB代码
module tb();
reg clk, rst_n;
reg a;
wire b;
initial begin
clk = 0;
rst_n = 1;
a = 1;
#20
rst_n = 0;
#100
rst_n = 1;
#140 rst_n = 0;
#70 rst_n = 1;
#200 $finish();
end
synchronous_reset DUT(.clk(clk), .rst_n(rst_n), .a_in(a), .b_out(b));
always #50 clk = ~clk;
//产生波形
initial begin
$fsdbDumpfile();
$fsdbDumpvars;
end
endmodule
4.波形
5.PS
- 在50ns,时钟的上升沿采样到rst_n为低时,完成复位;若此时未采样到rst_n = 0时,输出b_out应该为1。
- 在260ns-330ns(小于一个周期100ns),复位信号rst_n为0,但是此期间未被时钟上升沿采样到。所以复位最好至少维持一个时钟周期的低电平,这样才能确保被采样到。
- 若复位信号为短脉冲,可使其脉冲宽度扩展到多个周期,保证稳定采样。
异步复位
异步复位,指的是在异步时序逻辑电路中复位信号和触其他信号受不同时钟的控制。
以最简单的异步复位,上升沿触发的D触发器为例,
1.原理图
2.Verilog实现
moudle asynchronous_reset(
input clk,
input a_in,
output reg b_out;
input rst_n);
always @(posedge clk or negedge rst_n) begin
if(!rst_n)
b_out <= 0;
else
b_out <= a_in;
endmodule
2.PS
因为复位信号撤离时间不足,产生亚稳态,如下图
异步复位同步释放
避免亚稳态的一个常见方法异步复位同步释放,其实就是把复位信号打两拍,复位信号同步到clk时钟域。
1.原理图
2.Verilog实现
moudle asynchronous_reset(
input clk,
input a_in,
output reg b_out;
input rst_n);
reg rst_q1;
reg rst_q2
always @(posedge clk or negedge rst_n) begin
if(!rst_n)
rst_q1 <= 0
rst_q2 <= 0;
else
rst_q1 <= 1;
rst_q2 <= rst_q1;
end
assign b_out = rst_q2;
endmodule
参考