第2章 FPGA板级电路设计

本章导读

本书所论及的所有实践工程将基于一套由多个电路板组成的FPGA开发平台,这套开发平台既有以Altera Cyclone IV FPGA为基础的核心板,也有诸如AD/DA、UART、USB2.0、CMOS摄像头、AV解码器、工业液晶屏接口、触摸屏接口、VGA接口、HDMI接口等外设为主的子板。本章将对基于FPGA的最小系统的各个设计要素进行讨论,同时也会对我们将要使用的这套开发平台的各个电路板进行简要的介绍,同时也会穿插着对电路设计的要点进行论述。

2.1 FPGA板级电路设计五要素

和纯粹基于PC的各种软件编程不同,FPGA器件的学习仅靠一台PC是不够的。对于任何一个学习者而言,能够拥有一块板载FPGA器件的电路板平台是非常必要的。当然了,前期的开发调试肯定还是离不开PC的。和基于PC的软件编程(如在Visual C++工具上实现C/C++语言的编程,在各种网络编程工具上实现.net/java语言的编程)相同的是,可编程器件的开发也有专用的语言(目前主流的语言是Verilog和VHDL)和专用的开发工具(如Xilinx公司的开发工具ISE/Vivado, Altera公司的开发工具Quartus II以及其他的第三方工具)。不同点也显而易见,PC的软件编程由于最终就是实现在PC本地或者网络上,那么它就不需要开发者配备额外的设备;而基于FPGA器件的开发,其最终的功能是需要实现在特定的FPGA器件内部的,因此开发者势必需要首先具备载有FPGA器件的一块电路板。除此以外,还需要具备一条用于连接PC和可编程器件的用于传输配置数据流的连接线,我们通常称此连接线为“下载线”。

如图2-1所示,对于任何一个FPGA开发者而言,一条下载线和一块板载FPGA器件的电路板应该说是最基本的硬件配备了。电路板的作用不言而喻,我们设计的目的便是希望通过对板载的FPGA器件编程,以控制电路板上的其他外设按照我们既定的功能运转;而下载线是起到连接PC和电路板的作用,它将协助开发人员将已经在PC的软件工具上预先设计好的功能配置数据流固化到电路板的FPGA器件中(可用于前期的开发、调试以及产品化后的升级)。

图2-1 下载线和电路板

既然需要一块板载FPGA器件的电路板,那么这块电路板该如何设计呢?如图2-2和图2-3所示,分别为Xilinx公司最新的Zynq Soc FPGA开发板和Altera公司最新的Cyclone V Soc FPGA开发板。乍一看,整齐有序且美观大方,丰富的外设资源,恐怕大伙都要垂涎三尺了,而要咱们初学者也DIY一个,那真叫“比骆驼穿过针的眼还难”。

图2-2 Xilinx —— Zynq Soc FPGA开发板

图2-3 Altera —— Cyclone V Soc FPGA开发板

别心慌,先抛开电路板各种各样复杂的外设功能,我们可以先探讨一下单纯实现一片FPGA器件的核心电路(即能让FPGA工作起来的最基本且元器件最少的电路)是如何设计的。相比于其他嵌入式系统芯片的电路设计,单纯的FPGA核心电路其实还算是非常简单的。根据过往的设计经验,笔者简单地将FPGA核心电路归纳为五部分:电源电路、时钟电路、复位电路、配置电路和外设电路,我们姑且称之为五要素。下面我们将逐一探讨各个要素在FPGA器件的运行中扮演的角色及其常规电路的设计方式。

2.1.1 能量供应——电源电路

自然界的任何生物体都需要有能量的供应,人需要吃饭喝水、花草树木需要阳光雨露、鸟兽虫鱼也都有可食之物。人工智能也是如此,炉灶需要煤气、汽车需要加油、亮灯需要供电……小小的芯片工作起来也离不开能量的供给。

FPGA器件需要有电源电压的能量供应才能工作。尤其对于规模较大的器件,其功耗也相对较高,其供电系统的好坏将直接影响到整个开发系统的稳定性。所以,设计出高效率、高性能的FPGA供电系统具有极其重要的意义。

不同的FPGA器件、不同的应用方式会有不同的电压电流的需求。如图2-4所示,简单归纳,可以将FPGA器件的电压需求分为三类:核心电压、I/O电压和辅助电压。

图2-4 供电电压

