打印
[VHDL]

FPGA设计中毛刺产生原因及消除

[复制链接]
2906|17
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
gygp|  楼主 | 2012-9-14 13:37 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
在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,当输入的信号有毛刺时,只要不发生在时钟的上升沿时刻,输出就不会有毛刺。这种方法类似于将异步电路转化为同步电路,实现简单,但同样会涉及到时序问题。

相关帖子

沙发
gygp|  楼主 | 2012-9-14 13:37 | 只看该作者
3.3吸收法

由于产生的毛刺实际上是高频窄脉冲,故增加输出滤波,在输出端接上小电容C就可以滤除毛刺。但输出波形的前后沿将变坏,在对波形要求较严格时,应再加整形电路,该方法不宜在中间级使用。

3.4延迟法

因为毛刺最终是由于延迟造成的,所以可以找出产生延迟的支路。对于相对延迟小的支路,加上毛刺宽度的延迟可以消除毛刺。但有时随着负载增加,毛刺会继续出现,而且,当温度变化,所加的电压变化或要增加逻辑门时,所加的延迟是不同的,必须重新设计延迟线,因而这种方法也是有局限性的。而且采用延迟线的方法产生延迟会由于环境温度的变化而使系统可靠性变差。

3.5硬件描述语言法

这种方法是从硬件描述语言入手,找出毛刺产生的根本原因,改变语言设计,产生满足要求的功能模块,来代替原来的逻辑功能块。在图1电路中,一个3位计数器可能会在011到100和101到110发生跳变时产生毛刺,究其原因是因为一次有2位发生跳变,可以采用VHDL语言对计数器编写如下,产生的计数模块代替原来普通的计数器。

注意在新的计数器中,每次状态发生改变时Q0,Q1,Q2只有1位发生跳变,从根本上消除了毛刺。但计数器的输出状态没有规律,不便于其他电路利用。如果希望计数器的输出状态有规律变化以便其他电路使用,可以考虑采用双输出电路,一路是单信号输出,一路是正常计数输出。这种方法从根本上消除了毛刺产生的根源,具有普遍的意义,对系统也不会产生影响,是最为可靠的方法,其不利之处是这种方法对VHDL语言要求比较高,必须对电路的工作状态及其转变有全面的分析和掌握,而随着电路的复杂度提高,毛刺产生的来源繁杂,实现起来比较困难。

对于一般情况下产生的毛刺,可以尝试用D触发器来消除。但用D触发器消除时,有时会影响到时序,需要考虑很多问题。所以应根据不同情况,仔细地分析毛刺产生的来源和毛刺的性质,结合系统资源选择具体办法,消除毛刺的影响。

4具体实例

在实际应用中要对一个周期同步脉冲信号进行检测,要求若在给定的时间内没有检测到同步信号则给出一定脉冲宽度的高电平,作为复位信号。设计思想是采用一个计数器,当有同步信号时对其清零,并同时开始计数,根据给定时间和系统时钟周期设定计数器的模数,经过给定的时间后输出高电平,满足宽度后再置低。

实际要求检测时间大约1s,脉冲宽度保持在20ms左右,采用5片74161级联,第5片计数器的ROC接D触发器的使能端。同步信号输入后,清零并开始计数,若不再出现同步脉冲,经16^5个时钟周期后,第5片的RCO端输出一个高电平,使触发器的Q输出D(高电平),再过16^3*2个时钟周期后使第4片的QA,QB,QC,QD接组合门电路输出低电平,接到D触发器的计数器预制端,使Q输出为零。这样就实现经一定延时后的一定宽度的脉冲。经仿真结果如图4所示。

