(1)同步复位:always@(posedge sys_clk)
只有在时钟上升沿到来时,复位信号才有效。
优点:只有在时钟上升沿判断是否复位,从而降低了亚稳态出现的概率;
缺点:需要消耗更多的器件资源。因为没有使用寄存器的清零端,是将sys_rst_n作 为输入逻辑的使能信号。
同步复位
always@(posedge sys_clk)//同步复位
if(!sys_rst_n)
q <= 1'b0 ;
else
q <= d ;
endmodule
(2)异步复位:always@(posedge sys_clk or negedge sys_rst_n)
无论时钟上升沿是否到来,只要复位信号有效,就对系统进行复位。
优点:无需消耗额外的资源;
缺点:增加了亚稳态出现的概率。
异步复位
always@(posedge sys_clk or negedge sys_rst_n)//异步复位
if(!sys_rst_n)
q <= 1'b0 ;
else
q <= d ;
endmodule
增加了亚稳态出现的概率
(3)异步复位,同步释放:
复位信号到来的时候不受时钟信号的同步,而是在时钟信号释放的时候受时钟同步。
优点:无需消耗额外的资源;
缺点:增加了亚稳态出现的概率。
问题:同步复位虽然解决了当时钟的有效沿来临的时候sys_rst_n的边沿也正好来临所出现的冒险与竞争。但是综合的电路上多了一个组合逻辑,如果设计中所有的复位都是这样的,那会增加很多的资源,导致芯片面积很大。那么有没有更好的解决办法呢?
答案是有,那就是异步复位同步释放机制。
异步复位,同步释放
module sys_rst3
(
input sys_clk ,
input sys_rst_n ,
output q
);
reg m;
reg d;
always@(posedge sys_clk or negedge sys_rst_n)//异步复位,同步释放
if(!sys_rst_n) begin
m <= 1'b0 ;
d <= 1'b0 ;//异步复位
end
else begin
m <= 1'b1 ;
d <= m ;//同步释放
end
assign q = d ;
endmodule