核心电压是FPGA内部各种逻辑电路正常工作运行所需要的基本电压,该电压用于保证FPGA器件本身的工作。通常选定某一款FPGA器件,其核心电压一般也都是一个固定值,不会因为电路的不同应用而改变。核心电压值可以从官方提供的器件手册中找到。

I/O电压顾名思义便是FPGA的I/O引脚工作所需的参考电压。在引脚排布上,FPGA与ASIC最大的不同,便是FPGA所有的可用信号引脚基本都可以作为普通I/O使用,其电平值的高低完全由器件内部的逻辑决定。当然了,它的高低电平标准也受限于所供给的I/O电压。任何一片FPGA器件,它的I/O引脚通常会根据排布位置分为多个bank。同一个bank内的所有I/O引脚所供给的I/O电压是共用的,可以给不同的bank提供不同的I/O电压,它们彼此是不连通的。因此,不同bank的不同I/O电压为FPGA器件的不同接口应用提供了灵活性。这里举一个例子,Cyclone III系列器件的某些bank支持LVDS差分电平标准,此时器件手册会要求设计者给用于LVDS差分应用的bank的I/O电压供1.5V电压,这就不同于一般的LVTTL或LVCOMS的3.3V供电需求。而一旦这些用于LVDS传输的I/O bank电压供给为1.5V,那么它就不能作为3.3V或其他电平值标准传输使用了。

除了前面提到的核心电压和I/O电压,FPGA器件工作所需的其他电压我们通常都称为辅助电压。例如FPGA器件下载配置所需的电压,当然了,这里的辅助电压值可能与核心电压值或I/O电压值是一致的。很多FPGA的PLL功能块的供电会有特殊要求,也可以认为是辅助电压。由于PLL本身是模拟电路,而FPGA其他部分的电路基本是数字电路,因此PLL的输入电源电压也很有讲究,需要专门的电容电路做滤波处理,而它的电压值一般和I/O电压值不同。

目前比较常见的供电解决方案主要是LDO稳压器、DC/DC芯片或电源模块。LDO稳压器为电流输出要求不高的应用提供了简单廉价的解决方案;而基于DC/DC芯片的解决方案能够保证较高的电源转换效率,散热容易一些,输出电流也更大,是大规模FPGA器件的最佳选择;而电源模块简单实用并且能够有更稳定的性能,只不过价格通常比较昂贵,在成本要求不敏感的情况下,是FPGA电源设计的一种最为简单快捷的解决方案。总而言之,对于电源方案的选择以及电源电路的设计,一定要事先做好前期的准备工作,如以下几点是必须考虑的:

❏ 器件需要供给几档电压,压值分别是多少?

❏ 不同电压档的最大电流要求是多少?

❏ 不同电压档是否有上电顺序要求?(大部分的FPGA器件是没有此项要求的)

❏ 电源去耦电容该如何分配和排布?

❏ 电源电压是否需要设计特殊的去耦电路?

关于设计者需要确定的各种电气参数以及电源设计的各种注意事项,其实在器件厂商提供的器件手册(handbook)、应用笔记(application notes)或是白皮书(white paper)中一般都会给出参考设计。所以,设计者若希望能够较好地完成FPGA器件的电源电路设计,事先阅读大量的官方文档是必须的。

说到电源,也不能不提一下地端(GND)电路的设计,FPGA器件的地信号通常是和电压配对的。一般应用中,统一共地连接是没有问题的,但也需要注意特殊应用中是否有隔离要求。FPGA器件的引脚引出的地信号之间通常是导通的,当然也不能排除有例外的情况。如果漏接个别地信号,器件通常也能正常工作,但是笔者也遇到过一些特殊的状况,如Altera的Cyclone III器件底部的中央有个接地焊盘,如果设计中忽略了这个接地信号,那么FPGA很可能就不干活了,因为这个地信号是连接FPGA内部的很多中间信号的地端,它并不和FPGA的其他地信号直接导通。因此,在设计中也一定要留意地信号的连接,电源电路的任何细小疏忽都有可能导致器件的罢工。

2.1.2 心脏跳动——时钟电路

人体拥有非常奇妙的循环系统,而心脏是这个循环系统的发动机,它向全身各部位供应血液。如图2-5所示,心脏有四个空腔,上面两个叫心房(atrium),下面两个叫心室(ventric1e)。右心房收纳全身的静脉血,通过右心室从肺动脉泵出,此时肺动脉中流的是静脉血,通过肺中的气体交换,变成含氧丰富的动脉血,由肺静脉送至左心房,再通过左心室的主动脉泵向全身各个组织器官以满足其正常生理活动的需要。这便是人体无时无刻不在进行着的心跳过程。

