关于冒险和毛刺

Posted on 2015-03-13 21:44 in IC

Hazards & Glitch

所谓 “ 冒险 ” Hazard,是指一种数字电路中由于设计或者是外部因素,造成的数字信号错误的现象,而这个错误的信号就叫做毛刺 Glitch

Hazard on wiki:

In digital logic, a hazard in a system is an undesirable effect caused by either a deficiency in the system or external influences. Logic hazards are manifestations of a problem in which changes in the input variables do not change the output correctly due to some form of delay caused by logic elements (NOT, AND, OR gates, etc.) This results in the logic not performing its function properly. The three different most common kinds of hazards are usually referred to as static, dynamic and function hazards.

根据导致冒险的原因,一般将冒险分类如下:

  1. 静态冒险 Static hazards

    静态冒险,是指输入信号发生变化前后,输出信号保持不变,但是在输入信号变化时,输出信号可能产生瞬间错误输出。

    根据发生的错误的值,可以将静态冒险分为两种:

    • Static-1 Hazard: 输入变化前后,输出应该保持 1,但是在输入变化瞬间输出发生错误,变为 0

    • Static-0 Hazard: 输入变化前后,输出应该保持 0,但是在输入变化瞬间输出发生错误,变为 1

    根据导致冒险的原因分类,可以将静态冒险分为以下两种类型:

    • 逻辑冒险 logic hazard

      只有 1 个输入发生变化,导致的静态冒险。

      经分析可知产生逻辑冒险的原因是门的延迟。(参考数字电路与逻辑设计

    • 功能冒险 function hazard

      2 个或者 2 个以上的输入发生变化,导致的静态冒险。

      经分析可知产生功能冒险的原因是两个或两个以上的输入不可能同时发生变化,它们的变化总有先有后。参考数字电路与逻辑设计

  2. 动态冒险 Dynamic hazards

    动态冒险,是指输入信号变化前后,输入信号发生变化,而且在输入信号发生变化时,输出信号会变化 3 次以上

Solution

首先我们应该尽可能避免存在冒险的设计,这样就不存在解决毛刺的问题。

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

再比如遵循同步设计原则,即使有毛刺,一般也不会对系统造成危害。(因为同步电路信号的变化都发生在时钟沿,只要毛刺不出现在时钟的沿口并且不满足数据的建立和保持时间,就不会对系统造成危害。一般毛刺很短,多为几纳秒,基本上都不可能满足数据的建立和保持时间)

设计无冒险的电路,会导致电路变复杂,成本上升。对于简单电路中的冒险,我们可以采用以下的方法来解决。

Static hazards

首先判断输入信号是否会同时发生变化,可以分为两种类型:

  • 只有一个输入变化,对应的就是 logic hazards

    1. 判断是否存在冒险(代数法 or 卡诺图法

      代数法比较繁琐,但是适用范围广,对两级以上的电路均适用。注意函数表达式不能化简,否则对应的逻辑电路改变,由电路延迟造成的冒险也随之改变。

      卡诺图法方便直观,但是只适用于两级电路。

      函数表达式中的积项或和项是和卡诺图中的合并圈一一对应的,由此可知,函数的最简不一定是最佳的,必要的冗余反而可增加电路工作的可靠性。

    2. 解决冒险(增加冗余项 / 冗余圈

  • 至少有 2 个输入同时变化,对应的就是 function hazards

    1. 判断是否存在冒险

      产生功能冒险的充要条件(同时满足以下 3 个条件):

      • 必须有 P (P >= 2) 个变量同时发生变化

      • 输入变量变化前后函数值相同

      • 由变化的 P 个变量组合所构成的 2^P 个格,既有 1 又有 0

    2. 解决冒险(选通脉冲 or 滤波电路

      只要输入信号不是按照循环码的方式变化,就会产生功能冒险。功能冒险是函数的逻辑功能决定的,所以不能在设计中消除,需要加额外的选通脉冲。

      选通脉冲的思路:一般说来,冒险出现在信号发生电平转换的时刻,也就是说在输出信号的建立时间内会发生冒险,而在输出信号的保持时间内是不会有毛刺信号出现的。如果在输出信号的保持时间内对其进行 " 采样 ",就可以消除毛刺信号的影响。

      需要注意的是必须对选通脉冲的宽度及产生时间有严格的要求。加上选通脉冲之后,电路的输出就不再是电平信号,而是变为脉冲信号。

      还有另外一种方法:在对输出波形要求不高的时候,可以在输出端接一个滤波电容来消除冒险,但是这种方法会破坏波形的边沿,所以只适用于低速电路。

比较 3 种消除冒险的方法:

增加冗余只能消除 logic hazards,而不能消除 function hazards;

增加滤波电路虽然简单,但是会破坏波形;

加选通脉冲的方法则对两种类型的冒险都有效。

目前很多中规模集成电路(Medium Scale Integrated, MSI)中都设有使能端,其作用之一就是作为选通脉冲的输入端,待电路稳定之后才使输出有效。

Dynamic hazards

要解决动态冒险,首先就得知道动态冒险产生的原因:

产生动态冒险的原因是输入可以有多条变化路径到达输出,而这些路径的时延都各不相同,显然这就会导致输出变化多次,比如一个输出应该从 1 变为 0,但是实际中却先从 1 变为 0,然后又从 0 变回 1,最终返回到正确值 0。

动态的解决相对比较复杂,但是 只要消除了静态冒险,那么就不会存在动态冒险。

in FPGA Design

本部分来自:关于毛刺问题的探讨Verilog HDL 程序设计与实践

信号在 FPGA 器件内部通过连线和逻辑单元时,都有一定的延时。延时的大小与连线的长短和逻辑单元的数目有关,同时还受器件的制造工艺、工作电压、温度等条件的影响。信号的高低电平转换也需要一定的过渡时间。由于存在这两方面因素,多路信号的电平值发生变化时,在信号变化的瞬间,组合逻辑的输出有先后顺序,并不是同时变化 , 往往会出现一些不正确的尖峰信号,即毛刺信号。与分立元件不同,由于 PLD 内部不存在寄生电容电感,这些毛刺将被完整的保留并向下一级传递,因此毛刺现象在 PLD、FPGA 设计中尤为突出。

可以概括的讲,只要输入信号同时变化,(经过内部走线)组合逻辑必将产生毛刺。将它们的输出直接连接到时钟输入端、清零或置位端口的设计方法是错误的,这可能会导致严重的后果。所以我们必须检查设计中所有时钟、清零和置位等对毛刺敏感的输入端口,确保输入不会含有任何毛刺。

如前所述,优秀的设计方案,如采用格雷码计数器,同步电路等,可以大大减少毛刺,但它并不能完全消除毛刺。 毛刺并不是对所有输入都有危害,例如 D 触发器的 D 输入端,只要毛刺不出现在时钟的上升沿并且满足数据的建立和保持时间,就不会对系统造成危害。因此我们可以说 D 触发器的 D 输入端对毛刺不敏感。但对于 D 触发器的时钟端,置位端,清零端,则都是对毛刺敏感的输入端,任何一点毛刺就会使系统出错,但只要认真处理,我们可以把危害降到最低直至消除。下面我们就对几种具体的信号进行探讨。

clock

时钟信号是系统中非常关键的信号,参见其他几篇博客

set/clear

清除和置位信号要求象对待时钟那样小心地考虑它们,因为这些信号对毛刺也是非常敏感的。正如使用时钟那样,最好的清除和置位是从器件的引脚单直接地驱动。有一个主复位 Reset 引脚是常用的最好方法,主复位引脚给设计项目中每个触发器馈送清除或置位信号。几乎所有 PLD 器件都有专门的全局清零脚和全局置位。如果必须从器件内产生清除或置位信号,则要按照 “ 门控时钟 ” 的设计原则去建立这些信号,确保输入无毛刺。

combinational output

当 PLD 输出引脚给出系统内其它部分的边沿敏感信号或电平敏感信号时,这些出信号必须象内部时钟、清除和置位信号一样小心地对待。只要可能就应在 PLD 输出端寄存那些对险象敏感的组合输出。如果你不能寄存险象敏感的输出,则应符合 “ 门控时钟 ” 中讨论的门控时钟的条件。决不能用多级逻辑驱动毛刺敏感的输出。

asynchronous input

对于异步输入信号导致的毛刺,解决思想就是 同步化。参见这篇博客

Ref

Hazard on wiki

数字电路与逻辑设计

Digital Design (4th Edition)

Verilog HDL 程序设计与实践

关于毛刺问题的探讨