2.1.3 状态初始——复位电路
FPGA器件在上电后都需要有一个确定的初始状态,以保证器件内部逻辑快速进入正常的工作状态。因此,FPGA器件外部通常会引入一个用于内部复位的输入信号,这个信号称之为复位信号。对于低电平有效的复位信号,当它的电平为低电平时,系统处于复位状态;当它从低电平变为高电平时,则系统撤销复位,进入正常工作状态。由于在复位状态期间,各个寄存器都赋予输出信号一个固定的电平状态,因此在随后进入正常工作状态后,系统便拥有了我们所期望的初始状态。
复位电路的设计也很有讲究,一般的设计是期望系统的复位状态能够在上电进入稳定工作状态后多保持一点时间。因此,阻容复位电路可以胜任一般的应用;而需要得到更稳定可靠的复位信号,则可以选择一些专用的复位芯片。复位信号和FPGA器件的连接也有讲究,通常也会有专用的复位输入引脚。
至于上电复位延时的长短,也是很有讲究的。因为FPGA器件是基于RAM结构的,它通常需要一颗用于配置的外部ROM或Flash进行上电加载,在系统上电稳定后,FPGA器件首先需要足够的时间用于配置加载操作,只有在这个过程结束之后,FPGA器件才能够进入正常的用户运行模式。而上电复位延时过短,等同于FPGA器件根本就没有复位过程;当然了,如果上电复位延时过长,那么对系统性能甚至用户体验都会有不同程度的影响,因此,设计者在实际电路中必须对此做好考量,保证复位延时时间的长短恰到好处。关于FPGA器件的复位电路,我们也需要注意以下几个要点:
·尽可能使用FPGA的专用复位引脚。
·上电复位时间的长短需要做好考量。
·确保系统正常运行过程中复位信号不会误动作。
2.1.4 灵活定制——配置电路
20世纪80年代,联合测试行为组织(Joint Test Action Group,JTAG)制定了主要用于PCB和IC的边界扫描测试标准。该标准于1990年被IEEE批准为IEEE 1149.1-1990测试访问端口和边界扫描结构标准。随着芯片设计和制造技术的快速发展,JTAG越来越多地被用于电路的边界扫描测试和可编程芯片的在线系统编程。
FPGA器件都支持JTAG进行在线配置,JTAG边界扫描的基本原理如图2-7所示。在FPGA器件内部,边界扫描寄存器由TDI信号作为数据输入,TDO信号作为数据输出,形成一个很大的移位寄存器链。而JTAG通过整个寄存器链,可以配置或者访问FPGA器件的内部逻辑状态或者各个I/O引脚的当前状态。
在这里我们不过多研究JTAG的原理。对于电路设计来说,JTAG的四个信号TCK/TMS/TDI/TDO(TRST信号一般可以不用)以及电源、地连接到下载线即可。
说到FPGA的配置,这里不得不提一下它们和CPLD内部存储介质的不同。CPLD由于大多是基于PROM或Flash来实现可编程特性,因此对它们进行在线编程时就已将配置数据流固化好了,重新上电后还能够运行固有的配置数据。FPGA大多是基于SRAM来实现可编程特性,换句话说,通过JTAG实现在线编程时,在保持不断电的情况下,FPGA能够正常运行,而一旦掉电,SRAM数据丢失,FPGA则一片空白,无法继续运行任何既定功能。因此,FPGA通常需要外挂一个用于保存当前配置数据流的PROM或Flash芯片,我们通常称之为“配置芯片”,CPLD则不需要。
因此,对于FPGA器件,我们若希望它产品化,可以脱机(PC机)运行,那么就必须在板级设计时考虑它的配置电路。也不用太担心,其实FPGA厂商的器件手册里也会给出推荐的配置芯片和参考电路,大多情况下“依葫芦画瓢”便可。当然了,板级设计还是马虎不得的,有如下几个方面是需要注意的:
·配置芯片尽量靠近FPGA。
·考虑配置信号的完整性问题,必要时增加阻抗匹配电阻。
·部分配置引脚可以被复用,但是要谨慎使用,以免影响器件的上电配置过程。
FPGA配置电路的设计是非常重要的,相关信号引脚通常都是固定并且专用的,需要参考官方推荐电路进行连接。
2.1.5 自由扩展——外设电路(I/O应用)
FPGA器件拥有着丰富的I/O资源,它的可扩展性非常强,这也是我们使用它的一个很重要原因。如果说前面四个部分电路的设计相对而言都比较固定,那么I/O引脚应用则相对要自由很多。当然了,这里所谓的“自由”,并不意味电路设计的随意,而是针对电路设计丰富的可选择性而言的。话说回来,这里的“自由”也还是要建立在一定的基础之上的。笔者根据多年的工程经验,对于I/O与外设的连接扩展,归纳出了以下要点:
·输入和输出时钟信号尽量分配到专用的引脚上。
·差分信号对必须分配到支持差分传输的专用引脚上。
·高速信号分配到支持高速传输的专用引脚上,如支持DDR的专用I/O接口。
·一些硬核使用的引脚可能是固定的,千万不能随意分配。
·总线信号尽量分配到同一个bank或者相近的bank中。
·一些可能产生噪声干扰的信号(如时钟信号)尽量远离器件的配置信号和其他敏感信号。
·引脚分配时尽可能减少交叉连接。
2.2 FPGA核心电路板设计
前面花了不少篇幅准备理论知识,接下来就要开始动手实践了。我们的硬件平台是核心板+子板结构,非常方便灵活,玩上手了会有种“FPGA版乐高积木”的感觉。信不信由你,反正我是玩出了点味道。闲话少说,FPGA核心电路板的板级硬件设计电路马上呈现。
2.2.1 硬件整体架构设计
如图2-8所示,FPGA核心板电路架构主要有电源电路和数字电路两个部分。电源电路部分是一些基本的供电元器件,如电源插座、电源开关、电源指示灯以及LDO电源电路。数字电路则以Altera Cyclone IV FPGA为核心,25MHz的时钟晶振和RC电路产生的复位信号作为FPGA运行的最基本信号源;FPGA的I/O引脚外接一个指示灯,便于指示其工作状态;JTAG插座用于FPGA的在线配置以及其他多种FPGA配置方式的实现;64Mbit的SPI Flash用于存储FPGA的配置数据,PC可以通过JTAG插座和FPGA本身实现对这颗SPI Flash的固化;128M×8bit的NAND Flash和32M×16bit的DDR2 SDRAM和FPGA可以构成一个基本的嵌入式系统,在后续的例程中它们大有用处;3个32PIN的标准插座可用于外接FPGA子板,进行各种外设功能的扩展。
2.2.2 电源电路设计
如图2-9所示,J1为FPGA的电源插座,SW1为电源开关,都是市面上最常见的元件,D2则是电源指示灯,当开关SW1闭合时,D2点亮,指示当前系统供电状态。
由于我们所选择的Cyclone IV系列FPGA器件整体功耗并不大,因此可获得更好的低纹波电源性能,如图2-10所示,我们使用了4颗LDO产生FPGA所需要的3.3V、2.5V、1.8V和1.2V四档电压。
如图2-11所示,从Cyclone IV器件手册中可以查到,Cyclone IV系列器件的供电一般分4大类,压值有3~4档(可能更多档,这主要取决于不同bank的I/O电压是否有特殊供电需求)。这4类电源分别是内核电压VCCINT、I/O电压VCCI/O、PLL模拟电压VCCA和PLL数字电压VCCD_PLL。这4类电源电压中,内核电压固定1.2V、PLL模拟电压固定2.5V、PLL数字电压固定1.2V;唯一不确定,或者说有选择余地的电源是I/O电压,它可以根据用户实际应用所需要的I/O标准选择不同的电压,我们的板子由于需要使用DDR2 SDRAM,它所连接的FPGA bank对应的I/O电压是1.8V,其他的bank都使用最常见的3.3V电压供电。
说到I/O电压,我们不得不多提两句,毕竟可以兼容非常多的I/O电压标准是FPGA的一大优势,尤其是各种高速差分信号的支持。图2-12中列出了我们这款器件支持的各种I/O电平标准。方形框出的3.3-V LVTTL和SSTL-18 Class I则是我们这款FPGA核心板中实际使用的I/O电平标准。
FPGA的供电电路如图2-13和图2-14所示。在FPGA的供电电路中,每1~2个电源引脚我们都配有1个去耦电容。当然了,在空间允许的情况下,每个电源引脚尽量都就近放置去耦电容。
关于FPGA电源电路的PCB Layout设计,通常需要遵循以下的原则。
·完整的或分割的电源层都应该就近与其对应的地层。
·电源层和地层之间的绝缘层应该尽可能的薄,以增强耦合电容与平面电容(通常取3~4mil)。
·为了最小化电感值,电源引脚应当就近直接连到相应的电源层。避免器件的电源引脚与供电源端或电源层之间的走线宽度过窄。板级设计者应该多参考电源芯片厂商提供的设计指南。
·电源分割线的间距应该在25~100mil。
·不同电源引脚不能够共用一个过孔。换句话说,每个电源引脚都应该至少有一个专用的过孔连接到电源层。
2.2.3 时钟与复位电路设计
FPGA的时钟输入都有专用引脚,通过这些专用引脚输入的时钟信号,在FPGA内部可以很容易地连接到全局时钟网络上。所谓的全局时钟网络,是FPGA内部专门用于走一些有高扇出、低时延要求的信号,这样的资源相对有限,但是非常实用。FPGA的时钟和复位通常是需要走全局时钟网络的。如图2-15所示,这是Cyclone IV器件的内部全局时钟网络的布局示意图。如果说一个城市当中的各种羊肠小道、普通马路是FPGA器件内部的一般布线资源,那么我们就可以认为FPGA内部的全局时钟网络就是高架路(高速公路)。图2-15中我们也不难发现,除了FPGA外部的一些专用时钟引脚,PLL的输出以及FPGA内部的一些信号也都可以连接到FPGA的全局布线网络上。
时钟和复位电路如图2-16所示。外部使用了25MHz的有源晶振,连接FPGA的专用时钟输入引脚,FPGA内部的PLL可以将外部时钟频率进行倍频或分频,甚至进行相位的调整。复位使用简单的RC电路,也是连接到FPGA的专用输入时钟引脚,走内部全局时钟网络。
FPGA上电复位时间需要大于FPGA器件启动后的配置加载时间,这样才能够确保FPGA运行后的复位初始化过程有效。因此,我们也可以来看看这个电路的设计是否满足实际要求。
如图2-17所示,这是器件手册中关于上电配置时间的计算公式。
如图2-18所示,我们所使用的EP4CE22器件的配置数据量为5748552bits。
我们实测当SPI Flash对FPGA进行配置时的时钟为32MHz。由此我们便可以计算配置所需的时间,取最坏的情况,即配置时钟频率在最低情况下,配置所需时间为:5748552bits* (31.25ns/1bit)=180ms。
如图2-19所示,这里标示了复位输入引脚作为3.3-V LVTTL标准电平的最低VIH电压值是1.7V,那么可以由此计算阻容复位电路从0V上升到1.7V所需的时间。
设V0为电容上的初始电压值;V1为电容最终可充到或放到的电压值;Vt为t时刻电容上的电压值。则有公式t=RC×Ln[(V1-V0)/(V1-Vt)]。求充电到1.7V的时间。将已知条件V0=0,V1=3.3V,Vt=1.7V代入上式得:1.7=0+3.3×[[1-exp(-t/RC)],算得t=0.7239RC。
代入R=47k,C=10uf得t=0.34s,即340ms。
由此我们验证了阻容复位的时间远大于FPGA器件的上电复位时间。当然了,这里没有考虑FPGA器件从上电到开始配置运行所需的电压上升时间,一般这个时间不会太长。所以我们的阻容复位肯定是有效的。如果需要实际的确认,还是要通过示波器设备来辅助观察实际信号的延时情况。
关于FPGA时钟电路的PCB Layout设计,通常需要遵循以下原则:
·时钟晶振源应该尽可能放在与其连接的FPGA时钟专用引脚的临近位置。
·时钟线尽可能走直线。如果无法避免转弯走线,使用45度线,尽量避免T型走线和直角走线。
·不用同时在多个信号层走时钟线。
·时钟走线不要使用过孔,因为过孔会导致阻抗变化及反射。
·靠近外层的地层能够最小化噪声。如果使用内层走时钟线,要有良好的参考平面,且走带状线。
·时钟信号应该有终端匹配电路,以最小化反射。
·尽可能使用点到点的时钟走线。
·如图2-20所示,对于时钟差分对的走线,必须严格按照D>2S规则,以最小化相邻差分对间的串扰。
·确保整个差分对在整个走线过程中的线间距恒定。
·确保差分对的走线等长,以最小化偏斜和相移。
·同一网络走线过程中避免使用多个过孔,以确保阻抗匹配和更低的感抗。
·高频的时钟和USB差分信号对走线尽可能短。
·高频时钟或周期性信号尽可能远离高速差分对以及任何引出的连接器(例如I/O连接器、控制和数据连接器或电源连接器)。
·应当保证所有走线有持续的地和电源参考平面。
·为了最小化串扰,尽量缩短高频时钟或周期性信号与高速信号并行走线的长度。推荐的最小间距是3倍的时钟信号与最近参考面间距。
·当一个时钟驱动多个负载时,使用低阻抗传输线以确保信号通过传输线。
·信号换层时使用回路过孔。
·同步时钟的延时应该与数据相匹配。确保时钟与同步数据总线在同一层走线,以最小化不同层之间的传输速率差异。