图2-5 心脏示意图

了解了心脏之于人体内部循环系统的作用,反观时钟信号之于FPGA器件,其实也有着异曲同工之妙。伴随着每一次的心跳过程,都有血液的运转和流动;同样的,伴随着每一个时钟脉冲的产生,也都有数字信号的输入和输出。对于在FPGA器件内实现的任何时序逻辑应用,失去了时钟信号便意味着信号的传输将处于停滞状态。时钟信号的重要性可见一斑。

如图2-6所示,理想的时钟模型是一个占空比为50%且周期固定的方波。Tc l k为一个时钟周期,T1为高脉冲宽度,T2为低脉冲宽度,Tc l k=T 1+T 2。一般情况下,FPGA器件内部的逻辑会在每个时钟周期的上升沿执行一次数据的输入和输出处理,而在两个时钟上升沿的空闲时间里,则可以用于执行各种各样复杂的处理。而一个比较耗时的复杂运算过程,往往无法在一个时钟周期内切割成几个耗时较小的运算,然后在数个时钟上升沿后输出最终的运算结果。时钟信号的引入,不仅让所有的数字运算过程变成“可量化”的,而且也能够将各种不相关的操作过程同步到一个节拍上协同工作。

图2-6 理想时钟波形

FPGA器件的时钟信号源一般来自外部,我们通常使用晶体振荡器(简称晶振)产生时钟信号。当然了,一些规模较大的FPGA器件内部都会有可以对时钟信号进行倍频或分频的专用时钟管理模块,如PLL或DLL。由于FPGA器件内部使用的时钟信号往往不只是供给单个寄存器使用,因为在实际应用中,成百上千甚至更多的寄存器很可能共用一个时钟源,那么从时钟源到不同寄存器间的延时也可能存在较大偏差(我们通常称为时钟网络延时),而我们知道,这个时间差过大是很要命的。因此,FPGA器件内部设计了一些称之为“全局时钟网络”的走线池。通过这种专用时钟网络走线,同一时钟到达不同寄存器的时间差可以被控制到很小的范围内。而我们又如何能保证输入的时钟信号能够走“全局时钟网络”呢?有多种方式,对于外部输入的时钟信号,只要将晶振产生的时钟信号连接到“全局时钟专用引脚”上;而对于FPGA内部的高扇出控制信号,通常工具软件会自动识别此类信号,将其默认连接到“全局时钟网络”上,而设计者若是不放心,也可通过编译报告进行查看,甚至可以手动添加这类信号。关于时钟电路的设计和选型,有如下几个基本事项需要考虑:

❏ 系统运行的时钟频率是多少?(可能有多个时钟)

❏ 是否有内部的时钟管理单元可用(通常是有)?它的输入频率范围是多少(需要查看器件手册进行确认)?

❏ 尽可能选择专用的时钟输入引脚。

❏ 时钟走线尽可能短,有条件最好做包地处理,确保外部输入时钟信号干净、稳定。

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引脚的当前状态。

图2-7 JTAG边界扫描原理

在这里我们不过多研究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-8 FPGA核心板电路架构

2.2.2 电源电路设计

如图2-9所示,J1为FPGA的电源插座,SW1为电源开关,都是市面上最常见的元件,D2则是电源指示灯,当开关SW1闭合时,D2点亮,指示当前系统供电状态。

图2-9 FPGA电源插座电路

由于我们所选择的Cyclone IV系列FPGA器件整体功耗并不大,因此可获得更好的低纹波电源性能,如图2-10所示,我们使用了4颗LDO产生FPGA所需要的3.3V、2.5V、1.8V和1.2V四档电压。

图2-10 FPGA四档电源电压产生电路

如图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电压供电。

图2-11 Cyclone IV系列器件的供电标准

说到I/O电压,我们不得不多提两句,毕竟可以兼容非常多的I/O电压标准是FPGA的一大优势,尤其是各种高速差分信号的支持。图2-12中列出了我们这款器件支持的各种I/O电平标准。方形框出的3.3-V LVTTL和SSTL-18 Class I则是我们这款FPGA核心板中实际使用的I/O电平标准。

图2-12 Cyclone IV FPGA所支持的各种电平标准

