作者: E.Srikanth
在 FPGA 设计中,复位起到的是同步信号的作用,能够将所有的存储元件设置成已知状态。在数字电路设计中,设计人员一般把全局复位作为一个外部引脚来实现,在加电的时候初始化设计。全局复位引脚与任何其它输入引脚类似,对 FPGA 来说往往是异步的。设计人员可以使用这个信号在 FPGA 内部对自己的设计进行异步或者同步复位。
不过在一些提示和技巧的帮助下,设计人员可以找到更加合适的复位结构。理想的复位结构可以改善 FPGA 中器件的利用率、时序和功耗水平。
了解触发器复位行为
在深入探讨复位技术之前,有必要了解 FPGA Slice 内触发器行为。基于赛灵思 7 系列架构的 FPGA 器件的每个Slice中含有 8 个寄存器,所有这些寄存器都是 D 类触发器。这些触发器共享一个通用的控制集。
触发器控制集的组成包括时钟输入(CLK)、高电平有效芯片使能端 (CE) 和高电平有效 SR 端口。触发器中的 SR 端口既可用作同步置位/复位端口,也可用作异步预设/清除端口(见图1)。
推断触发器的 RTL 代码也能推断触发器准备使用的复位类型。当复位信号出现在 RTL 过程的敏感列表中时,该代码就会推断异步复位(如图 2a所示)。随后综合工具将推断出一个触发器,该触发器的 SR 端口被配置为预设或清除端口(用 FDCE 或者 FDPE 触发器原语来表示)。在 SR 端口被断言后,触发器的输出会被立即强制赋予给触发器的 SRVAL 属性。
在同步复位的情况下,综合工具推断出的触发器,其 SR 端口被配置为置位或复位端口(用FDSE 或 FDRE 触发器原语来表示)。SR 端口被断言后,触发器的输出将在时钟周期的下一个上升沿被强制赋予给触发器的 SRVAL 属性。
此外,还可以把触发器的输出初始化为 INIT 属性规定的值。在配置过程中,当全局置位/复位 (GSR) 信号被断言时,INIT 值就会被加载到触发器。
赛灵思 FPGA 中的触发器能够同时支持异步的和同步的复位与置位控制。但是,底层触发器每次只能实现一个设置/重设/预设/清除。如果为 RTL 代码中的多个设置/重设/预设/清除状况进行编码,那么其中一种状况的实现将使用触发器的 SR端口,其余的状况则使用架构逻辑,因而会占用更多的 FPGA 资源。
如果其中一个状况是同步的,另一个状况是异步的,异步状况的实现将使用 SR 端口,同步状况的实现则使用架构逻辑。一般来说,应尽量避免出现一个以上的设置/重设/预设/清除状况的出现。另外,对于 Slice 中的每个触发器组(4 个触发器为一组),只有一个属性可以确定触发器的 SR 端口是同步的还是异步的。
复位方法
不管使用哪种复位类型( 同步或是异步),一般都需要让复位与时钟同步。只要全局复位脉冲的持续时间足够长,器件上所有的触发器都会进入复位状态。但是,取消复位信号的断言必须满足触发器的时序要求,才能保证触发器顺利地从复位状态转换到正常状态。如果不能满足时序要求,触发器就会进入亚稳定状态。
另外, 为了某些子系统的正常运行,比如状态机和计数器,所有的触发器必须在同一个时钟边沿退出复位。如果状态机的不同部分在不同的时钟周期退出复位状态,状态机可能会进入非法状态。这就要求取消复位断言必须与时钟同步。
对在给定时钟域中使用同步复位方法的设计来说,使用标准的亚稳态解决电路(两个背对背触发器)就足以把全局复位引脚同步到特定的时钟域。这个同步复位信号可以利用触发器上的同步SR 端口初始化该时钟域内的所有存储元件。由于待复位的同步器和触发器都处于同一时钟域,因此该时钟域的标准PERIOD 约束的包括同步器与触发器之间的路径时序。器件中的每个时钟域都需要使用单独的同步器为该时钟域生成一个同步的全局复位。
现在进入实质部分。下面是一些具体的提示和技巧,有助于您找到最佳的设计复位策略。
技巧 1:当驱动触发器的同步 SR端口时,每个时钟域都需要全局复位的局部版本, 并与该时钟域同步。
有时候不能保证设计的某个部分具备有效的时钟。这种情况通常发生在这样的系统中,即系统使用的时钟为恢复时钟,或者系统使用的时钟源于热拔插模块。在这种情况下,可能需要使用触发器上的异步 SR 端口,通过异步复位的方法对设计中的存储元件进行初始化。即便存储元件使用的是异步 SR 端口,取消复位沿断言仍然必须与时钟同步。这项要求主要体现为触发器的复位恢复时序弧,这类似于要求将异步 SR的取消断言沿设置为与时钟的上升沿同步。如果不能满足这个时序弧的要求,就会导致触发器进入亚稳态,同步子系统也会进入异常状态。
图 3 所示的复位桥接电路提供了一种机制,可以对复位进行异步断言(故在无有效时钟的情况下也可以进行)以及对复位进行同步取消断言。在这个电路中,假定两个触发器的 SR端口具有异步置位功能 (SRVAL=1)。
可以使用该复位桥的输出来驱动给定时钟域的异步复位。这种经过同步的复位能够使用触发器的异步 SR 端口对该时钟域中的所有存储元件进行初始化。器件中的每个时钟域仍需要一个单独的、经过同步的、由单独复位桥生成的全局复位。
技巧 2:复位桥接电路实现了一种安全的机制,可以同步地对异步复位取消断言。使用复位桥接电路,每个时钟域都需要全局复位的局部版本。
在图 3 所示的电路中,假定为复位桥和相关逻辑提供时钟信号的时钟 (clk_a) 是稳定且无误的。在 FPGA 中,时钟信号可以直接来自片外的时钟源(理想的情况下是通过有时钟功能的引脚获得),或者可以用 MMCM 或者锁相环(PLL) 在内部生成。任何用于生成时钟的MMCM 或者 PLL 在复位之后都需要进行校准。因此,可能需要在全局复位路径中插入额外的逻辑来稳定时钟。
技巧3:在对 FPGA 的全局复位取消断言之前,确保由 MMCM 或PLL 生成的时钟是稳定且被锁定的
图 4 是 FPGA 中典型的复位实现方法。
赛灵思寄存器的 SR 控制端口属于高电平有效。如果 RTL 代码描述的是低电平有效的设置/重设/预设/清除功能,那么综合工具在驱动寄存器的控制端口之前,必须首先推断出一个反相器。由于必须使用查找表来完成反相操作,所以需要一个 LUT 输入。这个因使用低电平有效的控制信号而增加的逻辑可能导致运行时间延长,器件利用率下降。而且它还会给时序和功耗造成不利影响。
那么底线是什么呢?在 HDL 代码或者实例化组件中尽量使用高电平有效的控制信号。在无法控制设计中控制信号的极性的时候,应在代码的最顶层对信号进行反相操作。用这种方法进行描述,推断出的反相器可以并入 I/O 逻辑中,无需占用额外的 FPGA 逻辑或者布线。
技巧 4:高电平有效复位能够实现更高的器件利用率,并可改善性能
值得注意的是,FPGA 不是一定需要全局复位。全局复位和设计中的其它线路一样,要争用相同的布线资源。全局复位一般具有高扇出,因为它需要扩展到设计中的每一个触发器。这样会消耗大量的布线资源,对器件的利用率和时序性能造成不利影响。由此,有必要探索出不是建立在完整的全局复位基础之上的其它复位机制。
在配置或重配置赛灵思 FPGA时,每一个单元(包括触发器和 block RAM)都需要进行初始化,如图 5 所示。因此,FPGA 配置具有与全局复位一样的效果,因为它能将 FPGA中的每一个存储元件的初始状态都设置为已知状态。
可以从 RTL 代码中推断触发器初始化值。图 6 的示例说明了如何对 RTL中寄存器的初始化进行编码。FPGA 工具能够综合这些信号的初始化,尽管通常会误以为做不到。底层 VHDL 信号或者 Verilog 寄存器的初始化值会成为推断出的触发器的 INIT 值,这个值会在配置的过程中被加载到触发器中。
使用寄存器还可以在配置过程中初始化 block RAM。随着基于处理器的系统中嵌入式 RAM 数量的增多,BRAM初始化已经成为一项有用的功能。这是因为预先定义的 RAM 能够简化仿真设置,并且无需使用引导顺序为嵌入式设计清空内存。
全局置位/复位 (GSR) 信号是一种特殊的预布线复位信号,能够在 FPGA配置的过程中让设计保持初始状态。在配置完成后,GSR 会被释放,所有的触发器及其它资源都加载的是 INIT 值。除了在配置进程中运行 GSR,用户设计还可以通过实例化 STARTUPE2 模块并连接到 GSR 端口的方法来访问 GSR 网。使用该端口,设计可以重新断言 GSR网,相应地 FPGA 中的所有存储元件将返回到它们的 INIT 属性所规定的状态。
取消断言 GSR 是异步的,需要使用多个时钟才能影响到设计中的所有触发器。对于状态机、计数器或者其它能够自动改变状态的逻辑,需要一个显示的复位,用于同步取消用户时钟断言。因次,使用 GSR 作为唯一的复位机制可能导致系统不可靠。
因此,最好是综合采用多种方法来有效地管理启动。
技巧 5:依靠 GSR 提供的内置初始化功能,同时对设计中能够自动启动的部分进行显式复位,这种综合法能够带来更高的利用率和性能。
在使用 GSR 设置整个设计的初始状态之后,对需要同步复位的逻辑单元(比如状态机)使用显式复位。可使用标准的亚稳态解决电路或者复位桥来生成同步的显式复位。
使用恰当的复位实现利用率的最大化
RTL 代码中使用的复位类型对工具将设计映射到 FPGA 底层资源的能力有重大影响。在编写 RTL 代码的时候,设计人员应根据情况定制子设计的复位方式,以便工具能够把设计映射到这些资源。
应注意的是,SRL、LUTRAM 和BRAM 中内容的初始化,只能用 GSR方法来完成,不能使用显式复位。因此,在为以上这些资源编写代码时,应注意避免在编码中使用复位。例如,如果一段 RTL 代码描述的是一个 32 位移位寄存器,而且对移位寄存器的 32 个阶进行显式复位,那么综合工具将无法将这段 RTL 代码直接映射到 SRL32E上, 因为它无法满足该资源的编码复位要求。作为替代,该代码将围绕SRL32E 推断出 32 个触发器,或推断出一些其它电路,用以实现要求的复位功能。相对于不使用复位的 RTL 代码,这两种解决方案都会占用更多资源。
技巧 6:在映射到 SRL、LUTRAM或者 BRAM 时,不要为 SRL 或者RAM 阵列的复位进行编码
在 7 系列器件中,不能把具有不同控制信号的触发器打包到同一个 Slice中。对于低扇出复位,这样会给 Slice的总体利用率造成不利影响。在同步复位的情况下,综合工具可以使用 LUT(如图 7 所示)来实现复位功能,而不是使用触发器的控制端口,故而可将复位当作控制端口移除。这样就可以把得到的 LUT/触发器对与其它不使用其 SR端口的触发器打包。这样做的结果是LUT 使用率虽然会上升,但 Slice 的使用率可以得到改善。
技巧 7:同步复位能够增强 FPGA利用率。在设计中应使用同步复位,而不是异步复位
一些较大的专用资源(即 BRAM和 DSP48E1 单元)内含的寄存器可以被推断为专用资源功能的组成部分。BRAM 包含可选的输出寄存器,可利用该寄存器以及附加的时延时钟来改善时钟频率。DSP48E1 有许多寄存器,既可以作为流水线来增加最大时钟速度,也可作为周期时延 (Z-1)。但是这些寄存器只具备同步置位/复位功能。
技巧 8:使用同步复位可以允许综合工具使用 DSP48E1 Slice 或BRAM等专用资源内部的寄存器。这样能够改善设计中相应部分的器件总体使用率和性能,同时降低总体功耗。
如果 RTL 代码描述的是异步置位/复位,那么综合工具就无法使用这些内部寄存器。作为替代,它将使用 Slice触发器,因为它们能够实现要求的异步置位/复位功能。这样不仅会导致器件利用率降低,还会给性能和功耗造成不利影响。
多种选择
有多种复位方法可供 FPGA 选择,每种都有自身的优势和不足。这里提出的建议有助于设计人员为自己的设计选择最适合的复位结构。理想的复位结构能够改善 FPGA 的器件使用率、时序和功耗。