异步复位和同步复位
程序员文章站
2022-07-13 23:16:58
...
异步复位和同步复位
前言
本章解释一下同步复位和异步复位的区别,以及异步复位同步释放究竟好在哪里,需要怎么做一、同步复位
同步复位就是只有在时钟上升沿时,复位信号才有效
代码如下:
module sync_rst(
input clk,
input rstn,
input din,
output reg dout
);
always @(posedge clk)
begin
if(!rstn)
dout <= 0;
else
dout <= din;
end
endmodule
二、异步复位
只要复位信号有效就进行复位
代码如下:
module sync_rst(
input clk,
input rstn,
input din,
output reg dout
);
always @(posedge clk or negedge rstn)
begin
if(!rstn)
dout <= 0;
else
dout <= din;
end
endmodule
这里异步和同步复位在代码上的区别仅有always快内多了一个negedge rstn的信号触发
但是综合出来的电路却是完全不一样的
三、同步复位和异步复位的区别
- 同步复位综合后的电路会如下所示,其复位会放在DFF外面单独做一个逻辑,这样会耗费一定的资源,因为只会在始终有效沿复位,所以异步复位可能发生的毛刺和亚稳态在此不会发生
- 而异步复位可以直接用DFF的异步复位端口,其综合后的电路如下
四、 异步复位同步释放
结合同步电路可以滤除毛刺,防止亚稳态和异步电路可以节省资源的优点就设计了异步复位同步释放的电路。
代码如下:
module sync_rst(
input clk,
input rstn,
input din,
output reg dout
);
reg rstn_dly1;
reg rstn_dly2;
wire sys_rstn;
assign sys_rstn = rstn_dly2;
always @(posedge clk or negedge rstn)
begin
if(!rstn) begin
rstn_dly1 <= 0;
rstn_dly2 <= 0;
end
else begin
rstn_dly1 <= 1'b1;
rstn_dly2 <= rstn_dly1;
end
end
always @(posedge clk or negedge sys_rstn)
begin
if(!sys_rstn)
dout <= 0;
else
dout <= din;
end
endmodule
这里用到了避免亚稳态的同步器设计,对复位信号进行异步复位,并用同步器打两拍,这样复位信号只会在时钟有效沿才释放,并且避免了亚稳态,在这段代码中,对rstn做了异步复位同步释放,后续所有的电路只需要用sys_rstn作为复位信号即可。
上一篇: Python split() 分隔符
下一篇: 记一次macOS Mojave升级GCC