FPGA的供电电路如图2-13和图2-14所示。在FPGA的供电电路中,每1~2个电源引脚我们都配有1个去耦电容。当然了,在空间允许的情况下,每个电源引脚尽量都就近放置去耦电容。

图2-13 FPGA PLL供电电路

图2-14 FPGA I/O和核压供电电路

关于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-15 FPGA全局时钟网络

时钟和复位电路如图2-16所示。外部使用了25MHz的有源晶振,连接FPGA的专用时钟输入引脚,FPGA内部的PLL可以将外部时钟频率进行倍频或分频,甚至进行相位的调整。复位使用简单的RC电路,也是连接到FPGA的专用输入时钟引脚,走内部全局时钟网络。

图2-16 FPGA时钟和复位电路

FPGA上电复位时间需要大于FPGA器件启动后的配置加载时间,这样才能够确保FPGA运行后的复位初始化过程有效。因此,我们也可以来看看这个电路的设计是否满足实际要求。

如图2-17所示,这是器件手册中关于上电配置时间的计算公式。

图2-17 器件手册中AS配置时间计算公式的截图

如图2-18所示,我们所使用的EP4CE22器件的配置数据量为5748 552bits。

图2-18 器件手册中配置数据存储量的截图

我们实测当SPI Flash对FPGA进行配置时的时钟为32MHz。由此我们便可以计算配置所需的时间,取最坏的情况,即配置时钟频率在最低情况下,配置所需时间为:5748 552bits*(31.25ns/1bit)= 180ms。

如图2-19所示,这里标示了复位输入引脚作为3.3-V LVTTL标准电平的最低VIH电压值是1.7V,那么可以由此计算阻容复位电路从0V上升到1.7V所需的时间。

图2-19 器件手册中I/O电平标准的截图

V0为电容上的初始电压值;V1为电容最终可充到或放到的电压值;Vtt时刻电容上的电压值。则有公式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规则,以最小化相邻差分对间的串扰。

图2-20 时钟差分对的间隔

❏ 确保整个差分对在整个走线过程中的线间距恒定。

❏ 确保差分对的走线等长,以最小化偏斜和相移。

❏ 同一网络走线过程中避免使用多个过孔,以确保阻抗匹配和更低的感抗。

❏ 高频的时钟和USB差分信号对走线尽可能短。

❏ 高频时钟或周期性信号尽可能远离高速差分对以及任何引出的连接器(例如I/O连接器、控制和数据连接器或电源连接器)。

❏ 应当保证所有走线有持续的地和电源参考平面。

❏ 为了最小化串扰,尽量缩短高频时钟或周期性信号与高速信号并行走线的长度。推荐的最小间距是3倍的时钟信号与最近参考面间距。

❏ 当一个时钟驱动多个负载时,使用低阻抗传输线以确保信号通过传输线。

❏ 信号换层时使用回路过孔。

❏ 同步时钟的延时应该与数据相匹配。确保时钟与同步数据总线在同一层走线,以最小化不同层之间的传输速率差异。

2.2.4 配置电路设计

我们所说的FPGA配置电路,一方面要完成从PC上把bit文件下载到FPGA或存储器的任务,另一方面则要完成FPGA上电启动时加载配置数据的任务。在开始设计FPGA的配置电路之前,我们不妨用一些篇幅简单了解一下FPGA的配置过程和配置方式。

大多数FPGA器件都是基于RAM结构的,当然了,也有基于Flash结构的,但RAM结构的是主流,也是我们讨论的重点。而RAM是易失存储器,在掉电后保存在上面的数据就丢失了,重新上电后需要再次加载配置数据。因此,我们肯定不希望每次重新上电后都用PC去加载一次,工程应用也不允许我们这么做。所以,FPGA旁边都有一颗配置芯片,它通常是一颗Flash存储器。不管是串行还是并行的Flash,它们的启动加载原理基本相同。

为避免混淆,这里对FPGA的下载配置和启动配置做一点区分。FPGA器件的下载配置,是指将PC上的FPGA配置数据流通过下载线缆烧录到FPGA或者Flash存储器中。而FPGA器件的启动配置,则是指将配置数据流从PC或者Flash存储器中加载到FPGA内,使其运行起来。

