摘 要: 毛刺现象在FPGA 设计中非常普遍, 而毛刺的出现往往导致系统结果的错误。本文从FPGA 的原理结构的角度深入探讨了毛刺产生的原因及产生的条件, 总结了多种不同的解决方法, 并结合具体的应用对解决方案进行深入地分析。
FPGA (F ield P rogrammable Gate A rray) 以其容量大、功能强以及可靠性高等特点, 在现代数字通信系统中得到广泛的应用。采用FPGA 设计数字电路已经成为数字电路系统领域的主要设计方式之一[ 1 ]。在FPGA 的设计中, 毛刺现象是长期困扰电子设计工程师的设计问题之一, 是影响工程师设计效率和数字系统设计有效性和可靠性的主要因素。由于信号在FPGA 的内部走线和通过逻辑单元时造成的延迟, 在多路信号变化的瞬间, 组合逻辑的输出常常产生一些小的尖峰, 即毛刺信号, 这是由FPGA内部结构特性决定的。毛刺现象在FPGA 的设计中是不可避免的, 有时任何一点毛刺就可以导致系统出错, 尤其是对尖峰脉冲或脉冲边沿敏感的电路更是如此。因此, 克服和解决毛刺问题对现代数字系统设计尤为重要。本文从FPGA 的原理结构的角度探讨了产生毛刺的原因及产生的条件, 在此基础上, 总结了多种不同的消除方法, 在最后结合具体的应用对解决方案进行深入的分析。
1 毛刺产生的原因
以图1 的例子分析毛刺产生的起因: 图1 是一个3 位同步加法计数器, 当使能端为高电平时, 在每个时钟上升沿时刻, QA , QB, QC 从000 逐步变到111, 进入到全1状态后, 进位输出端输出半个时钟脉冲宽度的高电平, 但从图2 仿真结果中可以看到在011 变化到100 时刻ROC出现了尖脉冲, 即毛刺。
以Xilinx 的FPGA 为例分析其内部结构, 如图3 所示。
FPGA 芯片是由可构造的输入输出块( Input/ OutputBlock, IOB)、可构造逻辑块(Cinfigurable Logic Block, CLB ) 和可编程连线资源( Programmable Interconnect Array, PIA ) 3 种可构造单元构成的。IOB 位于芯片内部四周, 在内部逻辑阵列与外部芯片封装引脚之间提供一个可编程接口, 他主要由逻辑门、触发器和控制单元组成。CLB 组成了FPGA 的核心阵列, 能完成用户指定的逻辑功能; 每个CLB 主要有一个组合逻辑、几个触发器、若干个多选一电路和控制单元组成; PIA 位于芯片内部的逻辑块之间, 经编程后形成连线网络, 用于芯片内部逻辑间的相互连接, 并在他们之间传递信息。从图3 中可以看出,对于不同的输入1、2, 到逻辑块(M ) 的走线可能是不同的,这就造成了输入信号的延迟, 假设1、2 同时变化, 由于延迟的存在, 到达M 时就有先有后(这种现象称为竞争) , 在逻辑输出端就可能会有险象(也称冒险) , 即产生了毛刺。在上述例子中的011 状态, 假设QA 与QB 同时从1 变化到0, 而QC 提前了2 ns 从0 变到1 , 产生一个2 ns 的高电平,这就是毛刺。也就是说, 在FPGA 设计中, 毛刺产生的根本原因是信号在芯片内部走线时产生的延迟。
2 毛刺产生的条件
借助同样的例子来分析毛刺产生的条件。QA , QB,QC 在每一个时钟上升沿同时发生翻转, 但实际中由于延迟的存在, 并不能保证QA , QB, QC 到D 触发器的布线长短一致。如果QC 比QA , QB 提前了2 ns, 这就形成了2 ns 的全1 状态, 称为“假象全1”, 进而导致进位输出产生一个尖脉冲。值得注意的是, 在3 变到4 即011 到100时, 3 位中有2 位同时发生翻转, 即在同一时刻有大于一个的信号发生改变。由于延迟的作用, 多个信号到达终点的时间有先有后, 形成了竞争, 由竞争产生的错误输出就是毛刺。所以, 毛刺发生的条件就是在同一时刻有多个信号输入发生改变。
3 消除毛刺的方法
知道了毛刺产生的条件, 就可以通过改变设计, 破坏其条件来减少毛刺的发生。例如, 利用格雷码计数器每次输出只有一位跳变的特性, 代替普通的二进制计数器, 避免了毛刺的产生[ 3 ]。还可以对电路进行改进, 以消除毛刺对系统的影响。下面对各种方法做分别介绍:
3、1 利用冗余项法
利用冗余项消除毛刺有2 种方法: 代数法和卡诺图法, 两者都是通过增加冗余项来消除险象, 只是前者针对于函数表达式而后者针对于真值表。以卡诺图为例, 若两个卡诺圆相切, 其对应的电路就可能产生险象。因此, 修改卡诺图, 在卡诺图的两圆相切处增加一个圆, 以增加多余项来消除逻辑冒险。但该法对于计数器型产生的毛刺是无法消除的。
3、2 采样法
由于冒险多出现在信号发生电平跳变的时刻, 即在输出信号的建立时间内会产生毛刺, 而在保持时间内不会出现, 因此, 在输出信号的保持时间内对其进行采样, 就可以消除毛刺信号的影响, 常用的采样方法有2 种: 一种使用一定宽度的高电平脉冲与输出相与, 从而避开了毛刺信号, 取得输出信号的电平值。这种方法必须保证采样信号在合适的时间产生, 并且只适用于对输出信号时序和脉冲宽度要求不严的情况。另一种更常见的方法叫锁存法, 是利用D 触发器的输入端D 对毛刺信号不敏感的特点, 在输出信号的保持时间内, 用触发器读取组合逻辑的输出信号。由于在时钟的上升沿时刻, 输出端Q = D , 当输入的信号有毛刺时, 只要不发生在时钟的上升沿时刻, 输出就不会有毛刺。这种方法类似于将异步电路转化为同步电路, 实现简单, 但同样会涉及到时序问题。
3、3 吸收法
由于产生的毛刺实际上是高频窄脉冲, 故增加输出滤波, 在输出端接上小电容C 就可以滤除毛刺。但输出波形的前后沿将变坏, 在对波形要求较严格时, 应再加整形电路, 该方法不宜在中间级使用。
3、4 延迟法
因为毛刺最终是由于延迟造成的, 所以可以找出产生延迟的支路。对于相对延迟小的支路, 加上毛刺宽度的延迟可以消除毛刺。但有时随着负载增加, 毛刺会继续出现,而且, 当温度变化, 所加的电压变化或要增加逻辑门时, 所加的延迟是不同的, 必须重新设计延迟线, 因而这种方法也是有局限性的。而且采用延迟线的方法产生延迟会由于环境温度的变化而使系统可靠性变差。
3、5 硬件描述语言法
这种方法是从硬件描述语言入手, 找出毛刺产生的根本原因, 改变语言设计, 产生满足要求的功能模块, 来代替原来的逻辑功能块。在图1 电路中, 一个3 位计数器可能会在011 到100 和101 到110 发生跳变时产生毛刺, 究其原因是因为一次有2位发生跳变, 可以采用VHDL 语言对计数器编写如下, 产生的计数模块代替原来普通的计数器。
subdesign modcount
(clk, reset: input; q[2110 ]: output; )
variable
counter3
:MACH IN E O F B ITS ( r [2110 ])
W ITH STA TES ( r0= B"101" ,
r1= B"100" ,
r2= B"000" ,
r3= B"001" ,
r4= B"011" ,
r5= B"010" ,
r6= B"110" ,
r7= B"111") ;
begin
q[ ]= rr [ ];
counter31reset= reset;
counter31clk= clk;
CA SE counter3 IS
w hen r0= > counter3= r1;
w hen r1= > counter3= r2;
w hen r2= > counter3= r3;
w hen r3= > counter3= r4;
w hen r4= > counter3= r5;
w hen r5= > counter3= r6;
w hen r6= > counter3= r7;
w hen r7= > counter3= r0;
END CA SE;
end;
注意在新的计数器中, 每次状态发生改变时Q 0, Q 1,Q 2 只有1 位发生跳变, 从根本上消除了毛刺。但计数器的输出状态没有规律, 不便于其他电路利用。如果希望计数器的输出状态有规律变化以便其他电路使用, 可以考虑采用双输出电路, 一路是单信号输出, 一路是正常计数输出。这种方法从根本上消除了毛刺产生的根源, 具有普遍的意义, 对系统也不会产生影响, 是最为可靠的方法, 其不利之处是这种方法对VHDL 语言要求比较高, 必须对电路的工作状态及其转变有全面的分析和掌握, 而随着电路的复杂度提高, 毛刺产生的来源繁杂, 实现起来比较困难。
对于一般情况下产生的毛刺, 可以尝试用D 触发器来消除。但用D 触发器消除时, 有时会影响到时序, 需要考虑很多问题。所以应根据不同情况, 仔细地分析毛刺产生的来源和毛刺的性质, 结合系统资源选择具体办法, 消除毛刺的影响。
4 具体实例
在实际应用中要对一个周期同步脉冲信号进行检测,要求若在给定的时间内没有检测到同步信号则给出一定脉冲宽度的高电平, 作为复位信号。设计思想是采用一个计数器, 当有同步信号时对其清零, 并同时开始计数, 根据给定时间和系统时钟周期设定计数器的模数, 经过给定的时间后输出高电平, 满足宽度后再置低。
实际要求检测时间大约1 s, 脉冲宽度保持在20ms左右, 采用5 片74161 级联, 第5 片计数器的ROC 接D 触发器的使能端。同步信号输入后, 清零并开始计数, 若不再出现同步脉冲, 经16^5 个时钟周期后, 第5 片的RCO端输出一个高电平, 使触发器的Q 输出D (高电平) , 再过16^33 2个时钟周期后使第4 片的QA , QB, QC, QD 接组合门电路输出低电平, 接到D 触发器的计数器预制端,使Q 输出为零。这样就实现经一定延时后的一定宽度的脉冲。经仿真结果如图4 所示。
仿真平台采用Max+ PlusII , 时钟周期设为10 ns, 经计算可以知道在101485 928 2 m s 处产生宽度为81192 Ls的高电平, 但由于存在数据建立时间和保持时间, 仿真结果中的变化时刻并不是严格与计算相符的, 其中q0, q1,q2, q3 是第5 片74161 的输出, roc1 是第4 片的进位输出,roc 是第5 片的进位输出, roc1 输出16 个高电平后, roc 同时输出一个高电平。图4 中复位信号reset 却在51247 m s和101485 297 9m s 处发生。第一个错误的原因是, 由于计数器累加, 内部走线造成的延时, 当第5 片计数器从0111状态跳变到1 000 时, 输入同时有3 位变化, 致使进位输出roc 在roc1 的第8 个输出时产生了一个尖脉冲, 使触发器的Q 端提前发生电平转变, 导致了在51247 m s 处产生错误复位信号。同样的原因, 第4 片的进位输出roc1 在第14 个输出跳变到第15 个输出时发生毛刺, 而该毛刺使第5 片161 进入计数状态, 在roc 端也产生了毛刺, 就出现了图4 中复位信号提前翻转的结果。
对于该电路中存在的毛刺问题, 可以采用2 种方法修改电路。由于该电路对时间要求的不是很严格, 对第4, 5 片74L S161 取1110 状态做最后输出, 就避免了由延迟造成的假象全1 状态, 仿真结果证明这种方法是有效的。但这种方法增加了逻辑门数量, 同时也增加了险象发生的可能性。
另一种比较可靠且常用的方法是用带使能端的D 触发器代替原来的触发器, 把计数器最后的输出roc 接到触发器的使能端, 时钟用统一的计数时钟, 由于毛刺本身是尖脉冲, 不能满足数据的建立时间和保持时间, 避免了产生的毛刺对Q 的输出的影响。从仿真结果(图5) 中可以看到, 虽然这种方法并不能消除毛刺, 但是毛刺已经不具有危害性, 故这是一种简单有效的方法。
5 结 语
任何组合电路、反馈电路和计数器都可能是潜在的毛刺信号发生器, 但毛刺并不是对所有输入都有危害, 如触发器的D 输入端, 只要毛刺不出现在时钟的上升沿并满足数据的建立保持时间, 就不会对系统造成危害。而当毛刺信号成为系统的启动信号、控制信号、握手信号, 触发器的清零信号(CL EAR)、预置信号(PRESET)、时钟输入信号(CL K) 或锁存器的输入信号时就会产生逻辑错误。在实际设计过程中, 应尽量避免将带有毛刺的信号直接接入对毛刺敏感的输入端上, 对于产生的毛刺, 应仔细分析毛刺的来源和性质, 针对不同的信号, 采取不同的解决方法加以消除。毛刺问题在FPGA 设计中非常关键, 只有深刻理解毛刺的本质, 才有可能真正掌握设计的精髓, 本文就FPGA 设计中的毛刺问题进行了深入的探讨, 分析其产生的原因和条件, 给出了几种常用的消除方法, 希望对FPGA 设计者有一定的参考作用。
参考文献
[1 ] 王毓银1 数字电路逻辑设计[M ] 1 北京: 高等教育出版社,19991
[2 ] 宋万杰1CPLD 技术及其应用[M ] 1 西安: 西安电子科技大学出版社, 19991
[ 3 ] 朱建军1 关于毛刺问题的探讨[ EB/OL ] 1http: 2004. 51
评论
查看更多