对于FPGA内部的复位,之前一直比较迷,这两天仔细研究官方数据手册,解开了心中的诸多疑惑,感觉自己又进步了呢.....


原创不易,转载请转原文,注明出处,谢谢。

 

一、关于POR(Power-On Reset )

FPGA在上电工作时,会先进入复位模式,将所有RAM位清除,并通过内部弱上拉电阻将用户I/O置为三态。接着依次完成 配置、初始化工作,如果这一切都顺利,就进入用户模式,FPGA会根据用户所编写的时序逻辑开始工作。

二、FPGA上电工作过程详解

从第一条我们知道,FPGA从上电到进入用户模式,会有一个过程。就不放时序图恶心人了,直接上干货,如图1所示。

图1

过程详解

  1. 上电触发一个复位事件,拉低nCONFIG、nSTATUS、CONF_DONE、INIT_DONE引脚,清除RAM位,三态用户I/O,进入复位;
  2. 复位过程中,控制逻辑检测所有供电电压,当他们在规定时间达到规定值,并稳定下来,则进入配置,否则就需要用户通过重新拉低nCONFIG足够时间等待电压达标,优秀的电源设计对数字电路是很重要的;
  3. 复位顺利完成,则依次释放nCONFIG、nSTATUS,让它们被上拉电阻拉高,进入配置,配置模式必须和MSEL[4:0]的设置必须匹配,编写的逻辑电路由quartus生成配置文件,在这个时候烧写到FPGA中,这过程叫做配置,常用的配置方式有JTAG在线模式,和EPCS/EPCQ配置模式;
  4. 配置成功,则释放CONF_DONE,进入初始化,初始化是按照用户意图将各寄存器置位成预期值;
  5. 初始化完成,则释放INIT_DONE,进入用户模式,系统按照既定时序开始运转。

*****注意*****

  • 电源不稳,后面一切免谈,电源质量好,后面一切应该也顺利;
  • 设计硬件电路时,nCONFIG、nSTATUS、CONF_DONE必须上拉,因为初始化完成就万事大吉了,所以INIT_DONE不用管,配置完成后当做普通I/O用;
  • MSEL[4:0]设置;
  • 设计硬件电路时,要注意配置FLASH和FPGA连接,以及JTAG端口的设计,硬件错了就白瞎;

三、关于FPGA的复位

如前所述,我们已经知道,每次上电工作,FPGA必定进行复位、初始化等操作。所以理论上,后续工作工程中,FPGA是不需要复位的,尤其是全局复位。但是,一方面为了保险起见应该进行局部复位和寄存器初始化(在时序过程中的任意时刻赋值),保证寄存器中的值是我们期望的值,而且某些IP核在工作前也必须复位;另一方面,电路中难免出现亚稳态等,使系统工作异常,这就需要形成一种机制,触发一个复位事件,使系统进入 “复位—>配置—>初始化—>用户模式” 这一过程。

所以有:

  1. 在 “三叔学FPGA系列之一:Cyclone V中的时钟资源” 一文中一提到,全局时钟布线资源通常非常有限,而全局复位用的也是全局时钟的布线资源,所以能不用全局复位尽量别用,用局部复位就行了,也就是不要在所有always中都用同一个rst_n,可以通过内部逻辑生成多个局部复位信号rstn0,rstn1,rstn2.....
  2. 在硬件电路设计时,Cyclone V以前的FPGA都有RESET引脚,但设计手册中别没有说这个引脚一定要用作复位,可以当做普通I/O用,在Cyclone V中RESET引脚被取消了。我的理解是:RESET引脚的作用有两点,一是为了在系统运行过程中出现异常时,可以手动按钮之类的触发一个复位事件,使系统复位;二是采用电容延时的方式,强制增加上电复位时间,确保复位成功。当上诉两方面都没有太大必要的情况下,RESET引脚就没什么用了,所以Intel牛B,在Cyclone V中直接去掉RESET引脚(个人猜想,未到技术区求证);
  3. 再次说明,RESET≠全局复位,实现全局复位有一万种方法,比如通过内部逻辑,或者通过matlab控制串口等等;
  4. 关于是否使用全局复位,网上众说纷纭,Intel也没有官方说法。我的理解是,看个人的系统情况。比如:全局时钟本来就紧张,那么就pass全局复位,用局部复位,反之资源充足,用全局复位。

四、验证后再来更新

关于第三节的内容,很多都是我个人的猜想,但是也是参考了官方手册,以及个人项目开发中的经验,准确率十之八九,后续验证后再来更新。

关于上述疑问,2018年11月3日续更

  1. 硬件设计没问题,时钟没问题,电源也没问题,理论上FPGA系统已经可以正常复位、配置、初始化、并工作了,接下来就逻辑设计的优劣问题;
  2. 有了第1条,FPGA中确实没必要使用全局复位,对于需要复位的模块,通过一定方法让它产生一种错误反馈机制,并触发一个局部复位就行了;
  3. 全局时钟都干掉了,专门的复位引脚也没有太大意义,它的作用不同于POR中的复位,仅仅是在已经初始化并进入用户模式的FPGA中产生一个复位信号而已,并不能起到上电复位的效果,这个效果,有局部复位就搞定了!要是系统死机了,复位引脚也无能为力,这需要可靠的逻辑电路设计来保障!
  4. 还是那句话,资源充足的土豪根本不需要纠结,随意作!我这么深究也是作,加深理解没错~

