7.3.3 FPGA逻辑设计

7.3.3 FPGA逻辑设计

FPGA代码设计要求包含代码规范性、可综合性及通用设计准则等,一般采用硬件描述语言进行设计。设计输入是行为级或RTL级代码描述,从设计输入到最终门级实现之间的转换、优化、映射等工作是由综合工具完成的。综合代码可以转换为由FPGA内部基本库、连线资源等构成的硬件网表,所以设计师不仅要对硬件设计本身有很好的了解,同时还要了解HDL语言描述与硬件实现的关系。FPGA产品的逻辑设计问题包括复位设计、时钟设计、约束设计、有限状态设计、抗噪和静音设计、防护性设计。

1)复位设计

复位设计是FPGA设计中一个基本且重要的环节。复位的目的是在系统启动或内部模块功能发生错误时将设计强制定位在一个初始可知状态,合理选择复位方式是电路设计的关键。目前常用的复位方式有同步复位、异步复位、异步复位同步释放、复位有效时间与器件启动、复位树。

(1)同步复位。指复位信号仅在时钟信号的有效沿对触发器进行复位。同步复位的优点为:综合出较小的触发器,能够保证整个电路设计的同步性,确保复位仅在时钟信号有效沿发生,有利于滤除高频信号的干扰,有利于进行时序分析及系统的总体同步化,易于进行基于周期的仿真。同步复位的缺点为:复位信号的有效时间必须大于时钟周期,否则无法被识别并进行复位操作,需要一个脉冲延展复位,目的是使FPGA内部逻辑寄存器和IO进入一个预先设定的状态。

(2)异步复位。指无论时钟沿是否到来,只要复位信号有效沿到来就对系统进行复位,复位信号和时钟相互独立。

异步复位的优点为:有效利用了寄存器CLR端口,节省了系统资源;复位信号的有效时间可以不受时钟周期的限制,确保其可控性,由于受数据通路时序的要求,不可能通过在数据通路上添加逻辑门或增加连线延迟来处理同步复位,使用异步复位就可以保证不将复位信号加载到数据通路上,且电路可以不依赖于时钟进行复位。

异步复位的缺点为:复位信号如果发生在靠近时钟沿很近的时间点,那么触发器就可能没有足够的时间维持输入端信号的值,容易造成亚稳态,从而影响设计的可靠性;复位信号容易受到毛刺信号的影响,会导致触发器的误操作,进而影响设计的稳定性;此外异步复位的可测性和STA的复杂性要高于同步复位。

(3)异步复位同步释放。指在异步复位信号到来的时候不受时钟信号的同步,而是在复位信号释放的时候受到时钟信号的同步。其中异步复位信号使用FPGA寄存器的全局异步复位端口,能够使复位信号有效时刻到达所有寄存器的时钟偏移最小,既能节约资源又能简化设计。由于异步复位信号释放时可能导致亚稳态的发生,为了解决这一问题可以采用同步释放,即先将异步复位信号用电平同步器同步后分配给其他功能模块,使得这些功能模块内寄存器在复位释放时总是满足复位恢复时间的约束,从而抑制了亚稳态的发生。

异步复位同步释放的双缓冲电路的复位方式同时弥补了同步复位和异步复位的缺陷,并很好地发挥了它们的优势。异步复位同步释放的双缓冲复位方式采用两级触发电路,第二级触发器将第一级触发信号利用时钟打一拍,异步信号同步化,有效降低了亚稳态发生概率,同时节约了系统资源,在FPGA逻辑设计中可以很好地提高复位的可靠性。

(4)复位有效时间与器件启动。确保复位时间对于该系统的所有电路有足够长及可靠的启动时间十分关键。例如,许多FPGA规定了“启动”时间,其中电荷泵必须积累电压并装载内部电容,等待延时,然后释放其输出。过早释放POR信号会产生不稳定的中间状态。另外,一些FPGA要求正确加载和释放的复位顺序。必须分析所有这些复位时序的最好和最坏情况。此外,数字逻辑电路板上的部分标准元件如晶体时钟振荡器可以具有充分的启动时间,一般为数十毫秒。比这再复杂一点,诸如FPGA和晶体时钟振荡器具有与电源爬升时间呈函数关系的启动时间。

