在没看这篇文章前,回想一下平时我们常用的复位方式:

① 首先,上电后肯定是要复位一下,不然仿真时会出现没有初值的情况;

② 最好有个复位的按键,在调试时按一下复位键就可以全局复位了;

③ 也许是同步复位,也许是异步复位,不同的工程师可能有不同的方案。

但如果认真看了Xilinx的White Paper,就会对复位有了新的认识。

我们把White Paper的内容总结为下面4个问题:

① 需不需要复位?

② 同步复位 or 异步复位?

③ 高复位 or 低复位?

④ 全局复位 or 局部复位?怎么用?

1. 需不需要复位?

看到这个问题,可能很多同学会有点懵,怎么可能不需要复位?其实Xilinx FPGA在系统上电配置时,会有一个GSR(Global Set/Reset)的信号,这个信号有以下几个特点:

•   预布线
  •   高扇出
  •   可靠的

这个信号可初始化所有的cell,包括所有的Flip-Flop和BRAM。

这个信号可初始化所有的cell,包括所有的Flip-Flop和BRAM。

如果我们在程序里用自己生成的复位信号,也只能复位Flip-Flop。

这个GSR信号我们可以在程序中通过实例化STARTUP直接调用,但Xilinx并不推荐这么使用。

主要原因是FPGA会把像系统复位这种高扇出的信号放到高速布线资源上,这比使用GSR要快,而且更容易进行时序分析。

虽然有GSR,但这并不是说要避免使用复位信号,以下两种情况就必须要加复位:

  • 带有反馈的模块,比如IIR这种滤波器和状态机,当状态跑飞了,就需要复位一下

  • 应用过程中需要复位的寄存器

这个就具体看是什么应用了,我们公司的很多寄存器都需要在调试过程中需要经常复位,像这种复位就是必须的了。

所以,需不需要复位完全看设计。这里多提一点,时序收敛也是一样,主要看设计,而不是约束。

2. 同步复位 or 异步复位?

在HDL中,如果敏感列表中不包含rst,会被综合成同步复位:

always @ ( posedge clk )
beginif(rst)...
end

如果敏感列表中包含rst,则会被综合成异步复位:

always @ ( posedge clk or posedge rst)
begin...
end

同步复位的好处,不言而喻,有利于时序分析,降低亚稳态的几率,避免毛刺。

同步信号的缺点:

  • 复位信号有效电平持续时间必须大于时钟周期,不然时钟可能采不到复位

  • 在没有时钟的时候无法复位

也有很多同学会说同步复位会需要额外的资源,但对于Xilinx的FPGA,是没有这个问题的,具体原因后面讲。

对于异步复位,好处就是同步复位的反方面:脉冲宽度没有限制,没有时钟也可以复位。

缺点就是异步电路,容易引起亚稳态,产生毛刺,不利于时序分析,而且不同触发器的复位时间可能不同。下面这个图中,在A时刻接收到复位信号拉低的FF可以在下一个时钟上升沿时就释放复位状态,但C时刻接收到复位信号拉低的FF则在下下个时钟上升沿时才能释放复位状态。

按照White Paper上所讲,99.99%的概率这种情况都不会发生,但如果你刚好碰到一次这种现象,那你就是那0.01%。

下面我们来举一个例子来说明同步复位和异步复位,FPGA为V7,代码如下:

module rst_demo(input clk,input rst1,input rst2,input in1,input in2,output reg out1,output reg out2);always @ ( posedge clk )beginif(rst1)out1 <= 1'b0;elseout1 <= in1;endalways @ ( posedge clk or posedge rst2 )beginif(rst2)out2 <= 1'b0;elseout2 <= in2;endendmodule

综合后的schematic如下图:

可以看出来,同步复位和异步复位都是占用一个Storage Element,我们在之前的一篇文章中讲过Storage Element可以配置为Latch,同样的,也可以配置为FDRE和FDCE,而且在7Series手册中也并未提到配置成FDRE或FDCE时是否会占用更多资源(比如,7Series的FPGA中,一个Slice中有8个Storage Element,如果其中一个被配置成了Latch,那有4个Storage Element是不能用的),因此在Xilinx的FPGA中,同步复位和异步复位在资源占用上,并没有区别。

3. 高复位 or 低复位?

很多处理器上的复位都是低复位,这也导致了很多同学在使用复位信号时也习惯使用低复位了。但从我们上一节所讲中可以看出,无论是同步复位还是异步复位,复位信号都是高有效,如果采用低复位,还需要增加一个反相器。

如果接收到其他处理器发过来的低有效复位信号,我们最好在顶层模块中翻转复位信号的极性,这样做可以将反相器放入IO Logic中,不会占用FPGA内部的逻辑资源和布线资源。

这里多补充一点,如果使用Zynq和Microblaze,则Reset模块默认是低复位,我们可以手动设置为高复位。

4. 全局复位 or 局部复位?怎么用?

我们对复位常用的做法是将系统中的每个FF都连接到某个复位信号,但这样就造成了复位信号的高扇出,高扇出就容易导致时序的违规。而且全局复位占用的资源比我们想象中要高的多:

•   其他网络的布线空间就相应减少
  •   逻辑资源占用
  •   占用FF作为专门的复位电路
  •   如果该复位信号还受其他信号控制,会导致FF的输入前增加门电路
  •   增加布局布线时间
  •   全局复位不会使用像SRL16E这种高效结构
  •   在LUT中SRL16E可当作16个FF
  •   这些Virtual FF不支持复位
  •   增加设计的size,并降低系统性能

因此,Xilinx推荐尽量使用局部复位的方式,前面我们也讲到然同步复位和异步复位都多多少少有些问题,那有没有一种方式可以结合同步复位和异步复位的优点?当然有,就是异步复位,同步释放。这种方法可以将两者结合起来,取长补短。如下图所示,所谓异步复位,就是输入的复位信号仍然是异步的,这样可以保证复位信号能够起效;而同步释放是指当复位信号释放时,输出的sys_rst并不是立即变化,而且被FF延迟了一个时钟周期,这样让复位和时钟同步起来。

图中的Verilog代码如下:

module rst_demo(input      clk,input      rst_async,(* keep = "true" *)output  reg  rst_module1 = 0,(* keep = "true" *)output  reg  rst_module2 = 0);reg         sys_rst;
reg         rst_r;always @(posedge clk or posedge rst_async) beginif (rst_async) beginrst_r <= 1'b1;endelse beginrst_r <= 1'b0;end
endalways @(posedge clk or posedge rst_async) beginif (rst_async) beginsys_rst <= 1'b1;endelse beginsys_rst <= rst_r;end
endalways @ ( posedge clk ) beginrst_module1 <= sys_rst;rst_module2 <= sys_rst;
endendmodule

综合后的schematic如下图:

异步复位模块输出的sys_rst通过n个D触发器后输出给n个模块,当做模块的复位信号。

总结

在使用复位信号时,考虑这个寄存器需不需要在运行过程中进行复位,如果只需要上电后复位一次,那只需在定义时写上初值即可,无需使用其他复位信号;在Xilinx的FPGA中尽量使用高有效的复位信号,采用异步复位同步释放的方式,并且要将复位信号局部化,避免使用高扇出的全局复位。