FPGA器件的下载配置,最常见的是基于JTAG的配置方式,这种方式既可以直接将PC上的配置数据流加载到FPGA上在线运行,也可以通过FPGA器件本身间接地将数据烧录到Flash等外部配置芯片中。另一种下载配置是将配置数据流直接下载到配置芯片中。由于JTAG方式灵活多用,尤其是在线调试非常快速便利,因此我们的FPGA核心板电路中就只预留了JTAG接口。

FPGA器件的启动配置主要有JTAG方式、AS和PS配置方式。

AS配置方式由FPGA器件引导配置过程,它控制着外部存储器及其初始化过程。FPGA器件处于主动地位,配置器件处于从属地位。配置数据通过DATA0引脚送入FPGA。配置数据被同步在DCLK输入上,1个时钟周期传送1位数据。

PS配置方式则由PC或其他控制器控制配置过程。在PS配置期间,配置数据从外部储存器件通过DATA0引脚送入FPGA。配置数据在DCLK上升沿锁存,1个时钟周期传送1位数据。

JTAG接口是一个业界标准,主要用于芯片测试等功能,使用IEEE Std 1149.1联合边界扫描接口引脚,支持JAM STAPL标准,可以使用Altera下载电缆或主控器来完成。

FPGA在正常工作时,它的配置数据存储在RAM中,加电时须重新下载。在实验系统中,通常用计算机或控制器进行调试,因此可以使用PS配置方式。在实用系统中,多数情况下必须由FPGA主动引导配置操作过程,这时FPGA将主动从外围专用存储芯片中获得配置数据,而此芯片中FPGA配置信息是用普通编程器将设计所得的pof格式的文件烧录进去。

JTAG模式在线下载FPGA的原理如图2-21所示,PC端的Quartus II软件通过下载线缆将配置数据流(sof文件)下载到FPGA内部,下载完成后在FPGA中立刻执行下载代码,速度很快,非常适合调试。

图2-21 JTAG方式下载配置过程

FPGA下载数据到配置芯片的原理如图2-22所示,PC端的Quartus II软件通过下载线缆将配置数据流(jic文件)下载到配置芯片中。由于配置芯片和JTAG接口都是分别连接到FPGA的,它们不是直接连接的,所以配置文件先从PC传送到FPGA,然后FPGA内部再转送给配置芯片,在该过程中FPGA相当于起到一个桥接的作用。

图2-22 JTAG方式下载数据到配置芯片

看完JTAG模式下在线配置FPGA和烧录配置芯片的原理,我们再了解一下FPGA上电初始的配置过程。FPGA上电后,内部的控制器首先工作,确认当前的配置模式,如果是外部配置芯片启动,则通过和外部配置芯片的接口(如我们的SPI接口)将配置芯片的数据加载到FPGA的RAM中,配置完成后开始正式运行。当然了,有人可能在想,JTAG在线配置是否和配置芯片加载相冲突呢?非也,JTAG在线配置的优先级是最高的,无论此时FPGA中在运行什么逻辑,只要JTAG下载启动,则FPGA便停下当前的工作,开始运行JTAG下载的新的配置数据。

先看器件手册中给出的一些相关参考设计,如图2-23所示,这是FPGA和用于配置的SPI Flash的接口连接方式,即我们所说的AS配置方式。注意FPGA的几个主要引脚nSTATUS\CONF_DONE\nCONFIG\nCE的连接,或者上拉,或者接地,主要是为了保证这些信号在上电初始处于一个确定的电平状态,防止错误电平导致误触发。DATA\DCLK\NCSO\ASDO这4个引脚便是SPI接口,连接到SPI Flash。

图2-23 AS配置参考电路的截图

如图2-24所示,FPGA有组MSEL引脚是用于设置FPGA初上电时的启动模式,我们的FPGA上电使用Standard AS模式从SPI Flash里面加载配置数据。

图2-24 MSEL引脚配置说明的截图

有了前面的理论做铺垫,我们的设计也就有依有据了。如图2-25所示,这是我们的SPI Flash芯片,它的4个信号分别连接到FPGA器件的相应引脚上。

图2-25 FPGA的AS配置电路

前面是上电启动配置数据的电路,通过一个SPI Flash来实现。而PC端到FPGA器件的下载则是通过JTAG来实现的,JTAG这个概念网络上满天飞了,大家自己去消化,但凡有CPU的地方,基本都有JTAG的存在,FPGA也不例外。另外,大家注意前面的MSEL设置了FPGA启动模式是Standard AS模式,但是JTAG永远是最高优先级的模式,任何时刻,只要JTAG需要进行下载配置,那么配置模式将会转换。JTAG下载插座以及部分配置专用引脚的连接电路如图2-26所示。

