一、概述 FPGA是当今数字电路应用领域最热门的话题之一,是实现复杂逻辑功能,提高系 统性能、集成度和可靠性的有力武器。但是,对于初用者,特别是对于那些习惯于TTL 电路设计的初用者来说,FPGA的有效应用并不像某些厂家广告中所说的那么轻松。诚 然,学会使用设计工具实现一个FPGA设计是一件很容易的事,但是要获得比较理想的 结果就不那么容易了。经验表明,对于同一个设计,那些会使用适合于FPGA体系结构 特点的设计技术的设计者与不能有效地使用适合于FPGA体系结构特点的设计技术的初 用者,在芯片资源利用率和设计实现速度两方面的差距往往高达50%~100%,有时 甚至更大些。造成这种差别的原因主要有两个方面:一是FPGA设计工具不够完善,其 逻辑分割和布局布线与用户描述设计的方法有很大关系;二是FPGA与传统PLD和T TL标准逻辑电路在体系结构方面有很大差别,因此设计技巧往往不尽相同,那些用户习 惯了的、适合于传统PLD和TTL标准电路的设计优化技术对FPGA设计来说往往不 是最优的,有时甚至是最差的。因此,充分了解FPGA器件体系结构特点,并采用相适 应的设计优化技术对于有效地应用FPGA技术是非常重要的。 传统PLD是一种基于阵列结构的器件,由AND阵列和OR阵列组成的,AND阵 列的输出驱动OR阵列,而OR阵列的输出驱动输出单元,并可反馈回AND阵列。传统 PLD的触发器位于输出单元,往往是每个输出单元有一个触发器,由OR门的输出驱动 。PLD的AND门比较宽,通常可以实现多达几十个输入变量的逻辑与功能,每个与门 通常也称为一个乘积项。与AND门相反,PLD的或门比较窄,往往只有几个输入变量 。OR门的输入是AND门的输出,它实现乘积项之和的操作。PLD的输出单元和触发 器数量有限,但每个输出单元的组合逻辑能力很强,可以实现很复杂的与或操作,因此是 组合逻辑密集型器件,其组合逻辑资源与触发器资源的比例往往高达5:1~10:1。 PLD设计的一个原则就是尽可能地充分利用其组合逻辑能力,尽可能地节约触发器资源 。与PLD相反,FPGA是触发密集型器件,构成芯片内部逻辑单元阵列的每个逻辑单 元往往设有1~2个触发器,但其组合逻辑功能比较弱,组合逻辑资源与触发器资源的比 例通常为2:1。事实上,FPGA主要是与门阵列而不是与PLD争夺市场,其逻辑单 元是面向细粒度组合逻辑功能而优化设计的,复杂的组合逻辑功能必须由多个逻辑单元分 级实现。FPGA设计的一个原则是充分利用丰富的触发器资源,尽可能降低每个组合逻 辑操作的复杂度。 中小规模标准集成电路系统设计的原则是在满足性能要求的前提下尽可能地减少器件 的使用量,其特点是用户从元件库中调用的第一个符号都对应于PCB上的一块组件,调 用的符号越多往往意味着使用的器件越多,同时各个器件之间的连线是做在PCB上的, 各种信号线之间没有什么差别,且走线自由,延迟很小。FPGA则不同,用户从元件库 中调用的符号只是描述某一功能,往往不对应于特定的封装。用户多调用一些符号,特别 是反相器,往往并不意味着会多消耗一些芯片资源;相反,调用较少的符号有时反而会需 要更多的芯片资源。此外,在FPGA中,各种互连资源的数量是固定的,所能实现的互 连模式也是有一定限制的,且互连延迟往往也是很可观的,有时要占总信号链路延迟的5 0%。 因此,FPGA与PLD和SSI/MSI标准电路在器件结构等方面存在着很大的 差异,为了获得比较理想的性能,需要针对各种器件的特点采用相应的设计技术,若将P LD和SSI/MSI电路的设计技巧生搬硬套到FPGA设计中,往往会导致很差的性 能。本文的其余部分将讨论各种常见逻辑功能的FPGA设计技术。 二、状态机设计 状态机是数字电路设计中经常用到的时序控制功能,FPGA设计在状态编码方案、 等待状态生成和大型复杂状态机设计等方面与传统PLD设计和SSI/MSI标准逻辑 电路设计有着很大的差别。 首先,在FPGA设计中,One-Hot状态编码方案比二进制状态编码方案更有 效,而在PLD和SSI/MSI设计中,二进制状态编码方案则更合适。所谓One- Hot状态编码方案就是每个状态由一位触发器来表示,而二进制状态编码方案是用Lo g,[2][N]位触发器表示N个状态,在PLD设计中,由于其触发器资源有限,故 通常采用二进制编码方案来表示各个状态,然后用组合逻辑对状态编码进行译码,生成状 态输出信号和状态转移控制信号。由于PLD是组合逻辑密集型器件,其AND-OR阵 列可以在相同的延迟时间内完成各种复杂的译码功能,因此这种方案是适合于其器件体系 结构的。FPGA是触发器密要型器件,其逻辑单元的组合逻辑能力相对PLD的AND -OR阵列而言是很弱的,只有几个输入端,因此往往不宜采用二进制状态编码方案,因 为这样做会导致复杂的组合运算,增加逻辑链路级数,降低工作速度。对FPGA而言, 更合适的是采用One-Hot状态编码方案,因为此时状态生成逻辑的输入直接来自状 态触发器的输出端,不必对状态进行译码,操作比较简单,每个状态的生成信号往往可以 在一个逻辑单元内实现,且状态输出信号直接取自状态寄存器的输出,也不必对状态进行 译码,因此有利于获得较高的速度。经验表明,在FPGA设计中,One-Hot编码 方案通常可使状态机的工作速度比PLD常用的二进制编码方案快50%~100%。同 时,SSI/MSI电路设计中常用的用可装入计数器实现状态机的方法虽可减少器件数 量,但不能有效利用FPGA的门电路,故也不适合于FPGA设计。 其次,PLD设计中常用计数器生成状态机所需要的等待状态。这种方法对于组合逻 辑资源丰富和触发器资源较少的PLD器件而言是很合适的,但对触发器资源丰富和逻辑 单元组合逻辑能力较弱的FPGA来说就不是很合适,此时比较有效的是使用移位寄存器 来生成等待状态,以获得更高的速度。 最后,在用FPGA实现大型复杂状态机时,应将该大型复杂状态机分割成几个相互 通信的规模较小的状态机,以便降低状态转移控制逻辑的复杂度,充分利用FPGA布线 资源的局部化特性,减少布线拥挤现象,缩短布线延迟,提高设计速度。 三、面向数据通路功能的FPGA设计技术 FPGA器件相对于传统PLD和SSI/MSI器件的一大优势是FPGA器件可 以有效地实现诸如计数器、加法器和比较器等各种数据通路功能,获得非常高的工作速度 。FPGA器件的这个优势来源于其器件体系结构的特点,即丰富的触发器资源、灵活有 效的互连结构和有效地实现多路选择器的能力,这些特点使得FPGA器件在实现数据通 路功能时可以采用操作流水化技术和减轻输出负载的信号重复设置技术,从而大大提高设 计的工作速度。 操作流水化是实现复杂功能的有效手段,其原理是将一个复杂操作分成几个比较简单 的操作步,每个操作步的结果经寄存器寄存后再驱动下一个操作步的输入。由于每个操作 步都比较简单,故可以工作在较高的时钟频率,而操作流水化的等效结果是每个时钟周期 出一个结果,故整个设计的整体性能也提高了。FPGA提供了操作流水化所需要的触发 器资源,且每个操作步往往可以在一个逻辑单元列内实现,操作步之间的连接也可以通过 相邻逻辑单元列之间的超小延迟直接互连资源直接相连,从而获得很高的工作速度。所以 ,一般来说,如果数据通路功能的输入输出延迟允许的话,都应尽可能地采用流水化技术 ,以提高性能,而且对大多数FPGA而言,操作流水化所需要的触发器资源往往不会增 加额外的资源成本,因为,这些触发器资源通常已不能再用作其它用途,不这样用也就浪 费了。 超前进位技术是提高计数器性能的有效方法,具有丰富触发器资源的FPGA可以有 效地实现超前进位技术。例如,在16位减法计数器设计中常用的方法是检测输出的全0 状态,生成计数器翻转控制信号。而在FPGA中,更有效的方法是检测输出的1状态, 并将生成的控制信号寄存,使计数器翻转控制信号与计数器变为全0操作同步变化,从而 消除了检测计数器输出条件所需要的组合传输延迟,提高计数器的工作频率。预分频计数 器设计中也可采用相同的技术生成高位计数器的计数使能控制信号,以进一步提高计数的 性能。例如,通过采用上述的超前进位技术和预分频技术,用XC3100-3系列FP GA实现的16位不可装入单向计数器,其工作速度可达107MHz。 重复设置相同的电路单元以尽可能地减轻信号负载和缩短互连延迟,是FPGA设计 中获取超高性能的另一常用方法,特别对那些不宜采用流水化技术的电路来说更是如此。 例如,在加法器设计中可将加法器分成若干段,每个段都设置两套加法电路,分别生成有 进位的加法结果和无进位的加法结果,然后由进位信号选择正确的结果,使加法运算与进 位生成完全并行进行。又例如在计数器设计中,高位计数器计数使能信号的生成和传播是 影响计数器工作频率的关键因素,可以采用重复设置相同电路单元的方法来缩短该延迟时 间。这种方法的缺点是增加了芯片的资源要求,但对于需要超高性能的用户来说,毕竟提 供了一条可行的途径。例如,通过采用预分频技术、超前进位生成技术和信号重复设置技 术,用XC3100-3系列FPGA实现的16位不可装入单向计数器,其工作频率可 高达204MHz,这是其它方法所无法比拟的。上述谈到的操作流水化技术、信号预译 码技术、预分频技术和信号重复设置技术等概念不仅适合于数据通路设计,也适合随机逻 辑设计,是实现高性能FPGA设计的有效手段。 四、时钟信号分配技术 时钟信号是FPGA芯片中比较特殊的信号,往往由少数几个专用的驱动器驱动和专 用的时钟分配网络传播,且往往只能驱动触发器的时钟端,其目的是为整个芯片提供延迟 偏差几乎可以忽略的时钟信号,使用户不必担心时钟信号负载问题和信号保持时间问题, 以提高设计工作速度和可靠性。因此,FPGA特别适合于同步电路设计,用户应尽可能 采用同步电路设计技术,尽可能减少使用的时钟信号种类。例如,TTL电路设计中经常 采用的由组合逻辑生成多个时钟,然后分别驱动多个触发器以装入和保持数据的设计方法 ,对FPGA设计是不适用的。因为这样做会使得时钟种类很多,不能利用专用的时钟驱 动器和专用的时钟走线资源,时钟信号只能由通用的布线资源拼凑而成,各个负载点上的 时钟延迟偏差很大,会引起数据保持时间问题,降低工作速度。 对FPGA设计而言,更有效的方法是使用同一个时钟信号,而由组合逻辑生成多个 时钟使能信号,分别驱动触发器的时钟使能端,所有触发器的数据装入都由同一个时钟控 制,但只有时钟使能信号有效的触发器才会装入数据,时钟使能信号无效的触发器则保持 数据。这种方法充分发挥了FPGA器件体系结构的优势,是用户应该尽可能使用的设计 技巧。 五、如何选择合适的电路构造单元? 为了方便用户,各个FPGA厂家的开发系统都提供了包含数以百计个元件符号(即 电路构造单元)的符号库,其中有些元件符号的功能比较简单,如简单门电路、触发器等 ,有些元件符号的功能则比较复杂,与TTL电路的组件相对应;有些元件符号虽然描述 的是相同或相似的功能,但由于输入变量反相信号个数的不同而有多个版本。一些原来从 事TTL电路设计的用户往往习惯于从FPGA设计元件库中调用相同的元件符号,将已 有的TTL电路设计一一对应地转换成FPGA设计。经验表明,这种方法的实际效果通 常是很差的,因为它们往往不能充分发挥FPGA器件结构的优势。为了获得比较理想的 结果,用户除了要对电路的实现方法作必要的修改外,还要使用合适的元件符号来描述设 计。下面是选择元件符号的两个原则,可供用户参考: ·尽可能地使用功能与用户要求最一致的元件符号。例如,如果需要一个没有数据装 入功能的4位计数器,用户就应该直接调用元件库中相应的符号,而不应调用功能与74 161等价的符号,因为FPGA开发系统往往不允许符号输入端悬空,当使用与741 61等价的符号时,用户必须将相应的输入引脚接到VCC或GND信号,从而占用额外 的芯片布线资源,容易引起布线拥挤,影响其它信号的布线效果和整个设计的性能。 ·如果输入信号需要反相,则应尽可能地调用输入信号带反相功能的符号,而不是用 分离的反相器对输入信号进行反相。在FPGA中,输入信号的反相往往可在同一个逻辑 单元内完成而不消耗额外的逻辑资源,因此厂家提供的各种门电路符号随着输入变量和输 入变量反相个数的不同而有多个版本。例如,4个输入与门就有AND4、AND3B1 、AND2B2、AND1B3和AND4B五个版本,其中ANDxBy表示X个输入 不反相和Y个输入反相。如果用户需要实现Y=A*B*/C*/D功能,就应调用AN D2B2,而不是用两个分离的非门对C和D反相,再连接到AND4的输入。因为在前 一种做法中,C和D的反相操作是不占用资源的,而在后一种做法中,C和D的反相操作 与AND4操作可能会被分割到不同的逻辑单元中实现,从而消耗额外的资源,增加额外 的延迟。如果一个信号反相反驱动了多个负载,则应将该反相功能分散到各个负载中实现 ,因为集中反相往往会由于上述所说的原因而消耗更多的资源和增加额外的延迟。 六、内部三态总线设计技术 有的FPGA器件内部设置有三态驱动器和相应的长线布线资源,可以构成内部三态 总线;有的FPGA器件内部则没有三态驱动器,不能直接构成内部三态总线,三态总线 只能通过多路器来实现。用户在使用不同的FPGA器件时应使用相应的设计技术。一般 来说,不管用哪一种方式实现三态总线,都应手工定位三态驱动器或多路器在芯片中的确 切位置,否则布线的效果往往是很差的。 Metastability问题 Metastability问题是指触发器的异步数据输入端,在触发器时钟端发 生有效变化的数据建立时间窗口内发生变化,从而破坏触发器的数据建立时间要求,导致 触发器输出发生振荡的现象。一般来说,在FPGA设计中,利用I/O块中的输入触发 器对异步输入信号进行寄 存就基本上可以解决Metastability问题,且又 不会增加芯片资源要求。因为如果不这样使用的话,该I/O块中的输入触发器往往也就 浪费了。如果这样做后用户还不放心的话,用户可使用逻辑块中的触发器对I/O块触发 器的输出信号再次进行同步,该方法称为双触发器同步技术。 八、FPGA板级设计技术 FPGA芯片的设计成功并不意味着大功已告成,它能否按设计者所设想的那样在系 统中正常工作,还取决于各种外部因素,如供电、工作环境、传输线效应等。一般来说, FPGA的板级设计应注意如下一些问题: ·加电:所有FPGA在系统加电期间都要经历一个过渡过程才能稳定下来,在这个 过渡过程中,FPGA内部触发器的状态是不确定的。过渡过程的持续时间与供电电源的 变化速率有关。为了保证FPGA可靠地工作,VCC上升速度不能太慢,且最好将系统 复位信号引入到FPGA芯片中,在系统复位未结束前将FPGA内部触发器置于稳定的 状态。此外,基于SRAM编程工艺的FPGA在供电稳定后还要从FPGA芯片外部装 入构造数据,在此期间,FPGA的I/O引脚用来输入信号,FPGA尚未正常工作, 设计者应利用FPGA芯片提供的专用引脚信号,作适当的处理,保证系统其它设备不会 访问该FPGA或该FPGA所控制的设备。 ·工作环境:FPGA对工作环境有一定的要求,最好工作在厂家推荐的工作环境中 。此外,FPGA的定时特性随电压和温度的变化而变化,如果用户的FPGA设计处于 临界状态,则环境条件变化时就可能会工作不正常。为了使FPGA设计在整个环境变化 允许范围内可靠地工作,设计者应保证在此变化范围内不会破坏芯片间数据通信的时序关 系。 ·地反射(Ground Bounce)问题:地反射现象是指多个输出信号同时 变化时引起的信号干扰,其幅度与同时变化的输出引脚数和输出引脚所驱动的电容负载有 关。大多数FPGA器件对同时变化的输出引脚数量有一定的限制,用户应尽可能地遵守 这些约束,如果不能满足这些约束条件,则应将这些输出引脚分散并靠近GND引脚,尽 量避免过于集中。此外,采用多层印制板和设置专门的VCC/GND布线层,采用CM OS输入电平和配置足够的去耦电容,也是减少地反射现象的有效手段。 ·传输线效应:所有的PCB走线都带有分布式的电容和电感,当印制线的双程传输 延迟大于输出信号的上升或下降时间时,就必须将该印制线作传输线处理,必要时可采用 串行匹配或并行匹配技术,对该信号进行端接。同时有的FPGA提供了输出信号变化速 率控制电路,允许用户控制输出引脚信号的变化速率,如果允许,用户应尽可能地将输出 引脚置于低变化速率方式,以延长信号的上升/下降时间,增加信号的有效传输距离。 ·去耦电容:每块FPGA芯片都应配置足够的去耦电容,视规模大小不同,每个F PGA封装周边应配置0.1μf~0.2μf的高频去耦电容,且去耦电容应尽量靠近 VCC或GND引脚。 ·所有的VCC/GND引脚都应被连有相应的信号,且VCC/GND最好使用专 用的布线层;未使用的I/O引脚应被置于固定的电平上,不能悬空。 九、结束语 FPGA器件与PLD和SSI/MSI标准电路在器件结构等方面存在着较大的差 别,为了获得比较理想的FPGA设计性能,用户需要针对FPGA体系结构的特点,采 用相适应的设计优化技术,生搬硬套PLD和SSI/MSI标准电路的设计技术往往会 导致很差的效果。One-Hot状态码编程技术、操作流水化技术、预分频技术、超前 操作技术、同步电路设计技术和信号重复设置技术等,是获得高性能FPGA设计的有效 手段,用户可在实践中灵活运用。同时,这些技术的应用往往需要用户对逻辑分割和芯片 内部布局布线进行手工干预,因此要求用户详细了解器件的内部结构和熟练使用各种设计 工具。总之,会使用设计工具完成一个FPGA设计是一件容易的事情,但要获取比较理 想的结果就不那么轻松了,需要多付出一点努力。
|