如何理解「复位 」?

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

同步复位

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时钟域也可以用的复位信号)。


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

为了避免单片机因为定时器溢出而自动复位(通常指的是硬件复位或系统重启),可以采取以下几个策略: 1. **设置适当的定时器预设值**:确保定时器的计数值不会超过其最大值(通常是内部寄存器所能表示的最大数值)。根据定时器的工作模式和中断频率,合理计算周期,并留出一定的余量。 2. **使用捕获/比较功能**:很多单片机提供了捕获/比较功能,可以通过将定时器设置为连续增计数模式,并用外部输入信号作为基准,在达到目标值之前被比较器捕捉,从而触发中断处理而不是直接复位。 3. **配置中断处理**:当定时器溢出时,启用中断并编写适当的中断服务子程序(ISR)。ISR里完成必要的任务后,清除溢出标志并继续执行,而不是让CPU进入低电平响应导致复位。 4. **软件重置机制**:如果可能,设计应用程序在发现定时器溢出后主动调用软复位或恢复操作,而不是依赖于硬件自动复位。 5. **错误检测和纠正**:在代码中检查定时器溢出的发生,并在发生时采取纠正措施,如暂停定时器直到问题解决,或者跳过已发生的计数以保持程序流程的连贯性。 6. **优化定时器的使用**:尽量减少对定时器的频繁重新初始化,这样可以减少溢出的可能性。 记住,每个单片机的特性不同,具体的策略可能会有所变化,但基本原理是一致的。重要的是理解设备文档并按照最佳实践操作。如果你遇到具体型号的单片机问题,可以告诉我,我可以提供更详细的指导。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值