芯片设计中需要复位操作使电路进入稳定状态。复位操作分为同步复位和异步复位。
同步复位
同步复位指在时钟上升沿时复位信号才起作用,复位时需要时钟。
always @(posedge clk) begin
if(!rst_n)
dout <= 0;
else
dout <= din;
end
如上,当rst_n为0时,只有clk上升沿时,dout才为0,dout被同步复位。
同步复位优点:
1.电路都是同步复位;
2.可以过滤毛刺。
同步复位缺点:
1.复位信号的有效时间必须大于时钟周期,才能完成复位。
2.由于厂商目标库中只有异步复位端口,采用同步复位的话,会增加逻辑资源。
3.后端处理时需要区分复位信号和条件清零信号。
异步复位
异步复位不需要时钟沿,只要复位信号有效,就可以进行复位。
always @(posedge clk or negedge rst_n) begin
if(!rst_n)
dout <= 0;
else
dout <= din;
end
如上RTL,rst_n信号放在敏感列表中。
异步复位优点:
1.异步复位方便识别,而且可以很方便实现全局复位。
2.厂商目标库内的触发器都有异步复位信号端口,可以节省逻辑资源。
异步复位缺点:
1.容易受到毛刺影响。
2.如果异步信号的撤离时刻恰好在亚稳态窗口内,会导致亚稳态。
异步复位同步释放
使用异步复位同步释放可以消除异步复位毛刺和亚稳态问题。实现的方法为,把是实际使用的异步复位信号用目标时钟做异步复位操作,然后用新的生成的复位信号做数据的复位信号。
reg reset_n_1d;
reg reset_n_2d;
reg reset_n_3d;
wire rst_n;
always @(posedge clk or negedge reset_n) begin
if(!reset_n)
reset_n_1d <= 1'b0;
reset_n_2d <= 1'b0;
reset_n_3d <= 1'b0;
else
reset_n_1d <= 1'b1;
reset_n_2d <= reset_n_1d;
reset_n_3d <= reset_n_2d;
end
assign rst_n = reset_n_3d;
always @(posedge clk or negedge rst_n) begin
if(!rst_n)
dout <= 0;
else
dout <= din;
end