文章目录
时序逻辑电路中的时钟控制
在与、或、非门以及触发器等基本数字逻辑单元组成的时序逻辑电路世界里,我们是利用时钟来玩转数据。而对于时钟信号本身,我们除了能对其进行整数倍分频以及一些简单的门控处理外,几乎无能为力。但是,时钟信号作为时序逻辑的"心跳",其重要性是显而易见的。因此,为了弥补数字逻辑基本门电路对时钟信号控制不足的软肋,FPGA中通常都会集成一些PLL或者DCM资源,从而实现对时钟信号更为全面、灵活地掌控。
PLL模块基本端口简介
时钟输入、输出端口是PLL中最基本的两类端口,分别对应CLKIN和CLKOUT。一个锁相环可以有不止一个CLKIN和多个CLKOUT,不过请注意,同一时刻,只能有一个CLKIN端口被使能,但是可以有多个CLKOUT端口都有时钟信号输出。
CLKIN端口
关于CLKIN端口,它对接人的时钟信号是有一定要求的:
- 接人的时钟信号一定要是连续时钟信号,否则PLL会不断地失锁,甚至根本无法到达锁定状态,而当这种情况出现,PLL的输出信号的波形也就无法得到保证。
- 对接入时钟信号的频率是有一定要求的,因为PLL并不是对任意频率的时钟输入都能做到锁定的。这个不同的厂商、不同系列芯片之间的要求可能会有所不同,例如,Xilinx Virtex5 LXllO系列FPGA芯片中的PLL就要求CLKIN的范围在19 MHz~ 645 MHz之间。
- 对接入时钟信号的占空比也有一定要求。一般来说,接入时钟信号的占空比越接近于50%越好,不过要求也不是这么严格,因为PLL一般都有一定的容忍度,例如有的PLL在输入时钟信号的占空比在30%~70%之间都能够完成锁定。因此,如果需要操作的时钟信号的占空比和50%偏差比较大,那么使用PLL前需要根据器件手册等来确定是否可以完成锁定。
- 对于一个PLL来说,它可以处理内部逻辑产生的时钟信号,也可以直接处理外部IO管脚直接引人进来的单端或差分时钟信号,因此需要根据实际情况来完成正确地配置或代码描述。
CLKOUT端口
关于CLKOUT端口,它输出的时钟信号也是有一定限制的:
- 从PLL的原理结构框图来看,它应该只有一个输出端口,可事实上FPGA内部的PLL模块往往能提供多个输出端口,它是怎么做到的呢?其实很简单,FPGA内部PLL的主体部分也只能输出一个时钟信号,我们可以称其为CLKMID,只不过这个时钟信号并不是直接输出给PLL外部逻辑使用的,而是扇出多路,每路都有一个分频器和移相器,这样就可以产生多个CLKOUT供后续使用。
- CLKMID的频率是有一定限制的,否则PLL也会出现不能锁定的情况。这个不同的厂商、不同系列芯片之间的要求可能会有所不同,例如,Xilinx Virtex5 LXllO系列FPGA芯片中的PLL就要求CLKMID的范围在400 MHz~1000 MHz之间。
- CLKMID之后各个扇出路径上的分频系数和移相系数都是有一定限制的,因此导致各个CLKOUT之间还是有着一定相关性的。所以如果要实现两个完全不相关的CLKOUT,一般需要使用两个PLL。
- 由于FPGA内部的时钟树资源或者布线资源等的承受能力有限,所以对CLKOUT上时钟信号的频率也是有一定要求的,例如,Xilinx Virtex5 LXllO系列FPGA芯片中的PLL就要求CLKOUT的范围在3.125 MHz~ 600 MHz之间。
- CLKOUT的时钟移相精度也是有一定限制的。例如Xilinx Virtex5 LXllO系列FPGA芯片中的PLL的VCO能够以45°间隔输出8个相移不同的同频时钟,相当于CLKMID扇出部分的移相器,由于分频计数器本身也可以按照计数器的计数总值来调整其输出时钟的占空比和相位,因此,若分频系数为2,那么CLKOUT能够以22.5°的间隔来移相,若分频系数为3,那么CLKOUT能够以15°的间隔来移相,等等,依此类推。
Summary
PLL模块提供了灵活的时钟输入和输出控制,支持多路输出以及多种配置选项。CLKIN端口对输入时钟信号有严格的要求,包括连续性、频率范围、占空比等。CLKOUT端口则通过内部的分频和移相机制实现了多路输出,但同样受频率和相位精度的限制。
PLL锁定指示端口
PLL复位端口
有些情况下,PLL一旦失锁是无法自行恢复的,因此,重置功能是必须的。当PLL遇到一些特殊情况或需求,例如输入时钟频率大范围跳动或者PLL配置更改时,可以通过PLL提供的RESET端口来主动对其进行复位操作,以保证PLL的输出能够尽快达到我们的预期。不过请注意,复位之后的CLKOUT必然会出现在一段不稳定期,这时就需要用到上面刚刚介绍的LOCKED端口。
PLL配置端口
对于PLL模块,我们只能通过HDL语言来调用,而无法通过HDL语言来创造,因为PLL所做的事情已经超出了数字逻辑的理论范围。而当我们使用PLL的时候,一般都是先通过软件工具完成其具体配置后,才能生成可供HDL调用的、功能确定的PLL模块。可是有时候固定功能的PLL不能满足实际的需求,因此,有些PLL还提供了一系列配置端口,用来动态地修改PLL内部的一些参数寄存器,从而完成对PLL的实时重新配置。
Summary
PLL提供了复位和配置端口,以增强其灵活性和可靠性。复位端口用于强制PLL重新锁定,配置端口则允许动态调整PLL内部参数,以便适应不同的应用场景。
DCM模块基本端口
DCM模块概述
一般来说,一个DCM只有一个时钟输入端口,即CLKIN端口,它对接人的时钟信号是有一定要求的。
- 接人的时钟信号一定要是连续时钟信号,否则DCM会不断地失锁。
- 对接入时钟信号的频率是有一定要求的。
- 对接入时钟信号的占空比也有一定要求。
- 对于一个DCM来说,它可以处理内部逻辑产生的时钟信号。
Summary
DCM模块的时钟输入端口对信号的连续性、频率和占空比有严格要求,类似于PLL,但功能相对简单,仅有一个时钟输入端口。
应用场合
时钟倍频
PLL和DCM不仅可以做整数倍的倍频,例如2倍频、3倍频等等;也可以做分数倍的倍频,例如1.5倍频、2.33倍频等等;更一般的来说,对于凡是可以写成Fout = (M/N) * Fin
(M、N均为有限范围的正整数,且M≠N),且Fout,Fin均在允许频率范围内的倍频情况,PLL和DCM均能够轻松完成该倍频需求。不过由于PLL和DCM输入、输出时钟信号的频率范围、占空比等要求可能会有所出入,因此如果一片FPGA芯片上既有PLL也有DCM,应根据它们的数据手册来选取更合适的。除此以外,如果同时需要输出多个倍频系数不一样的时钟,那么优先选择PLL,因为DCM仅有一个CLKFX端口输出的倍频系数是独立可调的。
时钟分频
PLL和DCM不仅可以做整数的分频,例如2分频、3分频等等;也可以做分数的倍频,例如1.5分频、2.33分频等等;更一般的来说,对于凡是可以写成Fout = (M/N) * Fin
(M、N均为有限范围的正整数,且M≠N),且Fout,Fin均在允许频率范围内的分频情况,PLL和DCM均能够轻松完成该分频需求。不过由于PLL和DCM输入、输出时钟信号的频率范围、占空比等要求可能会有所出入,因此如果一片FPGA芯片上既有PLL也有DCM,应根据它们的数据手册来选取更合适的。除此以外,如果同时需要输出多个分频系数不一样的时钟,那么优先选择PLL,因为DCM仅有一个CLKFX端口输出的分频系数是独立可调的,而CLKDV端口也只能做到N+0.5(N为正整数)分频。
Summary
PLL和DCM都可以实现时钟的倍频和分频,但PLL在灵活性上更有优势,尤其适用于多路输出和高精度需求的应用场景。
大范围频率合成
时钟信号的倍频和分频可以统称为频率合成。通过之前的讨论可以发现,无论是PLL还是DCM,都能对时钟信号完成很好的频率合成工作,但是,当要求更大范围的频率合成时,单独的PLL或者DCM就显得还差那么一点。
首先,需要说明一下,更大范围的频率合成并不是指CLKOUT的最低、最高频率范围得到扩大,而是指可合成的频率数量更多了。因为受到PLL和DCM时钟输出端口的频率范围制约,无论如何我们是不可能产生出超出这个制约范围的频率的,但是对于一个固定频率的CLKIN来说,PLL或者DCM所能给出的频率合成情况是有限的,也就是说CLKOUT可取的频点是离散的、有限的,如果能够在CLKOUT的频率制约范围内获得更多的离散频率点,也是对频率合成范围的增大。
频率合成的公式可以概括如下:
Fout = (M/N) * Fin (M、N均为有限范围的正整数)
如果对之前讲的内容还有印象,应该知道这个公式还有一个隐含的限制,即如果令Fmid=M * Fin,那么Fmid的频率范围是有限制的(如果对于Altera公司的分数锁相环,M的值也可以不为整数)。
现在假设,Fin=100 MHz,M、N的取值范围均为1~32,Fmid的取值范围为500 MHz ~1000 MHz,若要求Fout=210 MHz,该怎么实现?
由于Fout = (21/10) * Fin,因为21和10已经互质,所以M只能为21、N只能为10,可是此时Fmid=2100 MHz,大于允许的取值上限,故使用单个PLL或者DCM是无法实现本例要求的。
因此为了解决这类问题,扩展可取离散频点的数目,我们可以采用PLL、DCM的级联来实现大范围的频率合成,级联的方式可以为PLL+DCM、PLL+PLL、DCM+DCM,当然也可以是更高阶的级联。
那么,针对之前这种情况,我们可以先使用一个PLL或DCM,做
Fout1 = (7 /10) * Fin = 70 MHz
再使用一个PLL或DCM做
Fout = (9/3) * Fout1=210 MHz
这样便可解决单PLL或DCM不可解决的问题,达到扩展频率合成范围的目的。
Summary
通过级联PLL和DCM模块,可以实现更广泛的频率合成范围,满足更复杂的时钟信号处理需求。
时钟去抖
时钟去抖,即去除时钟信号本身的一些不稳定性,例如相位的不稳定性、占空比的不稳定性以及频率的不稳定性。
如果时钟信号本身的质量不是非常好,那么必然导致其所控制时钟域时序逻辑性能的下降,而当这种下降比较严重时,就会导致FPGA设计行为的错误。因此,为了保证时序逻辑的正常工作,我们往往期望控制该时钟域的时钟信号的质量能够尽量得好,时钟波形能够尽量趋向于理想的无抖动的波形信号。可是现实情况往往不尽如人意,通常情况下,外部的时钟源总会或多或少地存在着一些不稳定因素,而当FPGA设计的时间需求比较紧时或者碰到一些对相位非常敏感的算法(例如,QAM调制的星座图绘制等)时,这些时钟上的不稳定因素往往会对接FPGA设计造成比较致命的打击。因此,迫切需要一种能够对时钟信号进行矫正的方法来解决上述问题。
在FPGA的资源中,PLL可以很好地完成对时钟的去抖工作,只要CLKIN的变化不至于让CLKOUT失锁,CLKOUT就能输出比CLKIN稳定得多的时钟波形,这主要也是因为PLL中具有一个低通滤波器的结构。而DCM不具有时钟去抖效果,因为其原理归根结底还是利用一些数字的方法,而数字的方法对于通过其的电信号是没有原理性的滤波效果的。
Summary
PLL模块具备时钟去抖功能,通过内部低通滤波器实现对时钟信号的稳定化处理,而DCM则不具备这一功能。
时钟移相
时钟移相,即我们希望以某一时钟信号为基础,来创造出与其相位有一定偏差的新的时钟信号。
时钟移相也是一类最基本的时钟信号处理需求,PLL和DCM均可以完成这类工作。时钟移相技术通常用于同步接口的设计,相对来说,PLL的移相精度比较粗,一般只能达到CLKMID的1/8周期。而DCM的移相精度相对来说比较高,一般能够达到CLKIN的1/256周期。由此可见,只有当倍频系数M的取值等于32时,PLL的移相精度才可能和DCM一样,而这已经几乎是PLL的极限了。
因此,如果对移相的精度要求不是很高时,PLL和DCM都是可以的;而当对移相的精度要求比较高时,应该采用DCM,若此时能够保证倍频系数M的取值比较大,则也可以考虑使用PLL。
Summary
时钟移相是同步接口设计中的常用技术,PLL和DCM都支持移相功能,但DCM具有更高的移相精度,适用于对移相要求较高的场合。
去抖+高精移相
只有PLL才能完成时钟的去抖,只有DCM才能完成精度较高的时钟移相,因此,如果需要同时对一个时钟信号进行去抖和高精度移相操作,就必须同时使用PLL和DCM两个模块,而它们之间的级联方式可以是PLL+DCM,也可以是DCM+PLL,即可以先去抖再移相,也可以先移相再去抖。
Summary
结合PLL和DCM模块可以实现时钟的去抖和高精度移相,满足更复杂的时钟信号处理需求。
时钟去延迟
时钟去延迟,即我们希望以某一时钟信号为基础,在另一个地方创造出一个和其频率、相位一模一样的新的时钟信号。
也许你会疑惑,既然频率、相位都没有改变,那么就将原来的时钟信号直接拿过来用就好了吧,为什么还需要创造一个新的呢?其实不然,任何从外部时钟源引入的时钟信号,由于输入管脚的传输延迟、时钟树的传输延迟等等,导致当它传递到相应的内部触发器或者再次传到FPGA片外的器件时,相位相比于外部时钟源已经产生了比较大的偏移。而如果使用这个时钟的FPGA内部或外部资源,需要采集与该外部时钟同源的数据时,这个偏移很可能会影响整个系统的正常工作,此时,时钟去延迟技术就非常必要。
时钟去延迟其实就是时钟移相功能中0°相移的一个特殊应用。因此PLL和DCM都能很好地完成它。
Summary
时钟去延迟技术通过时钟移相实现,确保时钟信号在FPGA内部或外部的相位一致性,避免因传输延迟引起的相位偏移问题。
时钟源切换
时钟源切换,即我们希望每次从多个时钟信号中选出一个做为参考基础,来创造出新的时钟信号。
时钟切换的情况也是比较常碰到的时钟处理需求,如果仅仅是需要切换时钟,那么多路选择器就可以完成这个功能,可是切换的目的是为了选择一个时钟作为参考基础来创造出新的时钟,就必须用到PLL或DCM。
PLL一般支持多个时钟信号的输入,然后通过选择信号来决定到底使能哪个时钟输入端;而DCM往往仅有一个时钟输入端,因此需要再结合多路选择器和额外的控制信号来实现。若备选的时钟数量较多,则无论是PLL还是DCM,都需要借助额外的逻辑。
要想真正实现时钟源的切换,其实比较复杂,远非加一些多路复用器或者控制逻辑就能够完成的,有些时候甚至是不可能实现的,原因如下:
对于PLL模块来说,即使待切换的若干个时钟源的频率范围全部满足CLKIN的需求,但是如果有一个无法满足初始PLL配置时的CLKMID或者CLKOUT的范围要求,那么切换了之后PLL将无法正常工作。
对于DCM模块来说,情况就更加复杂了。要保证多个时钟源能够正常切换,首先要保证这些个时钟如果独立用DCM处理时,DCM的DLL_FREQUENCY_MODE和DFS_FREQUENCY_MODE两个属性的取值必须完全一致;其次再保证这些待切换的时钟以及输出端口使用对DLL模式的开启或关闭要求一致;最后才是确保对应当前属性值时,CLKIN、CLKMID、CLKOUT的频率取值范围满足相应的范围需求。
例如,当使用DCM做时钟去延迟时,如果需要进行时钟源切换,那么若待切换时钟源中有100 MHz和200 MHz同时存在时,由于其对应的DLL_FREQUENCY_MODE分别为LOW和HIGH,则无法成功切换。
时钟源切换的一个扩展问题就是即使PLL或者DCM仅有一个时钟输入端,但若该时钟源的频率可跳变,那么PLL或DCM是否能够继续正常工作?其分析方法是一样的。
Summary
时钟源切换需要复杂的逻辑设计,尤其是在多种时钟源间切换时,需要考虑多个参数的一致性和兼容性,以确保时钟信号的稳定性和可靠性。
动态配置
动态可配置,即我们希望以某一时钟信号为基础,来创造出新的时钟信号,而该新的时钟信号的频率或者相位等,要求是动态可调整的,而不是每次修改都需要重新编译一次FPGA设计。
目前FPGA芯片中集成的PLL或者DCM资源基本上都是支持动态配置的。
动态配置在有些情况下是非常有效的,例如当我们的FPGA设计需要根据一个固定的时钟信号去采样一个或多个与其同频但不同相位的不固定时钟信号的时钟域所产生的数据时,就必须针对每个不固定的时钟域产生一个可用的时钟,这时PLL和DCM的动态配置功能就可以发挥非常重要的作用。
由于动态配置功能并不太常用,因此各个FPGA厂商虽然给出了配置端口的介绍和说明,但却没有详细公布PLL或DCM内部控制寄存器的地址、功能以及修改方法,因此如果需要在自己的FPGA设计中加入动态配置的功能,最好和相关的技术支持部门取得联系,并获得相应的寄存器说明及修改资料。
Summary
动态配置功能允许PLL和DCM在运行过程中调整时钟参数,提高FPGA设计的灵活性和适应性,但具体实现需要参考厂商的技术支持文档。
复位的设计
为什么FPGA设计中要有复位
当FPGA芯片上电工作时,我们的FPGA设计到底处于一个什么样的状态呢?这个还真说不准。有些厂商的FPGA芯片,其触发器、BLOCK RAM等记忆性单元,上电时默认为逻辑0;而另一些厂商的FPGA芯片,其触发器、BLOCK RAM等记忆性单元,上电时默认为逻辑1;甚至还有些厂商的FPGA芯片,其触发器、BLOCK RAM等记忆性单元,上电时默认的逻辑电平根本就不统一。试问,如果我们的FPGA设计不是一根筋通到底,那么从这样一个搞不清楚的初始状态开始工作,它的行为能靠谱么?即使我们在FPGA设计的HDL代码中对所有存储单元都进行了必要的初始化,但是这些初始化代码在实际中是否能够发挥和仿真时同样的作用,也得仰仗FPGA芯片的工艺。因此,为了确保系统能够从一个确定的状态开始工作,FPGA设计中必须要有一个复位信号。
因此,为了确保系统经历了一次问题后,FPGA设计的行为也能够再次恢复正常,采用复位信号是最简单、直接且有效的方案。
Summary
复位信号在FPGA设计中至关重要,它确保系统能够在确定的状态下启动和恢复,提高设计的可靠性和稳定性。