来支持coyoo大大
为了拿本书我 也是蛮拼的
复位在FPGA或者IC设计中都是最复杂最需要谨慎处理的问题之一。简单来讲,复位和时钟需要,几乎需要连接到每个模块每个逻辑单元中,这就表示复位线的扇出很重,负载很大,布线很困难;然而复位又是一个慢速信号,不需要像时钟一样时刻在快速翻转,所以如果占用全局网络资源(如bufg),又显得有点浪费。什么时候需要复位信号,什么时候可以省略,复位如何影响时序分析,文题中的同步复位or异步复位、高有效低有效等;还有最重要的是,在如今芯片面积越来越大的情况下、如何保障设计所有逻辑模块可靠(不一定是同时)复位?是设计工程师们需要花更多心思考量。
首先想聊一聊几个问题,我们为什么要复位?复位有什么难的?我们该怎么复位?为什么要复位呢?我总结了一下,大概有这几个原因,首先是为了调试,让系统有个统一固定的还原点,便于查找和定位bug;然后是为了赋初值,给所有寄存器一个可预知的状态,防止系统随意启动,这点特别对于状态机和流水线是很重要滴;再是为了仿真,这点其实和上条有点重复,不过这里是针对modelsim isim等仿真软件来说的。没办法,仿真软件就是那么傻,没有初值,就给你满屏红叉(modelsim内心OS,不给初值,臣妾不知道怎么办啊);最后一点,个人觉得有点扯,增加系统稳定性。对系统而言,复位总比热重启好吧。
复位有什么难的?复位难在一点,就是在复位释放(或者之后可预知的)的时候,系统所有寄存器能 同 时 回到一个可确定或者可预知的状态。前面说了,随着现在芯片面积越来愈大,系统时钟越做越快,这点越来越难办到。不信,你可以拿个FPGA量量尺寸,对照si的介电常数,算算电磁波从芯片最左边传导到最后边的延迟。再考虑复位的重负载导致的大电容效应。。。。
那我们该怎么复位?同步、异步?全局复位、分块复位?换种问法,那些模块一定需要复位?哪些模块不需要复位?那些模块一定不能有复位?那些模块的复位不需要“同时”?问题越来越有趣了是不是。
最后回答文题三问,1、Altera推荐使用异步复位,Xilinx推荐使用同步复位?个人认为这是很泛泛的说法。同步复位可以使得所有寄存器在同一个时钟内恢复到某固定值,因而对整个系统的时序更好;而且同步设计是FPGA的根本追求。从这两点上说,Altera也是推荐在设计中使用同步复位的。Altera推荐使用异步复位大概原因是基于其内部逻辑单元通常都有专用的异步低有效复位端,可以节省连线资源,这点特权同学的多本图书都有描述。Xilinx推荐同步复位,除了以上两点原因,还在于其综合器更加强大,可以讲同步高复位设计的复位优化成控制信号当做lut的输入,从而得到更好的优化结果,还有就是内部的BRAM、DSPE等资源或者没有复位或者是同步高复位。歪楼而论,xilinx在其官方文档中反复推荐少用或者不用复位信号
。好像也顺便回答了 2 Altera推荐复位0有效,而Xilinx推荐复位是1有效?的问题。高有效好还是低有效好,在我上学的时候也是类似同步复位好还是异步复位好的经典引战问题。正方的观点是高有效电路简单,整片功效较低(平时工作时维持在0状态,省电?);反方主要纠结在低有效的复位抗干扰好。
3、两家都建议将异步复位进行同步化处理。这里更正一下说法,准确的说法是异步复位同步释放。这是一种折衷,网上说这个的东西太多,不赘述。这里简单讲讲同步释放和同步化处理两种容易混淆的说法有何不同。同步处理指 沙发 murongyu 童鞋的做法,即将异步复位打两拍,更精确的描述是 8楼 mayiqun720 的引文。这种做法本质是把异步复位当做跨时钟域同步来处理。这种做法可以避免复位释放时亚稳态的传播,但是不能解决误复位的问题。同步释放的电路如下图,主要到其外部复位输入是接到寄存器的异步复位端的。这种电路才能将异步复位同步复位的优点折衷。
打了一个小时的字,应该能拿一本书了。
没翻资料印象流无责任随手敲,若有疏漏错误,希望coyoo大大、各位版友指正。
转载注明纪若尘,谢谢
PS,图来源网络
http://blog.csdn.net/lg2lh