zoukankan      html  css  js  c++  java
  • 【转载】异步复位,同步释放保证系统稳定

      系统的复位对于系统稳定工作至关重要,最佳的复位方式为:异步复位,同步释放。以下是转载博客,原文标题及链接如下:复位最佳方式:异步复位,同步释放 - frank_wff的专栏 - CSDN博客 https://blog.csdn.net/frank_wff/article/details/43226507

      最近在FPGA讨论群里放入一段代码让精英分析一下可行性,结果被鄙视了,并且引起了精英们的大讨论 ,总结一下:

    起因是我在一个工程中混杂使用同步复位,异步复位;

    异步:

     always @(posedge clk or negedge rst_n )

                  if(!rst_n)

     

    (优点:占用较少逻辑单元

    缺点:可能会产生竞争冒险)

    同步: always @(posege clk or posedge rst_n)

                    If(!rst_n)

     

    (优点:可以尽量点少竞争冒险的可能

     缺点:会占用更多的逻辑单元)

    Altera 最佳解决办法:异步复位,同步释放

    //异步复位 同步释放rtl视图

     

    原理:

      所谓异步复位和同步释放,是指复位信号是异步有效的,即复位的发生与clk无关。后半句“同步释放”是指复位信号的撤除(释放)则与clk相关,即同步的。

    下面说明一下如何实现异步复位和同步释放的。

    异步复位:显而易见,rst_async_n异步复位后,rst_sync_n将拉低,即实现异步复位。

     

    同步释放:这个是关键,看如何实现同步释放,即当复位信号rst_async_n撤除时,由于双缓冲电路的作用,rst_sync_n复位信号不会随着rst_async_n的撤除而撤除。

    假设rst_async_n撤除时发生在clk上升沿,如果不加此电路则可能发生亚稳态事件(在始终上升沿附近rst置1,这时候建立时间还不够长,数据可能还未打入寄存器,导致输出不确定)。但是加上此电路以后,假设第一级D触发器clk上升沿时rst_async_n正好撤除,则D触发器1输出高电平“1”,此时第二级触发器也会更新输出,但是输出值为前一级触发器次clk来之前时的Q1输出状态。显然Q1之前为低电平,顾第二级触发器输出保持复位低电平,直到下一个clk来之后,才随着变为高电平。即同步释放。

    代码实现:(Altera 官方资料)

    module reset_best(clk,asyn_reset,syn_reset);
    input clk;
    input asyn_reset;
    output syn_reset;


    reg rst_s1;
    reg rst_s2;


    always @( posedge clk ,posedge  asyn_reset)
    begin
    if(asyn_reset)
     begin
     rst_s1<=1'b0;
     rst_s2<=1'b0;
     end
    else 
    begin
    rst_s1<=1'b1;
    rst_s2<=rst_s1;
    end
    end


    assign syn_reset=rst_s2;


    endmodule
    ---------------------
    作者:爬行的娲牛

  • 相关阅读:
    tcp为什么要三次握手
    TCP/IP协议(一)网络基础知识
    拜占庭将军问题深入探讨
    Block Manager
    Standalone 集群部署
    Spark内存管理
    Checkpoint & cache & persist
    Python——在Python中如何使用Linux的epoll
    网络编程——C10K简述
    网络编程——The C10K Problem(C10K = connection 10 kilo 问题)。k 表示 kilo,即 1000
  • 原文地址:https://www.cnblogs.com/moluoqishi/p/9875845.html
Copyright © 2011-2022 走看看