图2-26 JTAG插座与FPGA配置电路

2.2.5 DDR2电路设计

FPGA通常有专用的接口支持诸如DDR2、DDR3等高速的存储器,因此在对其引脚进行连接时,需要使用FPGA定义好的专用存储器接口总线,不能随心所欲地随意连接。Altera公司的FPGA器件,在它们的官方网站上都可以下载到与器件对应的引脚定义文档(通常有excel格式、txt格式或pdf格式),在这些文档中,详细罗列了哪些引脚可以用于存储器数据总线、地址总线、时钟或控制信号的连接。因此,在着手设计前,一定要先参考并定义好FPGA与存储器间的接口连接。

DDR2芯片的连接电路如图2-27所示。

图2-27 DDR2芯片接口电路

DDR2芯片接口以及PCB layout通常需要遵循以下原则:

❏ 单端信号的电路板阻抗一般控制在50 ohm ± 10%;差分信号的电路板阻抗一般控制在100 ohm ± 10%。

❏ DQ、DQS、CK/CK#选择VSS作为参考平面;地址、命令、控制信号线选择VDD作为参考平面。

❏ 双向I/O,如DQ,串行端接电阻放置在走线的中间,用于抑制振铃、过冲和下冲。

❏ 单向信号,如地址、控制和命令线,串行端接电阻放置在走线的中间或信号的发送端,推荐放在信号的发送端。

❏ 推荐的线宽为:

❏ 推荐的线间距为:

❏ DQS一般布线在DQ信号组的中间。

❏ DQS与时钟信号线不相邻。

❏ 为了避免串扰,数据信号组和地址、控制、命令信号组之间的走线间距应在±20mils,建议它们在不同的信号层走线。

❏ 时钟信号组尽量走在内层,CK和CK#的走线长度偏差在±20mils以内,最好是±10mils以内。

❏ 数据信号组的走线长度和时钟信号组的走线长度偏差在±500mils以内。

❏ 同一组信号线的走线长度偏差在±50mils(±25mils)以内。

❏ 地址、命令、控制信号线的走线长度与时钟信号组的走线长度偏差在±400mils以内。

❏ 同一地址、命令、控制信号组内的走线长度偏差在±50mils。

❏ 所有信号走线长度控制在2000mils(50mm)以内。

❏ VREF布局布线:

● VREF和其他信号之间保持20mm间距。

● VDD到VREF的走线尽可能短。

● 去耦电容尽可能靠近VREF。

● VREF走线至少20~25mils。

● VREF和相邻走线之间至少保持15~25mils间距。

❏ 布线顺序:

● 数据信号DQ、DQS、DM

● 地址信号,命令信号CAS#、RAS#、WE#

● 控制信号CS#、CKE

● 时钟信号

● 反馈信号

❏ 如图2-28所示,蛇形走线的相邻走线间距是线宽的5倍。

图2-28 蛇形走线线宽与间距的关系

2.2.6 NAND Flash电路设计

如 图2-29所 示,这 是NAND Flash芯片的接口电路。只要NAND Flash的R/B#(Ready/Busy#)信号上拉,其他信号都连接到FPGA的I/O引脚上就好。

图2-29 NAND Flash芯片接口电路

2.2.7 引脚分配与I/O扩展电路

如图2-30所示,核心板上专门留了一个LED指示灯连接到FPGA引脚上,用于板子的测试。PIN_113输出高电平LED将被导通点亮,低电平LED截止则不亮。

图2-30 连接FPGA引脚的LED驱动电路

FPGA核心板其余的I/O引脚通过3个32PIN的连接器引出。如图2-31、图2-32和图2-33所示。

图2-31 P2插座连接电路

图2-32 P3插座连接电路

图2-33 P4插座连接电路

2.3 扩展外设子板设计

如图2-34所示为围绕FPGA器件设计的核心板,它的诱人之处在于引出的3个32PIN插座。这3组可扩展的接口可以连接各种各样的外设子板,可以作为一个电子爱好者无限DIY的平台。针对该核心板,我们目前已经推出的可用于实现一些项目工程的外设子板有AD/DA外设子板、UART/USB外设子板、FX2(USB 2.0)外设子板、CMOS摄像头子板、AV视频采集子板设计、7寸工业液晶屏子板、VGA显示驱动子板和HDMI显示驱动子板。

