本文引用经典书籍《数字IC设计入门》(作者:白栎旸)中2.25节有关异步复位,同步释放的内容,博主重新总结并作记录。
异步复位与同步释放的概念
异步复位:寄存器随时可以复位。
同步释放:寄存器的复位信号从复位态回到释放状态的时机,必须与该寄存器的时钟信号保持同步。
原因
为什么不要求复位同步?
(同步的目的是避免亚稳态,难道不怕发生亚稳态时,寄存器的值不是期望的复位值?)
答案:寄存器的reset_n端为低电平时,触发器的复位晶体管一定会被触发,输出端一定会因为CMOS的强驱动置为期望的复位值,总之,寄存器的复位是通过晶体管级别的强制操作完成的,无论何时拉低reset_n都会准确进入复位状态。
为什么要求同步释放?
答案:因为若复位信号释放后出现亚稳态,寄存器的值就进入了不确定的值(正常的亚稳态现象),而且一旦发生就无法纠正。
同步释放时序要求
关注两点:
①复位信号低电平的脉宽。——Recovery检查
②解复位信号与时钟的关系。——Removel检查
参数Recovery和Removel分别规定了解复位信号传输延迟的上限和下限。

RTL
POC(Power of reset)信号是数字电路上电时,给出的复位信号,低电平有效。
为使其在clk时钟域下满足同步释放要求的处理模块如下,该模块不仅输出满足同步释放的复位信号,同时延迟了输出信号,使电压和时钟进一步稳定。
/*
synchrnize and delay POR(Power on reset) in clk domain for synchronous release reset.
*/
module reset_n_sync
(
input clk ,
input POR ,
output reg reset_n
);
//-------------------------------------------------------------
reg [1:0] rstn_sync ;
wire rstn_pre ;
reg [15:0] por_cnt ;
//-------------------------------------------------------------
always @(posedge clk or negedge POR)
begin
if(!POR)
rstn_sync <= 2'b00;
else
rstn_sync <= {rstn_sync[0],1'b1};
end
// rstn_sync meets the requirment of synchronous release
assign rstn_pre = rstn_sync[1];
// delay the reset before synchronous release
always @(posedge clk or negedge rstn_pre)
begin
if(!rstn_pre)
por_cnt <= {16{1'b0}};
else if(por_cnt != 16'hffff)
por_cnt <= por_cnt + 16'd1;
end
// reset_n
always @(posedge clk or negedge rstn_pre)
begin
if(!rstn_pre)
reset_n <= 1'b0;
else if(por_cnt == 16'hffff)
reset_n <= 1'b1;
else
reset_n <= 1'b0;
end
endmodule

4万+

被折叠的 条评论
为什么被折叠?