仿真平台采用Max+PlusⅡ,时钟周期设为10ns,经计算可以知道在10.4859282ms处产生宽度为81.92μs的高电平,但由于存在数据建立时间和保持时间,仿真结果中的变化时刻并不是严格与计算相符的,其中q0,q1,q2,q3是第5片74161的输出,roc1是第4片的进位输出,roc是第5片的进位输出,roc1输出16个高电平后,roc同时输出一个高电平。图4中复位信号reset却在5.247ms和10.4852979ms处发生。第一个错误的原因是,由于计数器累加,内部走线造成的延时,当第5片计数器从0111状态跳变到1000时,输入同时有3位变化,致使进位输出roc在roc1的第8个输出时产生了一个尖脉冲,使触发器的Q端提前发生电平转变,导致了在5.247ms处产生错误复位信号。同样的原因,第4片的进位输出roc1在第14个输出跳变到第15个输出时发生毛刺,而该毛刺使第5片161进入计数状态,在roc端也产生了毛刺,就出现了图4中复位信号提前翻转的结果。

对于该电路中存在的毛刺问题,可以采用2种方法修改电路。由于该电路对时间要求的不是很严格,对第4,5片74LS161取1110状态做最后输出,就避免了由延迟造成的假象全1状态,仿真结果证明这种方法是有效的。但这种方法增加了逻辑门数量,同时也增加了险象发生的可能性。

另一种比较可靠且常用的方法是用带使能端的D触发器代替原来的触发器,把计数器最后的输出roc接到触发器的使能端,时钟用统一的计数时钟,由于毛刺本身是尖脉冲,不能满足数据的建立时间和保持时间,避免了产生的毛刺对Q的输出的影响。从仿真结果(图5)中可以看到,虽然这种方法并不能消除毛刺,但是毛刺已经不具有危害性,故这是一种简单有效的方法。


5结语

毛刺问题在FPGA设计中非常关键,只有深刻理解毛刺的本质,才有可能真正掌握设计的精髓,本文就FPGA设计中的毛刺问题进行了深入的探讨,分析其产生的原因和条件,给出了几种常用的消除方法,希望对FPGA设计者有一定的参考作用。

使用特权

评论回复
板凳
GG_GG| | 2012-9-14 13:59 | 只看该作者
我们一般使用延时法来解决的

使用特权

评论回复
地板
彭旭| | 2013-8-13 13:10 | 只看该作者
好详细啊,学习了

使用特权

评论回复
5
yghanwuji| | 2013-8-14 10:19 | 只看该作者
不是再打个寄存器解决么··

使用特权

评论回复
6
ddn123| | 2013-8-14 10:44 | 只看该作者
为什么木有图

使用特权

评论回复
7
liu294826423| | 2013-9-9 19:41 | 只看该作者
谢谢楼主,很有用

使用特权

评论回复
8
GoldSunMonkey| | 2013-9-9 23:33 | 只看该作者
ddn123 发表于 2013-8-14 10:44
为什么木有图

我也不知道啊

使用特权

评论回复
9
GoldSunMonkey| | 2013-9-9 23:33 | 只看该作者
liu294826423 发表于 2013-9-9 19:41
谢谢楼主,很有用

您能看到图么?

使用特权

评论回复
10
liu294826423| | 2013-9-17 12:33 | 只看该作者
不能

使用特权

评论回复
11
liu294826423| | 2013-9-17 12:33 | 只看该作者
GoldSunMonkey 发表于 2013-9-9 23:33
您能看到图么?

楼主就是不能看到图,

使用特权

评论回复
12
GoldSunMonkey| | 2013-9-17 21:11 | 只看该作者
liu294826423 发表于 2013-9-17 12:33
楼主就是不能看到图,

什么意思?

使用特权

评论回复
13
GoldSunMonkey| | 2013-9-17 21:11 | 只看该作者
liu294826423 发表于 2013-9-17 12:33
楼主就是不能看到图,

什么意思?

使用特权

评论回复
14
GoldSunMonkey| | 2013-9-17 21:11 | 只看该作者
有图有真相啊

使用特权

评论回复
15
xiao6666| | 2013-9-17 21:36 | 只看该作者
好啊

使用特权

评论回复
16
feihong777| | 2013-9-17 21:37 | 只看该作者
没图啊

使用特权

评论回复
17
xjsxjtu| | 2013-9-20 19:43 | 只看该作者
没图啊

使用特权

评论回复
18
liu294826423| | 2013-9-23 13:31 | 只看该作者
GoldSunMonkey 发表于 2013-9-17 21:11
什么意思?

没图

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

183

主题

8146

帖子

15

粉丝