(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之道》

FPGA设计中的复位的更多相关文章

  1. 影响FPGA设计中时钟因素的探讨。。。转

    http://www.fpga.com.cn/advance/skill/speed.htm http://www.fpga.com.cn/advance/skill/design_skill3.ht ...

  2. FPGA设计中遇到的奇葩问题之“芯片也要看出身”

    FPGA设计中遇到的奇葩问题之“芯片也要看出身”(一) 昨夜西风凋碧树.独上高楼,望尽天涯路 2000年的时候,做设计基本都是使用Xilinx公司的Virtex和Virtex-E系列芯片.那时候Alt ...

  3. FPGA设计中的异步复位、同步释放思想

    1.一个简单的异步复位例子: module test( input clk, input rst_n, input data_in, output reg out ); always@(posedge ...

  4. 5.防止FPGA设计中综合后的信号被优化

    随着FPGA设计复杂程度越来越高,芯片内部逻辑分析功能显得越来越重要.硬件层次上的逻辑分析仪价格十分昂贵,而且操作比较复杂.目前,FPGA芯片的两大供应商都为自己的FPGA芯片提供了软件层面上的逻辑分 ...

  5. FPGA设计中的float

    在通常的设计中,不建议使用浮点数计算,因为浮点数计算会消耗FPGA大量的逻辑单元.但很多情况下,又需要使用浮点数进行计算提高精度. 所以需要有合适的方法计算浮点运算. 正常情况下FPGA只能以整形数据 ...

  6. FPGA设计中的电源管理(转载)

    过去,FPGA设计者主要关心时序和面积使用率问题.但随着FPGA不断取代ASSP和ASIC器件,设计者们现正期望能够开发低功耗设计,在设计流程早期就能对功耗进行正确估算,以及管理和对与FPGA相关的各 ...

  7. FPGA异步时钟设计中的同步策略

    1 引言    基于FPGA的数字系统设计中大都推荐采用同步时序的设计,也就是单时钟系统.但是实际的工程中,纯粹单时钟系统设计的情况很少,特别是设计模块与外围芯片的通信中,跨时钟域的情况经常不可避免. ...

  8. FPGA设计思想与技巧(转载)

    题记:这个笔记不是特权同学自己整理的,特权同学只是对这个笔记做了一下完善,也忘了是从那DOWNLOAD来的,首先对整理者表示感谢.这些知识点确实都很实用,这些设计思想或者也可以说是经验吧,是很值得每一 ...

  9. Verilog设计中的锁存器

    问题: 什么是锁存器? 什么时候出现锁存器? 锁存器对电路有什么影响? 如何在FPGA设计中避免锁存器? 在FPGA设计中应该避免锁存器.实际上,锁存器与D触发器实现的逻辑功能基本相同,都有暂存数据的 ...

随机推荐

  1. python 画广东省等压线图

    最近开发时要实现一个业务逻辑: 调用中国气象数据网API接口获取广东省实时气象数据 根据数据,基于广东省地图渲染等压线图 最终效果图是这样的: 首先是获取实时气压数据,由于中国气象数据网每次只能获得3 ...

  2. _spellmod_aura_pct_on_stat

    为玩家添加属性转换光环 `comment` 备注 `aura`光环ID `auraType1` 选择添加('治疗效果','法术强度','近战攻击强度','远程攻击强度','空')  `statType ...

  3. MySQL:(一)

    数据库概述 什么是数据库 数据库是一个文件系统.通过标准SQL语言操作文件系统中数据——用来存放软件系统的数据! SQL:Structured Query Language 结构查询语言 常用数据库简 ...

  4. 分布式拒绝服务攻击(DDoS:Distributed Denial of Service)

    DDoS攻击通过大量合法的请求占用大量网络资源,以达到瘫痪网络的目的. 指借助于客户/服务器技术,将多个计算机联合起来作为攻击平台,对一个或多个目标发动DDoS攻击,从而成倍地提高拒绝服务攻击的威力. ...

  5. c++ 线程间通信方式

    一:两个进程间的两个线程通信,相当于进程间通信 二:一个进程中的两个线程间通信 通信方式: 1.互斥锁 mutex; lock_guard (在构造函数里加锁,在析构函数里解锁) unique_loc ...

  6. Asp.net core 学习笔记 Razor Page

    更新 2019-04-27 最近做了更多的 research 发现微软视乎有意发展 razor page. razor page 的定位是 mvvm, 现在还有个叫 blazor 的东西, 类似用 c ...

  7. jmeter的安装和配置

    jmeter环境配置 Java 8 安装 正常安装,一路默认就好,记住安装路径,配置环境变量时用得到.默认安装路径:C:\Program Files\Java\jdk1.8.0_91. 安装好之后会有 ...

  8. Adb工具的简单使用

    Adb全称为Android Debug Bridge adb就是连接android手机与PC机的桥梁,可以在pc端对手机进行全面的操作 借助adb工具,可以管理设备或者手机模拟器的状态,进行手机操作, ...

  9. SQL查询【根据生日计算】

    根据生日日期,获取当前年龄.年龄单位. Select Case when DateDiff(Year, BirthDate, GetDate()) > 0 then DateDiff(Year, ...

  10. sql判断日期是否为当前季度

    判断日期时候为当年: SELECT DateDiff(yy, '2018-01-02', GetDate()) 返回结果0为当年. 获取当前季度: SELECT DATEPART(QUARTER,GE ...