Menu Close

FPGA及硬件设计中的竞争与冒险

在数字逻辑 设计中, 由于使用组合逻辑,或者由于布线原因(布线长度是不固定的),逻辑门延迟等原因在逻辑电路内部会产生毛刺信号,毛刺信号会对整个电路 的可靠性和稳定性产生极大的影响,通常称为冒险。通常来说,需要避免或者消除毛刺的影响。在际FPGA 设计中,由于布线产生的输入信号到达时间不等,这时就不容易消除毛刺。因为每次FPGA 的布线都是不同的, 即使使用约束限制FPGA 布线也不能完全控制布线延迟。在FPGA 设计中,也不能将所有信息都添加约束,这样约束文件冗长,也不利于修改,在FPGA 逻辑修改时,也增加约束难度。因此,限制或者消除毛刺将是FPGA 设计中的重要课题。ASIC设计也存在同样的问题。下面就竞争,冒险产生的机理以及如何消除冒险的影响进行详细探讨。

1 竞争

在组合逻辑中,1个信号经过不同路径达到逻辑输出端 , 或者多个信号经过多个路径到达输出端时,由于不同路径走线,会产生逻辑或者布线延迟,所以到达输出端的时间也是不同的,因此造成了输出结果在一段时间内不惟一或不稳定,这种现象叫做竞争。竞争是一种现象,一个事实,是客观存在的。

  • 布线延迟造成竞争

产生竞争的一个非常重要的原因是布线延迟不均等。     举例说明:假设在远端A,B的值是同时变化的。

 

图1 – 1

Verilog 逻辑为: assign OUT = A & B;  (假设 A,B 赋值为:A = 1, B= 0;A= 0, B = 1;)

真值表:

input A input B  output OUT
0 0 0
0 1 0
1 0 0
1 1 1

从图1 中可以看出,由于A,B布线长短不同,所以到达and 门的时间不同,经过and门后,按照时间顺序输出为0, 1(noise) , 0。这种结果显然与设计预期(真值表)是不相符的。

  • 逻辑延迟

逻辑延迟也是产生竞争的主要原因。如图1-2,如果不考虑延迟因素(功能仿真),逻辑电路的输出永远为0,但实际上每次B发生变化时,OUT的输出都会伴随的短脉冲出现,一般将这种时间很短的脉冲称为毛刺。有了毛刺出现,竞争也就发生了。可见即使不考虑布线延迟因素,逻辑延迟也会引发竞争。

 

图1-2

图1-2是一个特殊的电路,对于这种逻辑设计应设法消除。但实际电路中的多级逻辑,如4位,8位全加器的设计中,都会出现多级逻辑逻辑级联。可以分析,在同时给定输入时,输出结果的竞争现象是客观存在的。

 

2 冒险

在存在竞争的组合电路中, 由于输出端竞争现象而导致输出端出现干扰(verilog 语法中不存在的逻辑,完全是由布线产生的)称之为冒险(干扰毛刺)。有冒险(干扰毛刺)就一定存在竞争, 但是有竞争不一定有冒险(毛刺)。冒险是一种结果。

例如:

out = a & b & c;  (c =0, a =x, b =x); (1)

式(1)虽然 a,b 布线长度不等,但没有冒险。 (有竞争,没有冒险)

 out = a & b & c;  (c =1, a =x, b =x);  (2)

式(2) 如果a,b 布线长度不等。 (有竞争,有冒险)

  • 冒险分类:

冒险可分为静态冒险,动态冒险两种。

静态冒险:输入有一次变化, 输出有一次冒险。

动态冒险:输入有一次变化,输出有多次冒险。

     静态冒险有分为:

静态1型冒险:稳态为1, 毛刺为0

静态0型冒险:稳态为0, 毛刺为1

 

  • 静态1型冒险

假设逻辑方程为: F = (X & (~Z)  ) (Z & Y );   当 X,Y = 1; Z 从1 变为0

图2 静态1型冒险

图3

    X = 1; Y = 1; Z = 1 -> 0 ; 输入有一个变量发生变化, ZP 是Z的反向, 所以Z 和 ZP之间存在时间差,最终在XZP 和 YZ 之间存在时间差,经过或门后 这个时间差将产生毛刺,因此。

 

  • 静态0型冒险