图2-34 FPGA核心板实物照片

如表2-1所示,这是我们目前推出的核心板和各个子板的主要外设列表。

表2-1 各个子板的主要外设列表

2.3.1 AD/DA外设子板设计

SF-BASE基本外设子板的各个主要外设芯片的实物位置如图2-35所示。

图2-35 SF-BASE子板实物照片

在后续项目实例中,我们主要使用了SF-BASE子板AD/DA芯片的功能,AD/DA芯片的引脚定义如表2-2所示。

表2-2 SF-BASE的AD/DA芯片引脚定义

A/D芯片的电路如图2-36所示。它通过一个单向(从A/D芯片到FPGA)数据传输的SPI接口与FPGA相连。FPGA通过这组SPI接口读取当前模拟电压值。为了得到不同的模拟电压值,我们的板子在A/D芯片的模拟输入端设置了一个3.3V的分压电阻,当跳线帽连接了P3的1~2引脚时,调节可变电阻R24的阻值便能改变当前A/D采样的数据。跳线帽若连接P3的2~3引脚,则AD芯片的输入模拟电压来自于D/A芯片的当前输出。

图2-36 A/D芯片驱动电路

D/A转换电路如图2-37所示,该D/A芯片通过I2C接口与FPGA连接,FPGA通过这组I2C接口输出数据,相应D/A芯片的VOUT输出模拟电压值。若跳线帽连接P2的1~2引脚,则不同的模拟电压值输出驱动D9指示灯呈现不同的亮度。

图2-37 D/A芯片驱动电路

2.3.2 UART/USB外设子板设计

SF-USB子板的实物照片如图2-38所示。

图2-38 SF-USB子板实物照片

SF-USB子板主要用到其USB转UART芯片FT232,该芯片内部功能框图如图2-39所示。它通过USB的D+/D-与PC进行通信,芯片内部能够根据USB协议对数据进行处理,最终通过FIFO将这些数据转换为UART协议和我们的FPGA进行通信。

图2-39 FT232芯片内部功能框图

FT232R的接口电路如图2-40所示。P4为USB port,用于连接PC, UART_TX和UART_RX分别为FT232R芯片的UART发送和UART接收信号,对应的,UART_TX就是FPGA的UART接收,而UART_RX就是FPGA的UART发送信号。D2和D3连接着U2-23/22,在UART_RX和UART_TX收发时它们会闪烁以指示工作状态。

图2-40 FT232R接口电路

FT232R的引脚定义如表2-3所示。

表2-3 FT232R引脚定义

SF-USB子板的USB转UART芯片连接到FPGA的信号定义如表2-4所示。

表2-4 SF-USB子板连接引脚定义

2.3.3 FX2(USB 2.0)外设子板设计

SF-FX2子板的实物照片如图2-41所示。

图2-41 SF-FX2子板实物照片

FX2(CY7C68013)是一款集成8051单片机的灵活的USB 2.0控制器,其带宽可以接近USB2.0标称的480Mbit/s。

FX2的内部功能框图如图2-42所示,从图中不难看出,8051实际上并不直接参与USB数据的实际传输,而只是做一些基本的配置。从GPIF(或SlaveFIFO)接口传输的数据,在FX2内部传到了RAM中进行缓存,并且可以直接送到USB 2.0的phy中传输给USB设备。

图2-42 FX2内部功能框图

SF-FX2子板和SF-VIP核心板需要进行连接的主要接口定义如表2-5所示。

表2-5 SF-FX2子板连接引脚定义

2.3.4 CMOS摄像头子板设计

SF-MT9D111子板的实物照片如图2-43所示。

图2-43 SF-MT9D111子板实物照片

SF-MT9D111子板上板载美光的CMOS摄像头MT9D111,它是美光的一款在单芯片系统上集成了一个先进的200万像素图像传感器和功能强大的图像处理技术芯片。单芯片系统中的自动特性可以调整各种参数,以便在各种光照条件下拍摄到优质图像。MT9D111也可以简化设计工程师的工作,因为所有的处理功能、内存以及与镜头的接口都集成在一个单传感器处理芯片上。MT9D111是一颗1/3英寸、200万像素的CMOS图像传感器,它自带有集成的先进相机系统。此相机系统包含一个复杂的图像流处理器(IFP)、一个实时JPEG编码器、一个集成的微控制器、闪光控制、自动聚焦、光学缩放以及机械快门。整个系统级芯片(SoC)可以在低照度条件下具备卓越的性能,同时功耗很低。MT9D111的内部功能框图如图2-44所示。

