对于复位信号的处理,为了方便咱们习惯上采用全局复位,博主在很长一段时间内都是将复位信号做为一个I/O口,经过拨码开关硬件复位。后来也看了一些书籍,采用异步复位同步释放,对本身设计的改进。html
不过自从我研读了Xilinx的White Paper后,让我对复位有了更新的认识。git
One of the commandments of digital design states,"Thou shalt have a master reset for all flip-flops so that the test engineer will love you, and your simulations will not remain undefined for time eternal."微信
这句是用来装逼的。使用全局复位有利于咱们仿真,全部的寄存器都是有初始值的,也能够在任意时刻让你的寄存器恢复初值,因此验证工程师很喜欢这样的设计,可是Xilinx建议的是尽可能避免使用全局复位,这是为何呢。网络
咱们习惯上一般使用的复位有三种,异步
硬件开关:复位信号接一个拨码开关。布局
电源芯片:上电时候电源芯片产生,能够长时间维持,直到稳定。性能
控制芯片:控制芯片产生复位脉冲。spa
这些复位信号和FPGA内部信号的变化比起来是比较慢的。复位按钮最快也会到达毫秒级别,而FPGA内部信号都是纳秒级别的变化。全局复位的周期远大于系统时钟的周期,是彻底能够保证全部的触发器被成功复位的。设计
但随着系统的频率愈来愈快,全局复位信号的释放造成一个高扇出的网络。3d
Fan-out即扇出,模块直接调用的下级模块的个数,若是这个数值过大的话,在FPGA直接表现为net delay较大,不利于时序收敛。所以,在写代码时应尽可能避免高扇出的状况。
如图,全局复位的释放须要传输到不一样的触发器。每个触发器须要被释放复位,可是随着时钟频率的提升,加上复位路径网络的延迟,并且全局复位仍是一个高扇出的网络,因此这对系统的时序是一个大挑战。
一般状况下,复位信号的异步释放,没有办法保证全部的触发器都能在同一时间内释放。触发器在A时刻接收到复位信号释放是最稳定的,在下一个时钟沿来临被激活,可是若是在C时刻接收到复位信号释放没法被激活,在B时刻收到复位信号释放,则会引发亚稳态。
随着系统时钟频率的提升,并非全部的触发器都能在同一个时刻从复位状态被释放。
白皮书上又说了,好的消息是99.9%的状况下,全局复位的异步释放并不会出现问题。因此大多数电路均可以正常工做。可是,若是你有了第一次就不能工做的电路,那你就是遇到那0.01%的状况,很不幸你的复位信号被在错误的时刻重置。(哈哈,皮)
在一些状况下,复位释放的时间并不重要。
当你的数据采用流水线操做的时候,复位释放的时间并不重要,由于无论你流水线后面的触发器复位释放后是否出错,只须要一些周期后,整个流水线就又会正常工做了。白皮书上还说,这样的复位也是没有意义的。
可是有一些状况下,复位的释放后是很重要的。
好比独热码状态机。若是表示独热码状态的第一个触发器比第二个触发器早释放了一个时钟周期,那状态机的状态机会跳转到一个无效的状态。若是全部的表示独热码的寄存器没法在同一个周期内被释放,那状态机确定会跳转到一个无效的状态。还有一些例子,请读者本身看白皮书。
其实当Xilinx FPGA配置或从新配置时,全部的单元都会被初始化。白皮书称为master reset,由于这可比你复位一些D触发器要强得多,它甚至初始化了片内RAM。
Xilinx的器件也有嵌入处理的系列,软核或硬核。在程序执行第一条指令前,程序和数据区域已经定义好了。有了上电复位,还用专门消耗逻辑资源去复位触发器是没有意义的。
固然,白皮书也给出了处理复位的建议和方法。
Think Local, Not Global。异步复位,同步释放的方法。用内部定义复位信号的方法来复位触发器,而不是全都直接使用全局复位信号。当进行复位操做时,全部的触发器被预设为1。如上图,移位寄存器的最后一个触发器去操做模块内部定义的复位网络。当复位信号释放时,移位寄存器通过移位,当最后一个触发器由高电平变为低电平时,对本地的复位网络进行复位操做。也就是异步复位,同步释放。
复位网络占用大量布线资源。
提升了布局布线时间。
使用器件的逻辑资源。
会使你的设计变得更大。
占用更多的逻辑资源确定会影响你的性能。
具体请参阅白皮书。
并非全部部分的设计都须要复位,因此设计者在设计过程当中应该准确判断须要被复位的部分,从而采用异步复位、同步释放的方法进行对复位的严格处理。
当咱们在设计每个部分的时候,都要心里问问本身,这个bit须要被复位吗?
那么怎样处理Xilinx FPGA中的复位呢?Xilinx的工程师也给出了解释和方法。
https://www.eetimes.com/document.asp?doc_id=1278998
http://xilinx.eetrend.com/d6-xilinx/article/2013-07/4343.html
White Paper得到在微信订阅号后台回复“wp272”便可得到!
简单总结就是,Xilinx的FPGA 应该尽可能避免全局复位,有些部分的设计均可以不用复位,必须要复位的设计而采用 同步 高复位。
代码以下。设计中须要复位的部分,使用产生的sys_rst信号进行同步复位,并且是同步 高复位。再次贴出下图。
1 module Sys_Rst( 2 input clk, 3 input rst, 4 output sys_rst 5 6 ); 7 8 reg rst_r0; 9 reg rst_r1; 10 11 always @(posedge clk or posedge rst)begin 12 if(rst)begin 13 rst_r0 <= 1'b1; 14 rst_r1 <= 1'b1; 15 end 16 else begin 17 rst_r0 <= 1'b0; 18 rst_r1 <= rst_r0; 19 end 20 end 21 22 assign sys_rst = rst_r1; 23 24 endmodule
转载请注明出处:NingHeChuan(宁河川)
我的微信订阅号:硅农
若是你想及时收到我的撰写的博文推送,能够扫描左边二维码(或者长按识别二维码)关注我的微信订阅号
知乎ID:NingHeChuan
微博ID:NingHeChuan