假设方程: F = (W | X | (~Z)) & (Z | Y) ;  W,X,Y = 3’b000;

图4 静态0型冒险

图5

思考题: 如果 F = (W | X | (~Z)) & (Z | Y) ;  W,X,Y = 3’b000;  Z = 0 -> 1;

 

always @ (posedge clk or posedge F)

if(F)…..

else …..

 

  • 动态冒险

wire WX = W | X;

wire XY = Y | (~X);

wire WXY = WX & XY;

wire WXZ = (~W) & (~X) & Z;

 

assign F = WXY | WXZ;

图6

  • 异步信号输入

异步信号输入,经过时钟采样后,组合逻辑输出时,也会产生毛刺现象,具体情况请参考Verilog信号边沿检测电路

由于冒险的存在,可能会输出结果不稳定,严重的会导致逻辑电路设计失败。因此应想办法消除冒险。

3 冒险消除方法

1)增加滤波电容:组合电路逻辑输出到片外。可以使用滤波电容来消除毛刺,从而避免冒险。

图7

 

2)使用选通信号,消除毛刺输出

图8 – 1

图8 – 2

3)修改逻辑设计

假设A,B,C,D 的逻辑关系为:     D = (A & B) | ((~A) & C);

其中&为逻辑“与”,|表示“或” ,~表示逻辑“反”

当B = C = 1 ;   D = A | (~A)     , A从 1 -> 0

 

图9-1

图9 – 2

图9-3

  • 增加冗余设计: 利用冗余项消除毛刺函数式和真值表所描述的是静态逻辑,而竞争则是从一种稳态到另一种稳态的过程。因此竞争是动态过程,它发生在输入变量变化时。此时,修改卡诺图,增加多余项,在卡诺图的两圆相切处增加一个圆,可以消除逻辑冒险。
  • 采用选通电路: 通过控制选通电路的时间(位置),可以有效的避免由于布线等原因产生的毛刺,即有毛刺的地方不选通。 比如时序电路中的posedge clk 也可以有效去除毛刺, 只要cnt + 1 在一个时钟周期内可以稳定输出

reg [7:0] cnt = 0;

always @ (posedge clk)

cnt <= cnt + 1;

 

  • 采用可靠性编码,如格雷码 。 比如状态机 st = 00, 01, 10, 11    格雷码状态机: 00, 01 , 11, 10.

4 检查电路是否存在竞争冒险

 

图10

1)相切的卡诺图有竞争冒险

2)使用示波器测量

3)使用后仿真进行仿真

 

5 常见的出现竞争冒险

情况1:

reg [1:0] cs = 0;
reg [1:0] ns = 0;

always @ (posedge clk)
if(reset) cs <= 0;
else cs <= ns;

reg q = 0;
always @ (*)
case (ns)
0:
begin
    q = 1;
    ns = cs + 1;
end
1:
begin
    q = 0;
    ns = cs + 1;
end
2:
begin
    q = 0;
    ns = cs + 1;
end
3:
begin
    q = 1;
    ns = cs + 1;
end
endcase

 

由于不小心,将第二段状态机中的case 语句 case (cs)  误写为 case(ns) , 使得整个状态机的跳转出现混乱。

解决方法: 将状态机逻辑写对,可以解决上述问题。 或者使用一段式状态机来完成相应的逻辑。

reg [1:0] st = 0;

always @ (posedge clk)
if(reset) st <= 0;
else 
case (st)
0:
begin
    q <= 1;
    st <= st + 1;
end
1:
begin
    q <= 0;
    st <= st + 1;
end
2:
begin
    q <= 0;
    st <= st + 1;
end
3:
begin
    q <= 1;
    st <= st + 1;
end
endcase

 

情况2:

always @ (*)

cnt = cnt + 1;

 

解决方案 :

always @ (posedge clk)

cnt <= cnt + 1;

Posted in FPGA, FPGA 教材教案, Verilog, 教材与教案, 文章

发表回复

相关链接