图2-44 MT9D111芯片内部功能框图

SF-MT9D111子板的主要接口定义如表2-6所示。

表2-6 SF-MT9D111子板连接引脚定义

2.3.5 AV视频采集子板设计

SF-AV子板的实物照片如图2-45所示。

图2-45 SF-AV子板实物照片

如图2-46所示,SF-AV子板板载的ADV7180芯片是一颗AV解码芯片,该芯片能够自动检测并转换标准的AV电视信号,包括NTSC、PAL和SECAM等制式。该芯片输出的数字信号接口为标准的ITU-R BT.656协议。

图2-46 ADV7180芯片内部功能框图

SF-AV子板的主要接口定义如表2-7所示。

表2-7 SF-AV子板连接引脚定义

2.3.6 7寸工业液晶屏子板设计

SF-L70子板以及液晶屏的实物照片如图2-47所示。

图2-47 SF-L70子板实物照片

SF-L70子板连接到FPGA的主要接口定义如表2-8所示。

表2-8 SF-L70子板连接引脚定义

如图2-48所示,这里用到的触摸屏控制器芯片AW2083数字端通过IIC总线与FPGA进行通信,模拟端则由四个输入方向X+、X-、Y+、Y-组成,它们直接连接到电阻式触摸屏的FPC上。

图2-48 触摸屏驱动电路

如图2-49所示,这是连接到7寸液晶屏电路的FFC插座接口,它通过FPC(俗称“软排线”)连接到液晶屏上。

图2-49 液晶屏接口电路

2.3.7 VGA显示驱动子板设计

SF-VGA板载用于驱动VGA显示器的专用D/A转换芯片AVD7123, FPGA通过32pin连接器驱动ADV7123芯片产生供给VGA显示器的色彩以及同步信号。SF-VIP核心板的FPGA与SF-VGA子板的ADV7123芯片连接的框图如图2-50所示。FPGA产生ADV7123的同步信号以及3组供给ADV7123内部3路并行D/A转换的数字信号,经过ADV7123的这3组VGA色彩数字信号最终转换为0~0.7V的模拟电压送给VGA显示器。而FPGA另外会产生用于同步色彩数据的场同步信号VSY和行同步信号HSY。

图2-50 SF-CY3核心与SF-VGA子板模块连接的系统框图

SF-VGA子板的实物图如图2-51所示。

图2-51 SF-VGA子板实物照片

ADV7123芯片以及外围电路如图2-52所示。它的3路D/A信号实际上都是8bit位宽,但是我们只使用了565的RGB(即5bit的R信号,6bit的G信号,5bit的B信号)输出,所以把不使用的RGB信号都统一接地。用于同步数据传输的有时钟LCD_CLK、转换数据有效控制信号LCD_BLK和补偿同步控制信号LCD_SYN。根据datasheet,实际上LCD_SYN我们无需使用,所以逻辑驱动给它0电平就可以了。而LCD_CLK是和输出的数据总线同步的,根据我们所需要的显示驱动分辨率和刷新率决定,LCD_BLK信号则在数据总线有效时拉高即可。

图2-52 ADV7123与VGA接口电路

ADV7123的模拟输出IOR、IOG、IOB信号直接连接到VGA插座上,同时FPGA输出的两个同步信号VGA_HSY和VGA_VSY也直接连接到VGA插座上。

SF-VGA与FPGA引脚定义如表2-9所示。

表2-9 SF-VGA与FPGA引脚定义

2.3.8 HDMI显示驱动子板设计

SF-HDMI显示驱动子板上板载HDMI控制器芯片ADV7513, FPGA与ADV7513芯片之间的接口示意如图2-53所示。RGB565总线用于显示图像的传输;同步控制信号HDMI_DE、HDMI_HSY、HDMI_VSY、HDMI_CLK产生时序配合RGB565总线完成图像的传输;IIC总线用于FPGA对ADV7513的寄存器配置,实现ADV7513接口模式和工作模式的初始化配置。

图2-53 FPGA与ADV7513芯片接口示意图

SF-HDMI子板的实物图如图2-54所示。

图2-54 SF-HDMI子板实物照片

SF-HDMI与FPGA引脚定义如表2-10所示。

表2-10 SF-HDMI与FPGA引脚定义