竞争、冒险、毛刺

竞争:同一个信号,经过不同通路到达某一个门电路的输入端,时间上有先后(不是同时到达)的一种现象
冒险:由于竞争导致输入产生了干扰信号,也就是预期不该有的信号
如下图,输出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

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

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值