(5)复位树。绘制一幅包含所有复位源的树图,常常有助于正确地定义复位逻辑。复位树图可以表明多种形式复位之间的关系,如系统复位、软件复位、看门狗定时器等。在需要时,确保完成必要的同步。同时,在复位需要快速激活情况下,复位树图有助于保证正确理解该逻辑和延时,例如防止非易失性存储器误写入,或者防止其他电路启动单次事件(如引爆火工品)。

2)时钟设计

(1)同步设计。指时钟域内的每个锁存器和触发器都应连接到相同的时钟源,其插入的缓冲器仅以增强驱动能力或使用另一个时钟沿为目的。同步设计具有航天应用所需求的稳定性,在变化的温度、电压下能工作得更好。同步设计通过使用精确设计的时钟采样信号,可以简单地解决因信号通过不同的逻辑路径而产生不同延迟所带来的问题。逻辑之间的接口通过标准的同步设计使其简化,而且同步设计的时序特性能保证数据的正确接收,而异步接口需要详细精确的握手过程等方式来确保信息的完整性。

(2)异步设计。指某信号产生和被采样位于不同的时钟域。在有信号跨越时钟域或连接输入输出管脚时,设计师就应考虑异步设计问题。因为某些异步设计在FPGA领域很难掌握比如异步状态机设计,因此建议不使用异步设计。假如需要异步方案,必须限制在同步方案无法实现的领域内采用。

异步信号的主要问题是它们需要与FPGA时钟同步。由于每个触发器可能会按不同方式采样输入信号的状态,异步输入信号在被多个触发器采样前需要被同步,作为一条经验法则,异步输入信号在传输到其他电路中需要用两级以上触发器同步。

(3)时钟信号的分配。时钟信号必须按安全和稳妥的方式在FPGA器件中分布。每个时钟域的时钟树都必须被平衡地设计,最好使用FPGA中快速连线资源实现这种平衡。

(4)非全局时钟的使用。当设计中采用非全局时钟时,器件可能或多或少地伴随一些小故障或某个区域容易受具体走线方式的影响。所以,当相邻触发器使用时钟的同一个边沿触发时必须使用全局时钟。同时,利用非全局时钟进行设计时也是可以接受的,例如,器件内部没有全局时钟资源或全局时钟资源不够的情况下,还会带来功率下降和可用时钟数量增加的优点,但是这些工作必须是在采用了耐漂移设计技术和进行了仔细分析的基础之上进行的。

(5)器件到器件定时策略。许多分析工具擅长分析单一器件内部逻辑,而对于分析系统时序或器件与器件之间的时序则显得不足。在电路板上采用低漂移时钟连接各数字器件是一种有效的简化解决办法。同时,应对时序进行适当的分析,包括分析基于时钟周期的建立时间和保持时间。

(6)时钟树。绘制一幅包含所有时钟源的树图,常常有助于正确地定义时钟之间的关系,图中每一个振荡器对应一个根节点。这些图中应该包括DLL、PLL、同一时钟域中的所有器件和与这些器件打交道的其他所有器件。在需要时,根据对时钟树的分析,识别所有跨时钟域的逻辑模块和信号,并确定它们之间哪些需要解决亚稳态问题。此外,要确认可以接受系统中同步信号之间的延时。

3)约束设计

(1)综合约束。综合约束实现了从行为逻辑到电路的映射过程,反熔丝型FPGA设计中需要关注综合工具对时钟速率及信号扇出的约束。其中时钟速率约束值可适当高于实际速率值,而信号最大扇出约束值则一般不超过10。

(2)时序约束。包括接口时序约束和内部时序约束。

接口时序约束主要是说明输入输出接口时钟与驱动信号的时序关系,包含输入端口到寄存器及寄存器到输出端口的相位关系。设计时应考虑FPGA输入端口及输出端口的时序要求,按上述要求来约束输入及输出信号的延迟时间。尤其是在输入及输出并行总线设计时,为确保总线信号延迟的一致性,应对组信号与时钟间的延时关系进行约束。

