同步复位和异步复位

来源:互联网 发布:弱电算量软件 编辑:程序博客网 时间:2024/06/11 21:57

        复位信号一般对寄存器清0处理。同步复位表示只有在时钟沿到来才对寄存器复位,异步复位表示复位与时钟无关,只要满足条件,即进行复位。设计中主要区别在于敏感信号列表。

        同步复位的信号列表如下:

        always @(posedge clk )

             begin

                 if(!rst_n)

                      begin

                           xxxxx <= 'b0;

                      end

                  else

                      begin

                           .......

                       end

             end

        综合后的电路如下:


        异步复位的信号列表如下:

        always @(posedge clk or negedge rst_n)

             begin

                 if(!rst_n)

                      begin

                           xxxxx <= 'b0;

                      end

                  else

                      begin

                           .......

                       end

             end

            综合后的电路


         D触发器(寄存器)本身是异步复位的,所以异步复位比同步复位逻辑少。一方面节省资源,一方面时序比较好(减少了组合逻辑的时间开销)。

         异步复位的设计可以很方便的使用FPGA的全局复位端口GSR。

        异步复位最大的缺点就是容易出现毛刺,并且在复位信号释放的时候(有效变为无效时),容易使寄存器进入亚稳态。

         同步reset信号可以消除毛刺(需要保证信号在一个周期以上才能复位成功),并且不会进入亚稳态。然而,它复位逻辑多,很耗费资源(设计中经常有大量的寄存器,每个都需要额外逻辑)。

 

综上:我们可以再rst信号进入系统之前进行同步,然后对系统中每个寄存器使用异步复位的设计:即异步复位,同步release的思想。

下面是经典的同步方法(同步release)reset sychronizerVerilog代码:

         module Reset_Synchronizer

         (output reg rst_n, input clk, asyncrst_n);

              reg rff1;

              always @ (posedge clk , negedge asyncrst_n)

                  begin

                      if (!asyncrst_n) {rst_n,rff1} <= 2'b0;

                     else {rst_n,rff1} <= {rff1,1'b1};

                   end

          endmodule

深化:多时钟系统中的复位

稍大型的系统中,多个同源(或者非同源)时钟信号驱动不同的部分(之间控制的寄存器通信需要做跨时钟域处理的哦)。

non-coordinated reset removal:同一个系统中的多个同源时钟域的复位信号,由彼此独立的reset synchronizer驱动。当异步复位信号有效时,各时钟域同时复位,但是复位释放的时间由各自的驱动时钟决定,也是就说:时钟快的先释放,时钟慢的后释放,但是各复位信号之间没有先后关系。

sequence coordinated reset removal:这是相对于上述方式来说的,也就是说各时钟域的复位信号彼此相关,各个部分系统虽然也同时复位,但是却分级释放。而分级的顺序可由各个reset synchronizer的级联方式决定。可以先复位前级,再复位后级,也可以反过来,方式很灵活,需要根据实际需要而定。

 

 

 

 

 

 

原创粉丝点击