如何理解「复位 」?

  • 复位目的:使整个系统进入一个指定的初始状态

同步复位

always  @(posedge clk)
begin
  if(!rst_n)    
    ......
  else
    ......   
end

优点:

  1. 可使整个电路为完全的同步设计,有利于静态时序分析(STA)。
  2. 有利于仿真工具仿真(Modelsim、Vcs)。
  3. 只在时钟触发沿发生发生作用,滤除毛刺。

缺点以及注意事项:

  1. 复位脉宽必须超过一个时钟周期。
  2. 复位依赖于时钟信号。
  3. 若复位信号发生在时钟沿,可能产生亚稳态。
  4. 对于同步复位信号管脚在数据通路中或者是没有专用的同步复位管脚的器件,同步复位将耗费更多资源实现。

异步复位

always  @(posedge clk or negedge rst_n)
begin
  if(!rst_n)
    ......
  else
    ......
end

优点:

  1. 复位不会出现在数据通路,减少额外逻辑以及数据延迟
  2. 复位不依赖于时钟信号

缺点及注意事项:

  1. 对毛刺敏感
  2. 若在始终触发沿附近去除复位,可能产生亚稳态

复位策略

  1. 异步低复位
  2. 同步的异步复位。即异步复位,同步释放。
  3. 能不用复位的地方尽量不用。
  4. 对于RAM、ROM、乘法器、数据计算通路,不需要复位,同时也节省资源。
  5. 移位寄存器,若不复位,则可充分进行资源优化。
  6. 对于控制信号、计数器、状态机的状态寄存器等必须要用复位。

异步复位HDL代码:

module  arsr           //Asynchronous reset, synchronous release

  (
//        input              i_clk_a    ,
        input              i_rst_n_a  ,
        input              i_clk_b    ,

        output  reg        o_rst_n_b  
  )
//-----------------------------  reg && wire   -------------------------------

        reg        rst_n_temp_0  ;
        reg        rst_n_temp_1  ;

//--------------------------------  o_rst_b_n   -----------------------------------

        always  @(posedge i_clk_b or negedge i_rst_n_a)
        begin
            if(!i_rst_n_a)
            begin
                    rst_n_temp_0 <= 1'b0;
                    rst_n_temp_1 <= 1'b0;
                    o_rst_n_b    <= 1'b0;
            end
            else
            begin
                    rst_n_temp_0 <= 1'b1;
                    rst_n_temp_1 <= rst_n_temp_0;
                    o_rst_n_b    <= rst_n_temp_1;            
            end
        end

endmodule

如代码那样,即可将在(A时钟域的复位信号)变成(B时钟域也可以用的复位信号)。


有问题联系可以我,一起讨论。
在这里插入图片描述

原文地址:https://www.cnblogs.com/mage0306/p/10595332.html