关于上述疑问,2018年11月21日续更

  1. 经过验证,全局复位信号是必须的,全局复位引脚非必须(可用内部电路代替);
  2. 全局复位是为了等到所有寄存器被初始化赋值并稳定下来,再按照时钟整齐划一地读写,否则必定产生亚稳态,因为时钟的稳定必定先于寄存器的稳定;
  3. 上述内容已在cyclone V中已验证,延时时间要具体看工程复杂度、需要初始化的寄存器数量==,复位时间不够,必定产生亚稳态;
  4. 为了踩平这个坑,花了我两天时间。。。但是值!
  5. 亚稳态往往是万恶之源,切记切记。

三叔学FPGA系列之二:Cyclone V中的POR、配置、初始化,以及复位的更多相关文章

  1. 三叔学FPGA系列之一:Cyclone V中的时钟资源

    之前的项目中更多的是有师兄提供经验和帮助,追求的是快速上手,所以不管对于硬件电路设计,还是verilog电路编程,甚至是FPGA内部的资源,都没来得及系统地学习,最近在做算法到电路的实现,正好系统学习 ...

  2. FPGA系列之一:Cyclone V中的时钟资源

    之前的项目中更多的是有师兄提供经验和帮助,追求的是快速上手,所以不管对于硬件电路设计,还是verilog电路编程,甚至是FPGA内部的资源,都没来得及系统地学习,最近在做算法到电路的实现,正好系统学习 ...

  3. .net基础学java系列(二)IDE 之 插件

    上一篇文章.net基础学java系列(二)IDE "扎实的基础"+"宽广的视野",基本可以帮我们摆脱码畜.码奴.码农的命运! IT领袖:IT大哥:IT精英:IT ...

  4. Vue基础系列(二)——Vue中的methods属性

      写在前面的话: 文章是个人学习过程中的总结,为方便以后回头在学习. 文章中会参考官方文档和其他的一些文章,示例均为亲自编写和实践,若有写的不对的地方欢迎大家指出. 作者简介: 一个不知名的前端开发 ...

  5. .net基础学java系列(二)IDE

    上一篇文章.net基础学java系列(一)视野 废话: "视野"这篇文章,管理员说它比较空洞!也许初学者看不懂表格中的大部分内容!多年的neter估计也有很多不知道的! 有.net ...

  6. 学习ASP.NET Core Razor 编程系列十二——在页面中增加校验

    学习ASP.NET Core Razor 编程系列目录 学习ASP.NET Core Razor 编程系列一 学习ASP.NET Core Razor 编程系列二——添加一个实体 学习ASP.NET ...

  7. Spring Boot 入门系列(二十四)多环境配置,3分钟搞定!

    之前讲过Spring Boot 的系统配置和自定义配置,实现了按照实际项目的要求配置系统的相关熟悉.但是,在实际项目开发过程中,需要面对不同的环境,例如:开发环境,测试环境,生产环境.各个环境的数据库 ...

  8. Java开发学习(三十四)----Maven私服(二)本地仓库访问私服配置与私服资源上传下载

    一.本地仓库访问私服配置 我们通过IDEA将开发的模块上传到私服,中间是要经过本地Maven的 本地Maven需要知道私服的访问地址以及私服访问的用户名和密码 私服中的仓库很多,Maven最终要把资源 ...

  9. Java基础扫盲系列(二)—— Java中BigDecimal和浮点类型

    一直以来我几乎未使用过BigDecimal类型,只有在DB中涉及到金额字段时听说要用Decimal类型,但是今天再项目代码中看到使用BigDecimal表示贷款金额. 本篇文章不是介绍BigDecim ...

随机推荐

  1. ETCD&Flannel安装

    .ETCD 安装: nohup etcd --name etcd0 \ --advertise-client-urls http://172.31.24.246:2379,http://127.0.0 ...

  2. Nexus安装、使用说明 (转)

    1. 为什么使用Nexus 如果没有私服,我们所需的所有构件都需要通过maven的中央仓库和第三方的Maven仓库下载到本地,而一个团队中的所有人都重复的从maven仓库下 载构件无疑加大了仓库的负载 ...

  3. Asp.net Webform 使用Repository模式实现CRUD操作代码生成工具

    Asp.net Webform 使用Repository模式实现CRUD操作代码生成工具 介绍 该工具是通过一个github上的开源项目修改的原始作者https://github.com/Supere ...

  4. Tomcat8源码笔记(二)Bootstrap启动

    TOMCAT源码调试入口是Bootstrap类的main方法,我的启动参数VM: -Dcatalina.home=E:/Tomcat_Source_Code/apache-tomcat-8.0.53- ...

  5. 朴素贝叶斯分类器及Python实现

    贝叶斯定理 贝叶斯定理是通过对观测值概率分布的主观判断(即先验概率)进行修正的定理,在概率论中具有重要地位. 先验概率分布(边缘概率)是指基于主观判断而非样本分布的概率分布,后验概率(条件概率)是根据 ...

  6. 将代码从 spark 1.x 移植到 spark 2.x

    1. SparkSession sparkSession可以视为sqlContext和hiveContext以及StreamingContext的结合体,这些Context的API都可以通过spark ...

  7. Spring全家桶–SpringBoot Rest API

    Spring Boot通过提供开箱即用的默认依赖或者转换来补充Spring REST支持.在Spring Boot中编写RESTful服务与SpringMVC没有什么不同.总而言之,基于Spring ...

  8. callback.js

    function writeCode(callback){ console.log("i am waiting....") callback(); console.log(&quo ...

  9. 安装SQL server 2016遇到问题

    microsoft R open https://mran.microsoft.com/download/ https://mran.revolutionanalytics.com/download/ ...

  10. SPOJ GSS3 (动态dp)

    题意 题目链接 Sol 这题可以动态dp做. 设\(f[i]\)表示以\(i\)为结尾的最大子段和,\(g[i]\)表示\(1-i\)的最大子段和 那么 \(f[i] = max(f[i - 1] + ...