zoukankan      html  css  js  c++  java
  • FPGA设计中的复位

    (1)异步复位与同步复位的写法
      1.异步复位与同步复位的区别?
        同步复位:若复位信号在时钟有效边沿到来时刻为有效,则执行一次复位操作。
          优点: 1)同步复位是离散的,所以非常有利于仿真器的仿真;
              2)同步复位只有在时钟有效边缘到来时才有效,所以可以滤除高于时钟频率的毛刺,提高复位的可靠性;
              3)使用同步复位的系统可以被设计成为纯粹的同步时序逻辑,这样会有利于FPGA项目开发流程中的时序约
                束和时序分析环节的工作,而且综合出来的FPGA设计的性能以便也会较高。
          缺点: 1)必须保证复位信号有效持续时间长度大于一个时钟周期,否则复位信号会被当做毛刺滤除;
              2)同步复位与时钟的相关性很大,所以设计和实现时必须要考虑到各种延迟核时间参数,确保能够被FPGA设计正确接收并做出相应动作;
              3)大多数寄存器都只有异步复位端口,所以采用同步复位,编译器势必会在寄存器的数据输入端口添加额外的组合逻辑,消耗较多的逻辑资源。
        异步复位:只要复位信号有效,就执行复位操作。
          优点:  1)大多数寄存器只有异步复位端口,采用异步复位可以节省资源;
               2)不考虑复位信号与时钟之间的关系,设计简单;
          缺点:  1)在异步复位信号释放的时候非常容易出现问题,第一,当异步复位信号释放的时刻和时钟有效沿比较接近时,就很容易导致寄存器的输出出现亚稳态;
                第二,由于复位信号多管辖的寄存器非常多,而寄存器又位于FPGA芯片的不同地方,因此复位信号到达各个寄存器的路径延迟参差不齐,从而导致逻辑功能出现混乱;
               2)异步复位信号非常容易受到毛刺等干扰。

    复位设计中主要可分为4种:同步信号同步复位、同步信号异步复位、异步信号同步复位、异步信号异步复位。
      同步信号同步复位:
        always @(posedge sclk)
        begin
          if(rst_n == 1'b0)begin
            <statement1>
          end
          else begin
            <statement2>
          end
        end
      同步信号异步复位:
        always @(posedge sclk or negedge rst_n)
        begin
          if(rst_n == 1'b0)begin
            <statement1>
          end
          else begin
            <statement2>
          end
        end
      异步信号同步复位:
        always @(posedge sclk)
        begin
          tmp <= arst_n;
          rst_n <= tmp;
        end
        always @(posedge sclk)
        begin
          if(rst_n == 1'b0)begin
            <statement1>
          end
          else begin
            <statement2>
          end
        end
      异步信号异步复位:
        always @(posedge sclk)
        begin
          tmp <= arst_n;
          rst_n <= tmp;
        end
        always @(posedge sclk or negedge rst_n)
        begin
          if(rst_n == 1'b0)begin
            <statement1>
          end
          else begin
            <statement2>
          end
        end
    2.复位信号高扇出问题如何解决?
        扇出(fan-out):指信号或者模块直接驱动的下级模块的个数。
        复位信号的扇出问题通常通过寄存器复制的方法解决。只要让复位信号在FPGA中被一个R寄存器
      驱动,至于需要创建多少个类R寄存器以及它们该分布在什么位置,怎样布局,都由编译器安排。
        同步信号作为复位信号,添加:
        always @(posedge sclk)
        begin
          rst_n <= arst_n;
        end
        这样rst_n就成为R寄存器。

        异步信号作为复位信号,那么需要修改异步信号同步化的那部分代码,将原有的二级采样扩展为三级采样:
        always @(posedge sclk)
        begin
          tmp0 <= arst_n;
          tmp1 <= tmp0;
          rst_n <= tmp1;
        end
        这样tmp0与tmp1两级采样,保证跨时钟域传输的正确性,rst_n为R寄存器。

    3.工程设计中全局复位与局部复位信号如何设计?
      全局复位:当复位信号有效时,整个FPGA芯片会被重置为一个预先设定好的处世状态。
      局部复位:当复位信号有效时,FPGA中某个功能块被重置。
      在工程中,采用两级复位体系:
      整个FPGA芯片必须有一个全局复位信号,如果FPGA设计包含不止一个时钟域,该全局复位信号经过不同的时钟域同步化后,
    转化为每个时钟域的全域复位信号,与此同时,根据实际情况将每个时钟域划分为若干个局部子域,并为每个子域提供一个局
    部复位信号,其中,全局复位信号或全域复位信号采用异步复位的方式,各个局部复位信号采用同步复位方式。

    4.工程设计中,“异步复位,同步释放”如何实现?
     reg tmp0,tmp1;
    always @(posedge sclk or negedge rst_n)
    begin
      if(rst_n == 1'b0)begin
        tmp0 <= 1'b0;
      end
      else begin
        tmp0 <= 1'b1;
      end
    end
    always @(posedge sclk or negedge rst_n)
    begin
      if(rst_n == 1'b0)begin
        tmp1 <= 1'b0;
      end
      else begin
        tmp1 <= tmp0;
      end
    end

    ----摘自《FPGA之道》

  • 相关阅读:
    运算符
    JS的基本概念和数据类型
    开源基于Canal的开源增量数据订阅&消费中间件
    用AntDeploy如何更新Agent
    AntDeploy发布前端项目到IIS(脱离vs单独使用)
    截图上传录屏gif上传工具推荐
    netcore开发windows普通服务(非Web)并一键发布到服务器
    一键发布部署vs插件[AntDeploy]开源了
    基于python的Elasticsearch索引的建立和数据的上传
    浅谈闭包
  • 原文地址:https://www.cnblogs.com/MAQI/p/9147040.html
Copyright © 2011-2022 走看看