Xilinx FPGA高级设计及应用
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

2.4 同步设计思想

2.4.1 异步电路和同步电路

采用同步时序设计是FPGA设计的一个重要原则。下面简单比较一下异步电路和同步电路的特点。

1. 异步电路

电路的核心逻辑用组合逻辑电路实现。例如,异步FIFO/RAM读写信号、地址译码等电路。电路的主要信号、输出信号等并不依赖于任何一个时钟信号,不是由时钟信号驱动触发器产生的。异步时序电路的最大缺点是容易产生毛刺。

2. 同步实现电路

电路的核心逻辑用各种各样的触发器实现。电路的主要信号、输出信号等都是由某个时钟沿驱动触发器产生出来的。同步时序电路可以很好地避免毛刺。

3. 同步电路和异步电路的资源占用率

如果单纯从ASIC设计来看,大约需要7个门来实现一个D触发器,而一个门即可实现一个2输入与非门,所以一般来说,在ASIC设计中,同步时序电路比异步电路占用更大的面积。但是,由于FPGA是定制好的低层单元,对于Xilinx器件,一个底层可编程单元Slice包含两个触发器(FF)和一个查找表(LUT)。其中触发器用以实现同步电路,查找表用以实现组合电路。FPGA的最终使用率用Slice来衡量。所以对于某个选定器件,其可实现同步电路和异步电路的资源数量和比例是固定的。这点造成了过度使用查找表,会浪费触发器资源;反之则相反。因而对于FPGA,同步时序设计不一定比异步设计多消耗资源。单纯从节约资源的角度考虑,应该按照芯片配置的资源比例实现设计,但是设计者还要时刻权衡同步设计没有毛刺、信号稳定等优点,所以对于FPGA设计推荐采用同步设计。

无论是用离散逻辑、可编程逻辑,还是用全定制硅器件实现的任何数字逻辑,为了成功操作,可靠的时钟是非常关键的。设计不良的时钟在极限的温度、电压或制造工艺的偏差情况下都将导致错误,并且调试困难、花销很大。因此,FPGA同步设计首先要考虑的因素是主时钟的选择。全局时钟布线资源一般使用特殊工艺实现(如全铜层),并设计了专用时钟缓冲与驱动结构,从而使全局时钟到达FPGA芯片内部的所有可配置单元、I/O单元和选择性RAM的时延和抖动都最小。因此,FPGA同步设计中最好的时钟解决方案是由专用全局时钟输入引脚驱动单个主时钟去控制设计项目中的每一个触发器。系统中各个功能模块使用统一同步复位电路。

通常情况下(已知复位信号与时钟的关系),异步复位的最大缺点在于异步复位导致设计变成异步时序电路,如果复位信号出现毛刺,将会导致触发器的误动作,影响设计的稳定性。同时,如果复位信号与时钟关系不确定,将会导致亚稳态情况的出现。FPGA同步设计中,时序电路应尽量采用同步电路,尽可能使用同步器件,尽量减小或不使用门控时钟(为了降低系统功耗除外)。设计中不用系统主时钟经过逻辑运算得到控制信号,避免使用非时钟信号作为触发器的时钟输入。

2.4.2 一般组合逻辑的同步设计

信号在FPGA器件内部通过连线和逻辑单元连接时都有一定的延时,延时的大小与连线的长短和逻辑单元的数目有关,同时还受器件制造工艺、工作电压、温度等条件的影响。信号的高、低电平转换也需要一定的过渡时间。可以概括地讲,只要输入信号同时变化,组合逻辑必将产生毛刺(经过内部走线)。将组合逻辑的输出直接连接到D触发器时钟输入端、清零或置位端口的设计方法是错误的,这可能导致严重的后果。

图2-32 FPGA中D触发器同步设计

毛刺并不是对所有的输入都有危害,如D触发器的D输入端,只要毛刺不出现在时钟的上升沿并且满足数据的建立时间和保持时间,就不会对系统造成危害,可以说D触发器的D输入端对毛刺不敏感。利用D触发器D输入端对毛刺信号的不敏感性进行FPGA同步设计,如图2-32所示。

2.4.3 二次时钟的同步设计

