看了很多资料,都推荐“异步确立同步释放”的方式,代码如下:
assign outa = reg1;
assign outb = reg2;
assign rst_n = reg4;
always @ (posedge clk or negedge reset_n)
begin
if (!reset_n)
begin
reg3 <= 1'b0;
reg4 <= 1'b0;
end
else
begin
reg3 <= 1'b1;
reg4 <= reg3;
end
end
always @ (posedge clk or negedge rst_n)
begin
if (!rst_n)
begin
reg1 <= 1'b0;
reg2 <= 1'b0;
end
else
begin
reg1 <= dataa;
reg2 <= datab;
end
end
都说异步复位的主要缺点是:在复位信号释放(release)的时候容易出现问题。(具体就是说:倘若复位释放时恰恰在时钟有效沿附近,就很容易使寄存器输出出现亚稳态,从而导致亚稳态。)
可搞不明白:所谓的“异步确立同步释放”方式,上文第一个always模块不还是异步复位方式么?释放时(上文代码红字部分)还是会出现亚稳态的呀? |