首页->【CrazyBingo教你玩FPGA】

3552 0

对于异步复位、同步释放这个说法,早已看过,但并未仔细深究,最近在拜读CB大作时又看到这个词,仔细回想了一下,发现已经没有什么印象了。于是决定重新研究一番,并记录下来。

想理解这个机制,首先得明白D触发器的一个特性“复位恢复时间”。


对于FPGA内部的D触发器来说,它的复位释放和下一个时钟上升沿之间必须留有一定的时间,这个时间就是复位恢复时间。上图所示的就是复位恢复时间满足的情况,如果不满足,即复位时间冲突,在时钟上升沿到来时,输出端的数据则会变的不稳定,也就是出现亚稳态。(其实说到底,这个复位恢复时间也就是为了满足D触发器的建立时间。)

知道了复位恢复时间,接下来要做的就是在设计中避免出现复位恢复时间冲突的情况。通常我们使用复位信号有这几种方式:

(1)       异步复位方式


module system_ctrl(
             input   clk         ,
             input   reset_l     ,
             input   a           ,
             output  reg   b 
        );

always @ (posedge clk or negedge reset_l)
begin
         if(!reset_l)begin
             b <= 1'b0 ;
         end
         else begin
             b <= a ;
         end
end
endmodule



这样的设计,复位的释放何时到来根本无法控制,因此无法满足复位恢复时间。可能会出现亚稳态。

(2)       同步复位方式

 

 module system_ctr (

          input   clk        ,
          input   reset_l    ,
          output  reg   reset_out 
                 );

reg   reset_d   ;
always @ (posedge clk )
begin
    reset_d <= reset_l     ;
    reset_out<= reset_d    ;
end
endmodule




reset_out信号是已经同步过的复位信号,可以直接在其它模块使用。需要注意的是,这个复位信号会延迟几个时钟周期。并且,复位信号必须要大于时钟周期,才能被系统检测到。

(3)       异步复位,同步释放

module test(
     input   clk          ,
     input   reset_l      ,
     output  reg   reset_out 
          );

reg   reset_d   ;
always @ (posedge clk or negedge reset_l)
begin
         if(!reset_l)begin
            reset_out  <= 1'b0  ;
            reset_d    <= 1'b0  ;
         end
         else begin
             reset_d   <= 1'b1      ;
             reset_out <= reset_d   ;
         end
end
endmodule



这个电路图就是理解异步复位、同步释放的关键了。这里的复位信号直接接到D触发器的异步清零端,也就不存在同步复位中复位信号必须要大于时钟周期才能被检测到的局限。这就是异步复位的意思。同时,reset_out变为高电平是受时钟控制的,也就是所说的同步释放。同步释放避免了异步复位可能产生的不满足复位恢复时间的情况。综上所述,异步复位同步释放机制解决了异步复位和同步复位固有的缺陷,因此将这种方法作为系统复位是极好的选择。

楼主可见