FPGA复位的正确使用相关推荐

  1. FPGA复位的正确打开方式

      本篇文章参考Xilinx White Paper:Get Smart About Reset: Think Local, Not Global 在没看这篇文章前,回想一下平时我们常用的复位方式: ...

  2. TMS320C6678上电配置和FPGA复位DSP

    参考手册:TMS320C6678用户手册. https://blog.csdn.net/u014404875/article/details/79771589 1. DSP上电复位配置什么? DSP的 ...

  3. (9)FPGA复位设计(第2天)

    (9)FPGA复位设计(第2天) 1 文章目录 1)文章目录 2)FPGA初级课程介绍 3)FPGA初级课程架构 4)FPGA复位设计(第2天) 5)技术交流 6)参考资料 2 FPGA初级课程介绍 ...

  4. (81)FPGA复位激励(task)

    (81)FPGA复位激励(task) 1.1 目录 1)目录 2)FPGA简介 3)Verilog HDL简介 4)FPGA复位激励(task) 5)结语 1.2 FPGA简介 FPGA(Field ...

  5. (80)FPGA复位激励(function)

    (80)FPGA复位激励(function) 1.1 目录 1)目录 2)FPGA简介 3)Verilog HDL简介 4)FPGA复位激励(function) 5)结语 1.2 FPGA简介 FPG ...

  6. (79)FPGA复位激励(initial)

    (79)FPGA复位激励(initial) 1.1 目录 1)目录 2)FPGA简介 3)Verilog HDL简介 4)FPGA复位激励(initial) 5)结语 1.2 FPGA简介 FPGA( ...

  7. (11)FPGA复位设计原则

    (11)FPGA复位设计原则 1.1 目录 1)目录 2)FPGA简介 3)Verilog HDL简介 4)FPGA复位设计原则 5)结语 1.2 FPGA简介 FPGA(Field Programm ...

  8. FPGA复位激励编写(方法三)

    1.1 FPGA复位激励编写(方法三) 1.1.1 本节目录 1)本节目录: 2)本节引言: 3)FPGA简介: 4)FPGA复位激励编写(方法三): 5)结束语. 1.1.2 本节引言 " ...

  9. FPGA复位激励编写(方法二)

    1.1 FPGA复位激励编写(方法二) 1.1.1 本节目录 1)本节目录: 2)本节引言: 3)FPGA简介: 4)FPGA复位激励编写(方法二): 5)结束语. 1.1.2 本节引言 " ...

最新文章

  1. 那个软件弹出广告_如何关闭烦人的电脑弹窗广告?5种方法教你轻松解决
  2. Java 有关于线程
  3. 编写查询功能TextBox
  4. 现代软件工程 作业 结对编程 模板
  5. 爬壁除锈机器人_浙大研制出除锈爬壁机器人
  6. link标签的几个用法,帮助提高页面性能
  7. Hash魔法:一致性 hash 算法
  8. php导入img,PHP 转PDF(Img)
  9. 2015 NI 校招笔试机试面试
  10. 零信任时代企业如何提升权限的安全?从浏览器小程序说起
  11. 从零开始学习CTF——CTF是什么
  12. ajax日期格式,ajax读取的日期的格式转换
  13. QNX-Adaptive Partition
  14. 彩虹色MD主题1 for Sublime Text Typora EmEditor EverEdit
  15. 计算机网络修复提示DNS服务器,dns被劫持或提示配置错误,该怎么解决
  16. speedoffice(Word)怎么添加页码
  17. 麒麟信安邀您抢先看 | openEuler 志高远,开源汇智创未来-开放原子全球开源峰会欧拉分论坛最详细议程出炉
  18. Python求风向xy向量
  19. 百度地图的POI帮助文件
  20. 【语音控制】0成本实现小爱远程开关电脑

热门文章

  1. 基本的信号——三角脉冲信号(非周期锯齿波信号)
  2. 重庆邮电大学计算机考研录取名单,重庆邮电大学2019年硕士研究生复试拟录取名单公示(第一批)...
  3. 手机屏幕录制软件分享
  4. 【HiveMQ 介绍】
  5. iBatis入门例子,用ORACLE和Java测试
  6. 「ZJOI2018」树
  7. SQL 连接 表,取副表的第一条数据
  8. python实现数据的批量max-min标准化,告别反复的EXCEL操作
  9. 用CSS做出写轮眼变化图
  10. 在大厂,为什么做到总监以上级别的人喜欢加班?因为这个级别的快乐你想象不到…...