基于FPGA的数字系统设计中大都推荐采用同步时序的设计,也就是单时钟系统。但是实际的工程中,纯粹单时钟系统设计的情况很少,特别是设计模块与外围芯片的通信中,跨时钟域的情况经常不可避免。如果对跨时钟域带来的亚稳态、采样丢失、潜在逻辑错误等等一系列问题处理不当,将导致系统无法运行。本文总结出了几种同步策略来解决跨时钟域问题。
01 异步设计中的亚稳态
触发器是FPGA设计中最常用的基本器件。触发器工作过程中存在数据的建立(setup)和保持(hold)时间。对于使用上升沿触发的触发器来说,建立时间就是在时钟上升沿到来之前,触发器数据端数据保持稳定的最小时间。而保持时间是时钟上升沿到来之后,触发器数据端数据还应该继续保持稳定的最小时间。我们把这段时间成为setup-hold时间(如图1所示)。在这个时间参数内,输入信号在时钟的上升沿是不允许发生变化的。如果输入信号在这段时间内发生了变化,输出结果将是不可知的,即亚稳态 (Metastability)。
一个信号在过渡到另一个时钟域时,如果仅仅用一个触发器将其锁存,那么采样的结果将可能是亚稳态。这也就是信号在跨时钟域时应该注意的问题。如图2所示。
信号dat经过一个锁存器的输出数据为a_dat。用时钟b_clk进行采样的时候,如果a_dat正好在b_clk的setup-hold时间内发生变化,此时b_ dat就既不是逻辑“1”,也不是逻辑“0”,而是处于中间状态。经过一段时间之后,有可能回升到高电平,也有可能降低到低电平。输出信号处于中间状态到恢复为逻辑“1”或逻辑“0”的这段时间,我们称之为亚稳态时间。
触发器进入亚稳态的时间可以用参数MTBF(Mean Time Between Failures)来描述,MTBF即触发器采样失败的时间间隔,表示为:
其中fclock表示系统时钟频率,fdata代表异步输入信号的频率,tmet代表不会引起故障的最长亚稳态时间,C1和C2分别为与器件特性相关的常数。如果MTBF很大,就认为这个设计在实际工作中是能够正常运行的,不会因为亚稳态导致整个系统的失效。当触发器处于亚稳态,且处于亚稳态的时间超过了一个时钟周期,这种不确定的状态还会影响到下一级的触发器,最终导致连锁反应,从而使整个系统功能失常。
02 同步策略
在异步设计中,完全避免亚稳态是不可能的。因此,设计的基本思路应该是:首先尽可能减少出现亚稳态的可能性,其次是尽可能减少出现亚稳态并给系统带来危害的可能性。以下是根据实际工作总结出来的几种同步策略。
2.1 双锁存器法
为了避免进入亚稳态,应当使参数MTBF尽可能大。通常采用的方法是双锁存器法,即在一个信号进入另一个时钟域之前,将该信号用两个锁存器连续锁存两次(如图3所示)。理论研究表明这种设计可以将出现亚稳态的几率降低到一个很小的程度,但这种方法同时带来了对输入信号的一级延时,需要在设计时钟的时候加以注意。
对于上面的双锁存器法,如果a_clk的频率比b_clk的频率高,将可能出现因为dat变化太快,而使b_clk无法采样的问题。即在信号从快时钟域向慢时钟域过渡的时候,如果信号变化太快,慢时钟将可能无法对该信号进行正确的采样,所以在使用双锁存器法的时候,应该使原始信号保持足够长的时间,以便另一个时钟域的锁存器可以正确地对其进行采样。
2.2 结绳法
由于双锁存器法在快时钟域向慢时钟域过渡中可能存在采样失效的问题,我们引入了一种安全的跨时钟域的方法:结绳法。结绳法适合任何时钟域的过渡(clk1,clk2的频率和相位关系可以任意选定),如图4所示。
图4中的_clk1表示该信号属于clk1时钟域,_clk2的信号表示该信号属于clk2时钟域。在两次src_req_clk1之间被src_vld_clk1结绳(Pluse2Toggle)。将src_vld—clk1用双锁存器同步以后,该信号转换为dst_req_clk2(Toggle2Pluse)同理,用dst_vld_clk2将dat_req_clk2结绳,dst_vld_clk2表明在clk2时钟域中,src_dat_clk1已经可以进行正确的采样了。最后将dst_vld_clk2转换为dst_ack_clk1(Synchronizer and Toggle2Pluse)。dst_ack_clk表明src_dat_clk1已经被clk2正确采样了,此后clk1时钟域就可以安全地传输下一个数据了。可以看出,结绳法的关键是将信号结绳以后,使其保持足够长的时间,以便另一个时钟可以正确采样。图5描述了结绳法的具体实现,主要包括3个基本单元:Pluse2Toggle、Synchronizer和Toggle2Pluse。
Pluse2Toggle模块负责将两个脉冲信号结绳,即将单脉冲信号延长;Synchronizer模块用双锁存器法将得到的信号过渡到另一个时钟域;Toggle2Pluse模块与Pluse2Toggle功能相对,即将延长的脉冲信号还原为单脉冲,这里用到了异或门。整体的设计思想就是用Pluse2Toggle将信号延长,用Synchronizer过渡,再用Toggle2Pluse还原,以保证另一个时钟域可以正确采样,而接收方用相反的流程送回响应信号。
结绳法可以解决快时钟域向慢时钟域过渡的问题,且适用的范围很广。但是结绳法实现较复杂,在设计要求较高的场合应该慎用。
本文主要把FPGA异步时钟设计中产生的问题,原因以及解决问题所采用的同步策略做了详细的分析。其中双锁存器法比较适用于只有少数信号跨时钟域;结绳法比较适用快时钟域向慢时钟过渡的情况。所以,在实际的应用中,应根据自身设计的特点选择适当的同步策略。
为了帮助学员能够更深入地掌握FPGA系统设计与实际应用。编者给大家准备了FPGA系列学习电子书籍,包括了CPLD/Verilog编程语言基础与设计,数字IC、基本逻辑、组合逻辑等基础电路,Vivado平台开发与调试、集成开发环境使用及相关技巧,FPGA数字信号处理、数字图像处理及各种FPGA实战项目设计案例等等。
1.Verilog数字系统设计教程
本书从算法和计算的基本概念出发,讲述如何用硬线逻辑电路实现复杂数字逻辑系统的方法。全书共分三部分。部分内容共18章;二部分共12个上机练习实验范例;三部分是Verilog硬件描述语言参考手册,可供读者学习、查询之用。本书2版后,在语法篇中增加了IEEE Verilog1364-2001标准简介,以反映Verilog语法的新变化。
2.数字电路与逻辑设计
本书系统地阐述了逻辑电路的基础理论--逻辑函数及其数学工具;重点讨论了逻辑电路的设计方法和分析方法;详细介绍了通用性强的几类中、大规模集成器件,并结合实例介绍了它们在各领域中的应用;对可编程逻辑器件及其硬件描述语言也进行了系统介绍。
全书共10章,主要内容有:逻辑函数、集成逻辑门、组合逻辑电路、集成触发器、时序逻辑电路、硬件描述语言、半导体存储器、可编程逻辑器件、脉冲单元电路、模数及数模转换技术等。各章均附有内容提要、小结、思考题和习题。
3.Vivado从此开始
本书涵盖了Vivado的四大主题:设计流程、时序约束、设计分析和Tcl脚本的使用,结合实例深入浅出地阐述了Vivado的使用方法,精心总结了Vivado在实际工程应用中的一些技巧和注意事项,既包含图形界面操作方式,也包含相应的Tcl命令。本书语言流畅,图文并茂。全书共包含405张图片、17个表格、172个Tcl脚本和39个HDL代码,同时,本书配有41个电子教学课件,为读者提供了直观而生动的资料。本书可供电子工程领域内的本科高年级学生和研究生学习参考,也可供FPGA工程师和自学者参考使用。
4.Xilinx新一代FPGA设计套件Vivado应用指南
本书系统论述了新一代FPGA设计套件Vivado的性能、使用方法以及FPGA的开发方法。全书内容包括Vivado设计套件的特性,全面可编程FPGA器件的架构,使用Vivado套件创建复杂数字系统设计项目,仿真系统功能,RTL分析产生网表文件,性能要求的时序约束及综合,布局布线及静态时序分析和生成位流文件等全部设计过程,基于项目和非项目批作业两种用Tcl指令的设计模式,同步设计技术、HDL编码技术、时序收敛和HI.S优化DSP算法等关键技术,并以实例介绍了嵌入式系统的设计方法等。
5.Xilinx FPGA设计权威指南 Vivado集成设计环境
本书全面系统地介绍了Xilinx新一代集成开发环境Vivado的设计方法、设计流程和具体实现。全书共分8章,内容包括:Vivado设计导论、Vivado工程模式和非工程模式设计流程、Vivado调试流程、基于IP的嵌入式系统设计流程、Vivado HLS设计流程、System Generator设计流程、Vivado部分可重配置设计流程和Vivado高级设计技术。本书参考了Xilinx公司提供的Vivado最新设计资料,理论与应用并重,将Xilinx公司最新的设计方法贯穿在具体的设计实现中。
6.基于FPGA的嵌入式图像处理系统设计
本书详细介绍了FPGA这种新型可编程电子器件的特点,对FPGA的各种编程语言的发展历程进行了回顾,并针对嵌入式图像处理系统的特点和应用背景,详细介绍了如何利用FPGA的硬件并行性特点研制开发高性能嵌入式图像处理系统。作者还结合自己的经验,介绍了研制开发基于FPGA的嵌入式图像处理系统所需要的正确思路以及许多实用,并给出了许多图像处理算法在FPGA上的具体实现方法以及多个基于FPGA实现嵌入式图像处理系统的应用实例。
7.基于FPGA的数字图像处理原理及应用
本书首先介绍FPGA程序设计和图像与视频处理的关键基础理论,然后通过实例代码详细讲解了如何利用FPGA实现直方图操作中的直方图统计/均衡化/线性拉伸/规定化、线性滤波器操作中的均值滤波器、Sobel算子(滤波、求模、求角度)、非线性滤波器操作中的排序类算法/形态学滤波、图像分割算法中的局部自适应分割/Canny算子等。本书在仿真测试部分设计了一种完善的通用测试系统,并利用此测试系统在每一章的仿真测试环节对所设计算法进行严格的测试和验证。本书在很后一章介绍了在视频处理领域常见的输入/输出接口。本书偏向于工程应用,在书中有大量关于如何利用FPGA实现图像处理算法的实例及代码,并对这些算法的原理及其实现过程、算法测试等做了详细的介绍,全部的算法都进行了仿真测试验证。
8.数字信号处理的FPGA实现
FPGA仍旧是快速创新的领域,很高兴SpringerVerla9公司给我这个机会将FPGA领域的新发展囊括到本书的第3版中。本版新增了总计150多页全新的理念和当前的设计方法。第3版的创新主要包括以下几方面。
现在许多FPGA都包含嵌入式l8位×18位乘法器,因而推荐在以DSP为主的应用中使用这些器件,因为嵌入式乘法器可以节省很多LE。例如,在本版的所有示例,中都用到的CycloneIIEP2C35F672C6器件就具有35个18位×18位乘法器。
9.FPGA设计实战演练(逻辑篇+高级技巧篇)
FPGA设计实战演练共分为两册,分别是逻辑篇和高级技巧篇。
逻辑篇:主要面向广大的FPGA/CPLD初学者,从零基础开始讲述FPGA/CPLD以及相关的基础知识,并以一个支持各种入门、进阶的子母板形式的学习套件为实验平台,针对Altera公司的Cyclone Ⅲ器件量身打造的24个应用实例贯穿其中。实例讲解深入浅出,不仅有基本的Verilog语法讲解,也有设计思路和背景知识的详细描述; 开发工具(Quartus Ⅱ+ModelSim)的使用更是手把手、图文并茂地展示给读者。
高级技巧篇:现代FPGA的结构越来越复杂,多时钟域的设计现在已是常态。对于功能电路来说,复位结构都必不可少。在同步逻辑设计中如何很好地处理异步复位,甚至在多时钟域之间传递(异步)复位信号也是逻辑工程师经常面临的挑战。本书除专门介绍了上述电路的设计方法外,还介绍了状态机的设计。在介绍这些通用电路结构的基础上,还介绍了代码优化以及如何对设计进行综合与布局布线优化方面的相关内容。
10.FPGA项目开发实战讲解
本书立足于工程实践经验,首先介绍FPGA的原理、语法、设计技巧,然后详细介绍了7项常用技术的实现。每项技术从以下几方面介绍:相关技术介绍、FPGA方案框图设计、子模块设计、仿真和测试、项目开发过程中遇到的问题、定位和解决措施,其中插入了大量的状态机转换图和关键代码,方便读者学习。
FPGA工程师经典必读10+本全阶学习推荐书目,资料截图如下:
如何领取以上完整FPGA经典开发电子书?
扫一扫立即领取!