对于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. Spring Boot + Spring Cloud 实现权限管理系统 后端篇(十八):注册中心(Spring Cloud Consul)

    什么是 Consul Consul 是 HashiCorp 公司推出的开源工具,用于实现分布式系统的服务发现与配置.与其它分布式服务注册与发现的方案,Consul 的方案更“一站式”,内置了服务注册与 ...

  2. 模型评估——ROC、KS

    无论是利用模型对信用申请人进行违约识别,还是对授信申请人进行逾期识别……在各种各样的统计建模中,永远必不可少的一步是对模型的评价,这样我们就可以根据模型评价指标的取值高低,来决定选取哪个模型.本篇主要 ...

  3. 配置IIS的负载均衡

    在大型Web应用系统中,由于请求的数据量过大以及并发的因素,导致Web系统会出现宕机的现象,解决这一类问题的方法我个人觉得主要在以下几个方面: 1.IIS 负载均衡. 2.数据库 负载均衡. 3.系统 ...

  4. shell | {}和()

    执行 bash -n xx.sh用于检测脚本语法是否有错误 bash -x xx.sh用于追踪执行 ${var} 用于限定变量名称的范围,并且支持通配符 $(cmd) shell会先执行括号的cmd, ...

  5. 用法:node模块都具备的方法(exports、module、require、__filename、__dirname)

    凡是玩弄nodejs的人,都明白,每一个模块都有exports.module.require.__filename.__dirname的方法 清楚了解方法的用法后,玩转node就等于清楚了日常讲话的内 ...

  6. 教你控制 RecyclerView 滑动的节奏

    最近,PM升级改版落地页,其中有一个很奇怪的交互需求,需求是这样的: 用户在该页面可以上下无限滑动,但是,在上拉滑动过程中,当内容切换为另一个内容的时候,新的内容先吸顶,然后停止滑动,让用户知道他已经 ...

  7. scikit-learn入门导航

    scikit-learn是一个非常强大的机器学习库, 提供了很多常见机器学习算法的实现. scikit-learn可以通过pip进行安装: pip install -U scikit-learn 不过 ...

  8. S5PV210 串口实验(中断方式)

    结合之前的串口实验(轮询方式)与中断体系分析,我们来做下中断方式的串口接收实验. start.S .global _start .global IRQ_handle _start: /* 关 Watc ...

  9. 细说Redis(一)之 Redis的数据结构与应用场景

    这一篇文章主要介绍Redis的数据结构与应用场景 NOSQL之Redis Redis是一款由key-value存储的软件.说起NOSQL,有文档型.键值型.列型存储.图形数据库.其中,在简单的读写性能 ...

  10. 2.C++中的bool类型,三目运算符,引用

    本章主要内容: 1)bool类型 2)三目运算符 3)引用 1.布尔型bool 在C++中,bool类型只有true(非0)和flase(0)两个值,且bool类型只占用了一个字节. 例如: #inc ...