在FPGA的设计中,毛刺现象是长期困扰电子设计工程师的设计问题之一,是影响工程师设计效率和数字系统设计有效性和可靠性的主要因素。由于信号在FPGA的内部走线和通过逻辑单元时造成的延迟,在多路信号变化的瞬间,组合逻辑的输出常常产生一些小的尖峰,即毛刺信号,这是由FPGA内部结构特性决定的。毛刺现象在FPGA的设计中是不可避免的,有时任何一点毛刺就可以导致系统出错,尤其是对尖峰脉冲或脉冲边沿敏感的电路更是如此。
任何组合电路、反馈电路和计数器都可能是潜在的毛刺信号发生器,但毛刺并不是对所有输入都有危害,如触发器的D输入端,只要毛刺不出现在时钟的上升沿并满足数据的建立保持时间,就不会对系统造成危害。而当毛刺信号成为系统的启动信号、控制信号、握手信号,触发器的清零信号(CLEAR)、预置信号(PRESET)、时钟输入信号(CLK)或锁存器的输入信号时就会产生逻辑错误。在实际设计过程中,应尽量避免将带有毛刺的信号直接接入对毛刺敏感的输入端上,对于产生的毛刺,应仔细分析毛刺的来源和性质,针对不同的信号,采取不同的解决方法加以消除。
因此,克服和解决毛刺问题对现代数字系统设计尤为重要。本文从FPGA的原理结构的角度探讨了产生毛刺的原因及产生的条件,在此基础上,总结了多种不同的消除方法,在最后结合具体的应用对解决方案进行深入的分析。
1毛刺产生的原因
以图1的例子分析毛刺产生的起因:图1是一个3位同步加法计数器,当使能端为高电平时,在每个时钟上升沿时刻,QA,QB,QC从000逐步变到111,进入到全1状态后,进位输出端输出半个时钟脉冲宽度的高电平,但从图2仿真结果中可以看到在011变化到100时刻ROC出现了尖脉冲,即毛刺。
以Xilinx的FPGA为例分析其内部结构,如图3所示[2]。
FPGA芯片是由可构造的输入输出块(Input/OutputBlock,IOB)、可构造逻辑块(CinfigurableLogicBlock,CLB)和可编程连线资源(ProgrammableInterconnectArray,PIA)3种可构造单元构成的。IOB位于芯片内部四周,在内部逻辑阵列与外部芯片封装引脚之间提供一个可编程接口,他主要由逻辑门、触发器和控制单元组成。CLB组成了FPGA的核心阵列,能完成用户指定的逻辑功能;每个CLB主要有一个组合逻辑、几个触发器、若干个多选一电路和控制单元组成;PIA位于芯片内部的逻辑块之间,经编程后形成连线网络,用于芯片内部逻辑间的相互连接,并在他们之间传递信息。从图3中可以看出,对于不同的输入1、2,到逻辑块(M)的走线可能是不同的,这就造成了输入信号的延迟,假设1、2同时变化,由于延迟的存在,到达M时就有先有后(这种现象称为竞争),在逻辑输出端就可能会有险象(也称冒险),即产生了毛刺。在上述例子中的011状态,假设QA与QB同时从1变化到0,而QC提前了2ns从0变到1,产生一个2ns的高电平,这就是毛刺。也就是说,在FPGA设计中,毛刺产生的根本原因是信号在芯片内部走线时产生的延迟。
2毛刺产生的条件
借助同样的例子来分析毛刺产生的条件。QA,QB,QC在每一个时钟上升沿同时发生翻转,但实际中由于延迟的存在,并不能保证QA,QB,QC到D触发器的布线长短一致。如果QC比QA,QB提前了2ns,这就形成了2ns的全1状态,称为“假象全1”,进而导致进位输出产生一个尖脉冲。值得注意的是,在3变到4即011到100时,3位中有2位同时发生翻转,即在同一时刻有大于一个的信号发生改变。由于延迟的作用,多个信号到达终点的时间有先有后,形成了竞争,由竞争产生的错误输出就是毛刺。所以,毛刺发生的条件就是在同一时刻有多个信号输入发生改变。
3消除毛刺的方法
知道了毛刺产生的条件,就可以通过改变设计,破坏其条件来减少毛刺的发生。例如,利用格雷码计数器每次输出只有一位跳变的特性,代替普通的二进制计数器,避免了毛刺的产生[3]。还可以对电路进行改进,以消除毛刺对系统的影响。下面对各种方法做分别介绍:
3.1利用冗余项法
利用冗余项消除毛刺有2种方法:代数法和卡诺图法,两者都是通过增加冗余项来消除险象,只是前者针对于函数表达式而后者针对于真值表。以卡诺图为例,若两个卡诺圆相切,其对应的电路就可能产生险象。因此,修改卡诺图,在卡诺图的两圆相切处增加一个圆,以增加多余项来消除逻辑冒险。但该法对于计数器型产生的毛刺是无法消除的。
3.2采样法
由于冒险多出现在信号发生电平跳变的时刻,即在输出信号的建立时间内会产生毛刺,而在保持时间内不会出现,因此,在输出信号的保持时间内对其进行采样,就可以消除毛刺信号的影响,常用的采样方法有2种:一种使用一定宽度的高电平脉冲与输出相与,从而避开了毛刺信号,取得输出信号的电平值。这种方法必须保证采样信号在合适的时间产生,并且只适用于对输出信号时序和脉冲宽度要求不严的情况。另一种更常见的方法叫锁存法,是利用D触发器的输入端D对毛刺信号不敏感的特点,在输出信号的保持时间内,用触发器读取组合逻辑的输出信号。由于在时钟的上升沿时刻,输出端Q=D,当输入的信号有毛刺时,只要不发生在时钟的上升沿时刻,输出就不会有毛刺。这种方法类似于将异步电路转化为同步电路,实现简单,但同样会涉及到时序问题。 |