竞争、冒险、毛刺

本文探讨了数字电路中常见的竞争与冒险问题,竞争是指信号通过不同路径到达门电路输入端的时间差异,而冒险则是由此产生的不期望的干扰脉冲。通过示例展示了在低速电路中如何利用电容滤波来减少冒险。同时,通过两种不同的电路结构,说明了如何通过增加寄存器来消除输出信号的毛刺,确保稳定输出。仿真波形图对比了有毛刺产生和无毛刺产生的状态,直观地展示了消除冒险的措施效果。

竞争:同一个信号,经过不同通路到达某一个门电路的输入端,时间上有先后(不是同时到达)的一种现象
冒险:由于竞争导致输入产生了干扰信号,也就是预期不该有的信号
如下图,输出F=A’ & A;由于反相器的存在,导致A’相比于A到达与门输入端的时间会滞后,导致出现干扰脉冲信号
在这里插入图片描述
但是竞争不一定会有冒险,比如在低速数字电路,输出并联加入小电容滤波,即使输入端有竞争,脉冲持续时间比较短,刚往上跳动时候,电容通电也不会有脉冲,也就不一定有冒险,有冒险肯定有竞争
下面举个产生毛刺和消除毛刺的例子

测试文件

`timescale 1ns/1ns
module test;
    reg clk;
    reg rstn;
    reg en;
    reg din_rvs;
    reg flag;

    initial begin
        rstn = 1'b0;
        clk  = 1'b0;
        #5 rstn = 1'b1;

        forever begin
            #5 clk = ~ clk;
        end
    end

    initial begin
        en = 1'b0;
        din_rvs = 1'b1;
        #19;
        en = 1'b1;
        #1;
        din_rvs = 0;
        #1000;
        $finish();
    end

    comptt_hazard inst0(
            .clk        (clk),
            .rstn       (rstn),
            .en         (en),
            .din_rvs    (din_rvs),
            .flag       (flag)                
    );
    initial begin
	    $fsdbDumpfile("comptt_hazard_fan");
	    $fsdbDumpvars;
	    $vcdpluson;
	    end
endmodule

assign语句

`timescale 1ns/1ns
module comptt_hazard(
    input           clk,
    input           rstn,
    input           en,
    input           din_rvs,
    output  reg        flag
    );
    
    wire condition;
    assign condition = din_rvs & en ;

    always @(posedge clk or negedge rstn)begin
        if(!rstn)begin
            flag <= 1'b0;
        end
        else begin
            flag <= condition;
        end
    end

endmodule

输出信号使用专用寄存器直接输出结构,用触发器锁存稳定的值避免采样毛刺

`timescale 1ns/1ns;
module comptt_hazard(
    input           clk,
    input           rstn,
    input           en,
    input           din_rvs,
    output  reg        flag
    );

    
    reg en_ff;
    always @(posedge clk or negedge rstn)begin
        if(!rstn)begin
            en_ff <= 1'b0;
        end
        else begin
            en_ff <= en;
        end
    end

    reg din_rvs_ff;
    always @(posedge clk or negedge rstn)begin
        if(!rstn)begin
            din_rvs_ff <= 1'b0;
        end
        else begin
             din_rvs_ff <=  din_rvs;
        end
    end
    
    assign condition = din_rvs_ff & en_ff;
   
    //D触发器寄存一拍
    always @(posedge clk or negedge rstn)begin
        if(!rstn)begin
            flag <= 1'b0;
        end
        else begin
            flag <= condition;
        end
    end

endmodule

仿真波形图分别如下图
有毛刺产生
在这里插入图片描述
无毛刺产生
在这里插入图片描述

在数字电路设计中,亚稳态、竞争冒险毛刺是三种常见的非理想现象,它们可能影响电路的稳定性和可靠性。尽管三者之间存在一定的联系,但它们的本质、成因以及对电路的影响各不相同。 ### 亚稳态(Metastability) 亚稳态通常发生在异步信号进入同步系统时,例如当一个异步输入信号被触发器采样时,若其变化发生在触发器的建立时间和保持时间窗口内,则可能导致触发器无法在规定时间内稳定到高电平或低电平状态[^1]。这种状态下,触发器的输出处于不确定状态,既不是逻辑“0”也不是逻辑“1”,并且可能需要额外的时间才能稳定下来。亚稳态的持续时间虽然很短,但在关键路径上可能会导致系统错误。 ### 竞争冒险(Race Condition) 竞争冒险是指在时序逻辑电路中,由于输入信号与时钟信号到达触发器的不同路径延迟不同而导致的问题。当输入信号和时钟信号同时改变,并且它们到达同一触发器的时间不一致时,就可能发生竞争。这可能导致触发器误动作,从而引发整个电路的误操作。同步设计通过确保所有触发器在同一时钟边沿动作来减少这类问题的发生概率[^2]。 ### 毛刺(Glitch) 毛刺通常出现在组合逻辑电路中,是由于多个输入信号的变化顺序和时间差异导致输出出现短暂的非预期电压脉冲。这些尖峰脉冲不会影响组合逻辑电路的最终输出状态,但如果被后续的存储元件捕获,则可能导致错误的操作。毛刺可以通过优化组合逻辑的设计来减少或消除,比如增加冗余逻辑门以平衡信号传播延迟等方法[^3]。 ### 区别与联系 - **区别**:亚稳态主要涉及触发器在特定条件下不能确定其输出状态;竞争冒险关注的是信号与时钟之间的相对定时问题;而毛刺则是组合逻辑内部信号转换过程中产生的瞬态干扰。 - **联系**:三者都是数字电路设计中需要避免的现象,因为它们都可能导致数据处理错误。此外,在某些情况下,毛刺可以成为触发器误动作的原因之一,进而引发亚稳态或者竞争冒险的情况[^2][^3]。 为了减轻这些问题的影响,设计师会采用各种技术,如使用同步FIFO来处理跨时钟域的数据传输以防止亚稳态,实施严格的时序约束来避免竞争冒险,以及利用卡诺图或其他逻辑综合工具来识别并消除组合逻辑中的毛刺源。 ```verilog // 示例:使用两级同步器减少亚稳态风险 module synchronizer ( input async_signal, input clk, output reg sync_signal ); always @(posedge clk) begin reg first_stage; first_stage <= async_signal; // 第一级锁存异步信号 sync_signal <= first_stage; // 第二级进一步稳定信号 end endmodule ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值