1 竞争与冒险
竞争: 信号经不同的路径到达同一汇合点的时间上有先有后的现象。
冒险: 由于竞争导致电路输出端发生瞬间错误的现象。
代数法判断有互补的信号---存在竞争
1 利用冗余项法 --- 修改逻辑设计,增加冗余项
2 利用可靠性编码,如格雷码。
3 加滤波电容
4 加选通信号
2 毛刺
毛刺的产生:
1 数据稳定传输必须满足建立和保持时间的要求。
2 竞争和冒险
由于延迟的作用,多个信号到达终点的时间有先有后,形成了竞争,由竞争产生的错误输出就是毛刺。所以,毛刺发生的条件就是在同一时刻有多个信号输入发生改变。
消除毛刺:
1 采样法: 对输出信号的保持时间进行采样
由于冒险多出现在信号发生电平跳变的时刻,即在输出信号的建立时间内产生毛刺。而在保持时间内不会出现,因此,在输出信号的保持时间内对其进行采样,就可以消除毛刺信号的影响。
采用锁存法: 利用D触发器的输入端D对毛刺信号不敏感的特点,在输出信号的保持时间内,用触发器读取组合逻辑的输出信号。
由于时钟上升沿时刻,输出端Q=D,当输入的信号有毛刺时,只要不发生在时钟的上升沿时刻,输出就不会有毛刺。
2 吸收法: 滤波电容
3 延迟法: 对于相对延迟较小的支路,加上毛刺宽度的延迟可以消除毛刺。
4 利用冗余项: 增加冗余项
5 硬件描述语言: 规范
时序电路建模,用非阻塞。 锁存器电路建模,用非阻塞。
always和组合逻辑建模,用阻塞。
同一个always块建立时序和组合逻辑模型,用非阻塞赋值。
同一个always块既使用时序和组合,用非阻塞。
避免在综合时引入锁存器的注意点包括:
1)组合电路的每一个if-else语句要完整,即每一个if要对应一个else,时序电路if语句不完整不会出现锁存器问题。
2)case语句要完整,即每一个case语句对应一个default。
3 格雷码
我们可以通过改变设计,破坏毛刺产生的条件,来减少毛刺的发生。
例如,在数字电路设计中,常常采用格雷码计数器取代普通的二进制计数器,这是因为格雷码计数器的输出每次只有一位跳变,消除了竞争冒险的发生条件,避免了毛刺的产生。
毛刺并不是对所有的输入都有危害,例如D触发器的D输入端,只要毛刺不出现在时钟的上升沿并且满足数据的建立和保持时间,就不会对系统造成危害,我们可以说D触发器的D输入端对毛刺不敏感。
根据这个特性,我们应当在系统中尽可能采用同步电路,这是因为同步电路信号的变化都发生在时钟沿,只要毛刺不出现在时钟的沿口并且不满足数据的建立和保持时间,就不会对系统造成危害。 (由于毛刺很短,多为几纳秒,基本上都不可能满足数据的建立和保持时间)
4 异步fifo,格雷码
异步FIFO通过比较读写地址进行满空判断,但是读写地址属于不同的时钟域,所以在比较之前需要先将读写地址进行同步处理。
格雷码每两个相邻码字之间只有1bit的变化,将多bit的地址抓换成格雷码。然后进行跨时钟域的传递, 就可以直接使用两级寄存器 进行同步。由于只有1bit的变化,即使采样错误也只有一种错误的可能,最多也就是保持原来的状态,不会出现其他不稳定的状态,
由于异步fifo的读指针和写指针分别属于不同的时钟域,这样指针在进行同步的过程中容易出错,采用格雷码,相邻每位只有一位发生变化,这样在进行指针同步时候,就会产生同步正确。 即使同步出错,出错的结果也是写指针的跳变不变。
对于读空判断,最多导致fifo在不是真空的时候产生,而不会出现读空。 格雷码保证即使读写指针同步后出错,也不影响fifo功能的正确性。