FPGA设计中经常会遇到需要分频的情况,通常情况下的做法是先用高频时钟计数,然后使用计数器的某一位输出作为工作时钟进行其他的逻辑设计。其实,这样的方法是不规范的,如下面的描述方法:

            process
            begin
                if(clk′event and clk=′1′)then
                    if fck=′1′then
                        count<=(others=>′0′);
                    else
            count<=count+1;
            end process;
            process
            begin
                    if(count(2′)event and count(2)=′1′)then
                        shift reg<=data;
            end process;

在上述的第一个process描述中,首先计数器的输出结果(count(2))相对于全局时钟clk已经产生了一定的延时(延时的大小取决于计数器的位数和所选择使用的器件工艺);而在第2个process中使用计数器的bit2作为时钟,shift reg相对于最终给出的时序分析也是不可靠的。第2个process正确描述如下:

            process
            begin
                if(clk′event and clk=′1′)then
                    if count(2 DOWNTO 0)="000"then
                        shift reg<=data;
                    end if;
            end process;

2.4.4 多时钟系统的同步设计

当一个设计中的两个模块分别使用不同的时钟信号,则它们之间的接口为异步工作模式,这时为了保证数据能正确地处理需要附加时序约束条件,采用同步化设计。假设存在这样一个多时钟系统,时钟CLK A用以钟控触发器REG A,时钟CLK B用以钟控触发器REG B,由于触发器REG A驱动着进入触发器REG B的组合逻辑,故时钟CLK A的上升沿相对于时钟CLK B的上升沿有建立时间和保持时间的要求。

图2-33左面的设计电路,时钟CLK A 和时钟CLK B之间的建立时间和保持时间的要求是不能满足的。图2-33右面的设计电路增加了一个触发器REG C,新的触发器REG C由触发器REG B 钟控,保证触发器REG C的输出符合触发器REG B的建立时间和保持时间。然而,这个方法使输出延时了一个时钟周期,提前一个时钟采样可以解决这个问题。

图2-33 多时钟系统及其同步设计

多时钟系统的另外一种情况是跨时钟域操作。这里的不同时钟域通常是以下两种情况:①两个时钟的频率不同;②虽然两个时钟的频率相同,但是它们是两个独立的时钟,其相位没有任何关系。

跨时钟域系统的同步设计有以下几种方法:①两级寄存器同步化采样;②异步FIFO或双口RAM(DPRAM);③保持寄存器加握手信号的方法同步(多数据、地址、控制)。两级寄存器同步化采样的典型应用电路如图2-34所示。

图2-34左面电路只能对一位异步信号进行同步,而且这个信号的宽度必须大于本级时钟的脉冲宽度,否则有可能根本采样不到这个异步信号。第二个触发器并不是避免“亚稳态的发生”,确切的说,该电路能够防止亚稳态的传播。也就是说,一旦第一个触发器发生了亚稳态(可能性存在),由于第二个触发器的存在,亚稳态不会沿数据通路级联传播到后面的电路中。图2-34右面电路为异步信号小于一个时钟周期宽度情况下的同步设计电路。

图2-34 一位同步器结构

假设输入的数据是高电平,那么由于第一个触发器FFI是高电平清零,所以输出也是高电平,采样正确。如果输入的数据是低电平,那么第一个触发器FFI被强制清零,这个时候输出为零,这样就保证了输出的正确性。虽然这种方法可以防止亚稳态的传播,但是并不能保证两级(三级)触发器后的数据是正确的,因此这种电路都有一定数量的错误电平数据,仅适用于少量对错误不敏感的地方。对于数据的延迟不可测或变动情况,需要建立同步机制,如数据通过FIFO或RAM,可以达到数据同步的目的。

把数据存放在RAM或FIFO的方法是,将上级芯片提供的数据随路时钟作为写信号,将数据写入RAM或FIFO,然后使用本级的采样时钟(一般是数据处理的主时钟),将数据读出来。这种做法的关键是数据写入RAM或FIFO时要可靠,如果使用同步RAM或FIFO,就需要有一个与数据相对延迟关系固定的随路指示信号,这个信号可以是数据的有效指示,也可以是上级模块将数据打出来的时钟。

