毛刺问题

605 阅读9分钟

在FPGA的设计中,毛刺现象是长期困扰电子设计工程师的设计问题之一,是影响工程师设计效率和数字系统设计有效性和可靠性的主要因素。

由于信号在FPGA的内部走线和通过逻辑单元时造成的延迟,在多路信号变化的瞬间,组合逻辑的输出常常产生一些小的尖峰,即毛刺信号,这是由FPGA内部结构特性决定的。

毛刺现象在FPGA的设计中是不可避免的,有时任何一点毛刺就可以导致系统出错,尤其是对尖峰脉冲或脉冲边沿敏感的电路更是如此。

毛刺产生的原因

如果一个组合逻辑电路中有"毛刺"出现,就说明该电路存 在"冒险"。

毛刺产生的根本原因是信号在芯片内部走线时产生的延迟。

由于延迟的作用,多个信号到达终点的时间有先有后,形成了竞争,由竞争产生的错误输出就是毛刺。所以,毛刺发生的条件就是在同一时刻有多个信号输入发生改变。

冒险

在具有竞争可能的组合电路中,由于输入端的竞争而导致的输出端出现不该有的干扰脉冲(即所谓毛刺),就称为冒险。表现为输出端出现了原设计中没有的窄脉冲,常称其为毛刺。

消除冒险竞争

1 利用冗余项法 --- 修改逻辑设计

存在竞争的情况下,增加冗余项,实现输出消除毛刺。

2 采用可靠性编码,如格雷码;

3 引入旁路滤波电容,输出并联滤波电容消除毛刺; ---- 滤波电容

4 选通信号

毛刺产生的条件

不正确的尖峰信号 -----毛刺

1 数据稳定传输必须满足建立和保持时间的要求。

2 竞争和冒险

由于延迟的作用,多个信号到达终点的时间有先有后,形成了竞争,由竞争产生的错误输出就是毛刺。所以,毛刺发生的条件就是在同一时刻有多个信号输入发生改变。

消除毛刺的方法

1 利用冗余项法

利用冗余项消除毛刺有2种方法:代数法和卡诺图法,两者都是通过增加冗余项来消除

2 采样法

由于冒险多出现在信号发生电平跳变的时刻,即在输出信号的建立时间内会产生毛刺,而在保持时间内不会出现,因此,在输出信号的保持时间内对其进行采样,就可以消除毛刺信号的影响。

常用的采样方法有2种:

一种使用一定宽度的高电平脉冲与输出相与,从而避开了毛刺信号,取得输出信号的电平值。这种方法必须保证采样信号在合适的时间产生,并且只适用于对输出信号时序和脉冲宽度要求不严的情况。
另一种更常见的方法叫锁存法,是利用D触发器的输入端D对毛刺信号不敏感的特点,在输出信号的保持时间内,用触发器读取组合逻辑的输出信号。由于在时钟的上升沿时刻,输出端Q=D,当输入的信号有毛刺时,只要不发生在时钟的上升沿时刻,输出就不会有毛刺。这种方法类似于将异步电路转化为同步电路,实现简单,但同样会涉及到时序问题。

利用时钟上升沿时候,输出端Q=D,当输入的信号有毛刺时,只要不发生在时钟的上升沿时刻,输出就不会有毛刺。

--------采样法是在 输出信号的保持时间进行采样----类似于异步的同步处理

如果在输出信号的保持时间内对其进行“采样”,就可以消除毛刺信号的影响。

3 吸收法

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

4 延迟法

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

5 硬件描述语言

这种方法是从硬件描述语言入手,找出毛刺产生的根本原因,改变语言设计,产生满足要求的功能模块,来代替原来的逻辑功能块。

在Verilog编程时,需要注意以下几方面,在绝大多数情况下可避免综合后仿真出现冒险问题。

1)时序电路建模时,用非阻塞赋值。

2)锁存器电路建模时,用非阻塞赋值。

3)用always和组合逻辑建模时,用阻塞赋值。

4)在同一个always块中建立时序和组合逻辑模型时,用非阻塞赋值。

5)在同一个always块中不要既使用阻塞赋值又使用非阻塞赋值。

6)不要在多个always块中为同一个变量赋值。

避免在综合时引入锁存器的注意点包括:

1)组合电路的每一个if-else语句要完整,即每一个if要对应一个else,时序电路if语句不完整不会出现锁存器问题。

   2)case语句要完整,即每一个case语句对应一个default。

为什么触发器需要满足建立时间和保持时间

由于数据传输到达触发器时会延时,那么需要在时钟有效沿来之前把数据准备好,以便采样到正确的数据;

数据被采样完毕后,到下一个触发器时还会延时,保持时间是为了在时钟有效沿到达之后,后一级的触发器也能正确采样。

如果不满足建立时间和保持时间就会进入亚稳态。

我们可以通过改变设计,破坏毛刺产生的条件,来减少毛刺的发生。例如,在数字电路设计中,常常采用格雷码计数器取代普通的二进制计数器,这是因为格雷码计数器的输出每次只有一位跳变,消除了竞争冒险的发生条件,避免了毛刺的产生。

毛刺并不是对所有的输入都有危害,例如D触发器的D输入端,只要毛刺不出现在时钟的上升沿并且满足数据的建立和保持时间,就不会对系统造成危害,我们可以说D触发器的D输入端对毛刺不敏感。

根据这个特性,我们应当在系统中尽可能采用同步电路,这是因为同步电路信号的变化都发生在时钟沿,只要毛刺不出现在时钟的沿口并且不满足数据的建立和保持时间,就不会对系统造成危害。 (由于毛刺很短,多为几纳秒,基本上都不可能满足数据的建立和保持时间)

以上方法可以大大减少毛刺,但它并不能完全消除毛刺,有时,我们必须手工修改电路来去除毛刺。一般有两种方法:

1

一般说来,冒险出现在信号发生电平转换的时刻,也就是说在输出信号的建立时间内会发生冒险,而在输出信号的保持时间内是不会有毛刺信号出现的。如果在输出信号的保持时间内对其进行"采样",就可以消除毛刺信号的影响。缺点是必须人为的保证sample信号必须在合适的时间中产生。

2

时序逻辑保持法

利用D触发器的D输入端对毛刺信号不敏感的特点,在输出信号的保持时间内,用触发器读取组合逻辑的输出信号,这种方法类似于将异步电路转化为同步电路。

为什么要满足建立时间和保持时间

因为触发器内部数据的形成是需要一定的时间的。
如果不满足建立和保持时间,触发器将进入亚稳态,进入亚稳态后触发器的输出将不稳定,在 0 和 1 之间变化,这时需要经过一个恢复时间,其输出才能稳定,但稳定后的值并不一定是你的输入值。

常用三种方法: 1.组合逻辑输出加寄存器。 原理:用一个寄存器去读带毛刺的信号,利用寄存器对输入信号的毛刺不敏感的特点去除信号中的毛刺,寄存器一般只在时钟跳变沿对输入信号敏感。

2.信号同步法 由于大多数毛刺都比较端,大概几个纳秒,只要毛刺不出现在始终跳变沿,毛刺就不会对系统造成危害了。做到真正的“同步”去除毛刺信号的关键就是保证在时钟的跳变沿读取的数据是稳定的数据而不是毛刺数据。 (1)信号延时同步法(包括数据延迟或时钟延迟) (2)状态机控制

3.格雷码计数器 使用格雷码计数器将避免毛刺的出现,因为格雷码计数器的输出每次只有一位在跳变