2.3 复位与时钟电路
2.3.1 关于FPGA器件的时钟
如图2.7所示,理想的时钟模型是一个占空比为50%且周期固定的方波。Tclk为一个时钟周期,T1为高脉冲宽度,T2为低脉冲宽度,Tclk=T1+T2。一般情况下,FPGA器件内部的逻辑会在每个时钟周期的上升沿执行一次数据的输入和输出处理,在两个时钟上升沿的空闲时间里,则可以用于执行各种各样复杂的处理。而一个比较耗时的复杂运算过程,往往无法在一个时钟周期内完成,可以切割成几个耗时较少的运算,然后在数个时钟上升沿后输出最终的运算结果。时钟信号的引入,不仅让所有的数字运算过程变成“可量化”的,而且也能够将各种不相关的操作过程同步到一个节拍上协同工作。
图2.7 理想时钟波形
FPGA器件的时钟信号源一般来自外部,通常使用晶体振荡器(简称晶振)产生时钟信号。当然,一些规模较大的FPGA器件内部都会有可以对时钟信号进行倍频或分频的专用时钟管理模块,如PLL或DLL。由于FPGA器件内部使用的时钟信号往往不只供给单个寄存器使用,在实际应用中,成百上千甚至更多的寄存器很可能共用一个时钟源,那么从时钟源到不同寄存器间的延时也可能存在较大偏差(通常称为时钟网络延时),大家知道,这个时间差过大是很严重的问题。因此,FPGA器件内部设计了一些称之为“全局时钟网络”的走线池。通过这种专用时钟网络走线,同一时钟到达不同寄存器的时间差可以被控制在很小的范围内。那么又如何能保证输入的时钟信号能够走“全局时钟网络”呢?有多种方式:对于外部输入的时钟信号,只要将晶振产生的时钟信号连接到“全局时钟专用引脚”上;而对于FPGA内部的高扇出控制信号,通常工具软件会自动识别此类信号,将其默认连接到“全局时钟网络”上,设计者若是不放心,还可通过编译报告进行查看,甚至可以手动添加这类信号。关于时钟电路的设计和选型,有如下基本事项需要考虑:
●系统运行的时钟频率是多少?(可能有多个时钟)
●是否有内部的时钟管理单元可用?(通常是有)它的输入频率范围为多少?(需要查看器件手册进行确认)
●尽可能选择专用的时钟输入引脚。
关于FPGA时钟电路的PCB Layout设计,通常需要遵循以下的原则:
●时钟晶振源应该尽可能放在与其连接的FPGA时钟专用引脚的临近位置。
●时钟线尽可能走直线。如果无法避免转弯走线,则使用45°线,尽量避免T型走线和直角走线。
●不要同时在多个信号层走时钟线。
●时钟走线不要使用过孔,因为过孔会导致阻抗变化及反射。
●靠近外层的地层能够最小化噪声。如果使用内层走时钟线,则要有良好的参考平面,且走带状线。
●时钟信号应该有终端匹配电路,以最小化反射。
●尽可能使用点到点的时钟走线。
●如图2.8所示,对于时钟差分对的走线,必须严格按照D>2S的规则,以最小化相邻差分对间的串扰。
图2.8 时钟差分对的间隔
●确保整个差分对在整个走线过程中的线间距恒定。
●确保差分对的走线等长,以最小化偏斜和相移。
●同一网络走线过程中避免使用多个过孔,以确保阻抗匹配和更低的感抗。
●高频的时钟和USB差分信号对走线尽可能短。
●高频时钟或周期性信号尽可能远离高速差分对以及任何引出的连接器(例如I/O连接器、控制和数据连接器或电源连接器)。
●应当保证所有走线有持续的地和电源参考平面。
●为了最小化串扰,尽量缩短高频时钟或周期性信号与高速信号并行走线的长度。推荐的最小间距是3倍的时钟信号与最近参考面间距。
●信号换层时使用回路过孔。
●同步时钟的延时应该与数据相匹配。确保时钟与同步数据总线在同一层走线,以最小化不同层之间的传输速率差异。
2.3.2 关于FPGA器件的复位
FPGA器件在上电后都需要有一个确定的初始状态,以保证器件内部逻辑快速进入正常的工作状态。因此,FPGA器件外部通常会引入一个用于内部复位的输入信号,这个信号称之为复位信号。对于低电平有效的复位信号,当它的电平为低电平时,系统处于复位状态;当它从低电平变为高电平时,则系统撤销复位,进入正常工作状态。由于在复位状态期间,各个寄存器都赋予输出信号一个固定的电平状态,因此在随后进入正常工作状态后,系统便拥有了所期望的初始状态。
复位电路的设计也很有讲究,一般的设计是期望系统的复位状态能够在上电进入稳定工作状态后多保持一点时间。因此,阻容复位电路可以胜任一般的应用;如果需要得到更稳定可靠的复位信号,则可以选择一些专用的复位芯片。复位信号和FPGA器件的连接也有讲究,通常也会有专用的复位输入引脚。
至于上电复位延时的长短,也是很有讲究的。因为FPGA器件是基于RAM结构的,它通常需要一颗用于配置的外部ROM或Flash进行上电加载,在系统上电稳定后,FPGA器件首先需要足够的时间用于配置加载操作,只有在这个过程结束之后,FPGA器件才能够进入正常的用户运行模式。如果上电复位延时过短,等同于FPGA器件根本就没有复位过程;如果上电复位延时过长,那么对系统性能甚至用户体验都会有不同程度的影响,因此,设计者在实际电路中必须对此做好考量,保证复位延时时间的长短恰到好处。关于FPGA器件的复位电路,也需要注意以下几个要点:
●尽可能使用FPGA的专用时钟或复位引脚。
●对上电复位时间的长短需要做好考量。
●确保系统正常运行过程中复位信号不会误动作。
2.3.3 实验平台电路解析
FPGA的时钟输入都有专用引脚,通过这些专用引脚输入的时钟信号,在FPGA内部可以很容易地连接到全局时钟网络上。所谓全局时钟网络,是FPGA内部专门用于走一些有高扇出、低时延要求的信号的走线池,这样的资源相对有限,但是非常实用。FPGA的时钟和复位通常是需要走全局时钟网络的。
如图2.9所示,25MHz有源晶振和阻容复位电路产生的时钟信号和复位信号分别连接到FPGA的专用时钟输入引脚CLK_0和CLK_1上。
图2.9 复位与时钟电路示意图
如图2.10所示,所使用的FPGA器件共有8个专用时钟输入引脚,在不作时钟输入引脚功能使用时,这些引脚也可以作为普通I/O引脚。如我们的电路中,只使用了CLK_0和CLK_1作为专用时钟引脚功能,其他6个引脚则作为普通的I/O引脚功能。
图2.10 时钟专用输入引脚
FPGA上电复位时间需要大于FPGA器件启动后的配置加载时间,这样才能够确保FPGA运行后的复位初始化过程有效。可以来看看这个电路的设计是否满足实际要求。
查询器件手册中关于上电配置时间的计算,有如下的公式:
配置数据量*(最低的DCLK时钟周期/bit)=最大的配置时间
其中,所使用FPGA器件EP4CE6的配置数据量为2944088位,最低的SPI Flash传输时钟DCLK通常为20MHz(经实测,一般情况下,DCLK时钟频率为32MHz),那么由此便可计算出最大的配置时间为:2944088bit*(50ns/bit)=148ms。
另外,从器件手册上,可以查询到复位输入引脚作为3.3V LVTTL标准电平的最低VIH电压值是1.7V,由此便可计算阻容复位电路从0V上升到1.7V所需的时间。
设V0为电容上的初始电压值,V1为电容最终可充到或放到的电压值,Vt为t时刻电容上的电压值。则有公式t=RC*Ln[(V1-V0)/(V1-Vt)]。求充电到1.7V的时间。
将已知条件V0=0V,V1=3.3V,Vt=1.7V代入上式得1.7=0+3.3*[1-exp(-t/RC)],算得t=0.7239RC。
代入R=47kΩ,C=10μF,得t=0.34s,即340ms。
由此验证了阻容复位的时间远大于FPGA器件的上电复位时间。当然,这里没有考虑FPGA器件从上电到开始配置运行所需的电压上升时间,一般这个时间不会太长,所以阻容复位肯定是有效的。如果需要实际的确认,还是要通过示波器设备来观察实际信号的延时情况。