握手信号机制是异步系统之间通信的基本方式,在处理不同时钟之间的接口时,也可以采用这种方式,但需要注意的是仔细分析握手和应答信号有效持续的时间,确保采样数据的正确性。

2.4.5 非同源时钟同步化(D触发器使能信号的合理使用)

如果系统中有两个或两个以上非同源时钟,数据的建立时间和保持时间很难得到保证。最好的方法是将所有非同源时钟同步化。使用FPGA内部的锁相环(PLL或DLL,DCM)是一个效果很好的方法,但不是所有FPGA都带有PLL、DLL、DCM,而且带有PLL功能的芯片大多价格昂贵,除非有特殊要求,一般场合可以不使用带PLL的FPGA。使用带使能端的D触发器,并引入一个高频时钟可以实现同步设计,如图2-35所示。系统有两个不同源时钟,一个为3MHz,一个为5MHz,不同触发器使用不同的时钟。为了系统稳定,引入一个20MHz时钟,将3MHz和5MHz时钟同步化,20MHz的高频时钟将作为系统时钟,输入到所有触发器的时钟端。3M EN和5M EN将控制所有触发器的使能端,即原来接3MHz时钟的触发器接20MHz时钟,同时3M EN将控制该触发器使能端;原来接5MHz时钟的触发器也接20MHz时钟,同时5M EN将控制该触发器使能端。这种方法可以将任何非同源时钟同步化。

图2-35 非同源时钟及其同步化

2.4.6 数据接口同步设计

数据接口的同步是FPGA设计的一个重点和难点。很多设计工作不稳定都是源于数据接口的同步问题。

在电路设计阶段,有一些设计者养成了手动插入BUFT或与非门调整数据延迟,从而保证本级的时钟对上级模块数据的建立时间、保持时间的要求。还有一些设计者为了有稳定的采样,生成了很多相差90°的时钟信号,用以调整数据的采样位置。这两种做法都是不可取的。因为,一旦芯片更新换代,或移植到其他器件芯片上,或工作环境发生变化,采样时序就有可能完全紊乱,造成电路瘫痪。下面从数据接口类型上介绍常用的同步方法。

1. 同步时钟域数据同步设计

如果输入数据的节拍和本级处理时钟同频,仅有相位的随机偏差,则可以直接用本级芯片的主时钟对输入数据寄存器采样,完成输入数据的同步。

若对于数据的延迟不可测,则需要建立同步机制,可以用一个同步使能,或同步指示信号。另外,使数据通过RAM或FIFO的存取,达到数据同步的目的。

把数据存放在RAM或FIFO的方法如下:将上级芯片提供的数据随路时钟作为写信号,将数据写入RAM或FIFO中,然后使用本级采样时钟(一般是数据处理的主时钟),将数据读出来即可。这种做法的关键是数据写入 RAM 或 FIFO 要可靠,如果使用同步 RAM 或FIFO,就要求有一个与数据相对延迟关系固定的随路指示信号,这个信号可以是数据的有效指示,也可以是上级模块将数据输出的时钟。

2. 异步时钟域数据同步设计

如果输入数据和本级处理时钟是异步的,特别是频率不匹配时,则要用处理时钟对输入数据做两次寄存器采样,才能完成输入数据的同步化。需要说明的是,用寄存器对异步时钟域的数据要进行两次采样,其作用是有效防止亚稳态的传播,使后级电路处理的数据都是有效电平。但是,这种做法并不能保证两级寄存器采样后的数据是正确的电平,这种处理一般都会产生一定数量的错误电平数据,所以仅适用于对少量错误不敏感的功能单元。

为了避免异步时钟域产生错误的采样电平,一般使用RAM、FIFO的缓存方法完成异步时钟域的数据同步。最常用的缓存单元是DPRAM,一种方法是在输入端使用上级时钟写入数据,在输出端使用本级时钟读取数据,完成异步时钟域的数据转换;另一种方法是使用乒乓方式,即用两块RAM,当写完其中一块时发出一个指示信号,下级模块即可读取该RAM中的数据,该方法的前提是读取数据的速度要比写入数据的速度快。

3. 时序约束

在对高速数据接口设计中,为了设计的稳健性和可移植性,需要对周期、建立时间、保持时间等添加相应的约束。约束的作用如下:

● 提高设计的工作频率。满足接口数据同步的要求,通过附加周期、建立时间和保持时间等约束,可以控制逻辑的综合、映射、布局和布线,减小逻辑和布线延时,从而提高工作频率,满足接口数据同步的要求。

●获得正确的时序分析。几乎所有的FPGA设计平台都包含静态时序分析工具,利用这类工具可以获得映射布局布线后的时序分析报告,从而对设计的性能做出评估。静态时序分析工具以约束作为判断时序是否满足设计要求的标准,因此要求设计者正确输入约束,以便静态时序分析工具输出正确的时序分析报告。

Xilinx FPGA关于数据接口同步常用的约束包括Period、OFFSET IN BEFORE、OFFSET IN AFTER、OFFSET OUT BEFORE和OFFSET OUT AFTER等,下面分别进行介绍。

(1)周期约束(Period)。Xilinx FPGA对时钟周期的定义如图2-36所示。

图2-36 时钟周期的定义

时钟的最小周期定义为

TCLK=TCKO+TLOGIC+TNET+TSETUP-TCLK SKEW

TCLK SKEW=TCD2 -TCD1

式中,TCKO为时钟输出时间,TLOGIC为同步元件之间的组合逻辑延迟,TNET为网线延迟,TSETUP为同步元件的建立时间,TCLK SKEW为时钟信号延迟的差别。

(2)OFFSET IN BEFORE约束和OFFSET IN AFTER约束。这两者都是输入偏移约束,OFFSET IN BEFORE约束说明了输入数据比有效时钟沿提前多长时间准备好,芯片内部与输入引脚相连的组合逻辑的延迟不能大于该时间,否则有效时钟沿到来时,数据还没有稳定,采样将发生错误。OFFSET IN AFTER约束指出输入数据在有效时钟沿之后多长时间到达芯片的输入引脚,这样也可以得到芯片内部延迟的上限,从而对与输入引脚相连的组合逻辑进行约束。输入数据到达芯片引脚延迟的计算如图2-37所示。

图2-37 输入到达时间的计算

计算公式为

TARRIVAL=TCKO+TOUTPUT+TLOGIC

即输入数据在有效时钟沿之后的TARRIVAL时刻到达。有了这个数据之后,可以对设计输入端附加OFFSET IN AFTER约束。例如,NET DATA IN OFFSET=IN TARRIVAL AFTER CLK,这样在对同步元件输入端的逻辑进行约束后,综合实现工具会使输入端的延迟 TINPUT满足以下关系:

TARRIVAL+TINPUT+TSETUP<TCLK

式中,TINPUT为输入端的组合逻辑、网线和PAD 的延迟之和,TSETUP为输入同步元件的建立时间。

(3)OFFSET OUT AFTER约束和OFFSET OUT BEFORE约束。这两者都是输出偏移约束,OFFSET OUT AFTER约束规定了输出数据在有效时钟沿之后多长时间稳定下来,芯片内部的输出延迟必须小于这个值。OFFSET OUT BEFORE约束指出了下一级芯片的输入数据应在有效时钟沿之前多长时间准备好。

从下一级输入端的延迟可以计算出当前设计输出的数据必须在何时稳定下来,根据这个数据对设计输出端的逻辑布线进行约束,以满足下一级的建立时间要求,保证下一级采样的数据是稳定的,计算要求的输出稳定时间如图2-38所示。

计算公式为

TSTABLE=TLOGIC+TSETUP+TSETUP

那么,只要当前设计输出端的数据比时钟上升沿提早TSTABLE时间稳定下来,下一级就可以正确采样数据。根据这个数据可以对设计输出端附加OFFSET OUT BEFORE约束。例如,NET DATA OUT OFFSET=OUT TSTABLE BEFORE CLK,这样对同步元件输出端的逻辑进行约束后,综合工具会调整该逻辑的实现,使输出端的延迟满足以下关系:

TCKO+TOUTPUT+TSTABLE<TCLK

式中,TOUTPUT为设计中连接同步元件输出端的组合逻辑、网线和PAD的延迟之和,TCKO为同步元件时钟输出时间。

图2-38 计算要求的输出稳定时间计算