内部时序约束主要包含时钟约束、多周期路径约束、不关心路径约束等。对FPGA设计中使用的时钟应进行约束,对于时序分析不满足要求的设计应着重分析关键路径并优化设计,同时应对不关心路径或多周期路径进行分析和约束,从而提高布局布线效率及时序分析的准确性。

(3)I/O设计约束。FPGA设计时应充分考虑器件I/O接口的特性,合理配置I/O引脚位置、接口电平、输出驱动能力、输出摆幅及接口上下拉电阻等。

(4)布局布线约束。布局布线时,一般情况下应选择“时序驱动”选项。当存在时序不满足情况时,设置增量编译或多路径编译模式,可提升布局布线后FPGA的时序性能。若有时钟未使用全局网络,则可能存在建立时间不满足要求的情况,此时应在设计时尽量减小该时钟扇出,同时在布局布线约束时增加“修复最小延时冲突”选项。

4)有限状态机设计

有限状态机设计必须遵循良好的逻辑设计原则。对于关键应用,必须谨慎地对待状态机设计及其逻辑实现。有限状态机设计包括如下:

(1)锁定状态的策略和分析。对于关键状态机,分析必须覆盖所有可能的逻辑状态,证明该状态机具有确定和预期的行为。对于关键电路来说,须检查综合器的输出报告。要检查的常见事项有锁定状态、输出毛刺信号、意外的触发器复制和没有实现预期的风格。分析必须考虑非正常情况,必须保证状态机从合法状态出发,然后按预期的顺序转移。

(2)触发器复制。在瞬态故障(如单粒子翻转、ESD事件等)情况下,电路中不同部分的逻辑可能会表示不同的信息。即根据所连接的物理触发器,复制触发器表示了不同的值。因此在高可靠性要求的应用中应谨慎。工具软件更容易生成这类电路,而不生成保证自身一致性的逻辑。

(3)纠检错要求和实现。不能通过简单增加一个海明码和纠错电路来设计可靠的状态机。例如,在SEU或ESD事件与系统时钟不同步,且无法保证逻辑网络不受毛刺信号影响的情况下,要重新考虑这种结构提供可靠工作的能力。一般情况下,必须分析产生“次态”逻辑和输入到状态寄存器的组合电路。特别是对于其中的任何电路,必须检查电路实现是否有静态冒险,以及是否会出现错误转移到某个状态。

5)抗噪和静音设计

采取以下步骤来保证足够的抗噪性能:

(1)选择差分电平传输信号,特别是在板卡之间,目前新的逻辑器件的端口都直接支持差分电平标准。

(2)使用Serdes(串行/解串)器件或IP Core能够减少信号线数量,降低噪声。

(3)使用带滞回方式的输入能够有效地抵御噪声。

(4)避免使用有内部存储器的触发器或逻辑器件来驱动电缆或大容性负载。

(5)一些标称“TTL兼容”的输入端口通常并不具备TTL电平兼容的阈值,特别是VIH(高电平输入阈值)。

(6)一些输出端口,特别是对于一些CMOS器件,可能没有足够的驱动能力将TTL负载驱动到可靠的有足够抗噪声能力的逻辑1。需要计算在最坏情况下输出端口电压与输入端口阈值的关系。

(7)TTL接口的直流容限不能低于400 m V,建议至少为500 m V。

(8)对于TTL驱动CMOS的情况,使用上拉电阻加快上升时间可以提高噪声容限。但是,在时钟输入端口使用上拉电阻,会在时钟的波形中产生“驼峰”,造成寄存器多次触发。

6)防护性设计

针对一些非预期的事件,应考虑通过防护性设计来应对。最常用的方法就是进行边界和有效性检查。对于数据传输,简单的边界检查就能够检测到许多异常情况并做出适当的处理。例如,数据源断开连接会导致数据总线上全部是F。对于浮点数来说,这样的数值格式不是合法的。最低的标准要求是假定软件失效的概率为100%,任何可能的输入决不能损坏硬件并无法恢复。