FPGA信号沿检测(上升沿,下降沿,双沿,单bit,双bit)

这个是我在做HDLBits中遇到的一道题,然后我查了相关资料,就总结了一下
(https://hdlbits.01xz.net/wiki/Edgedetect)所有的波形均符合题目中的要求
仿真的波形如下:
在这里插入图片描述
这个是单bit信号的边沿检测,其实如果懂了单bit信号的,多bit信号也自然就会了
在这里插入图片描述

在这里插入图片描述
上面最近的这幅图是每个bit位展开之后波形图,每个检测信号均占据一个时钟周期。虽然和题目中检测信号相比输入信号未延时一个周期,后期如果需要再加寄存器延迟即可。

这个是代码

module edgeDetect(
        input                clk,
        input                insig,             // 单bit输入
        output reg       pos_edge,        //  检测单bit数据上升沿
        output reg       neg_edge,        //  检测单bit数据下降沿
        output reg       both_edge,       //  检测单bit数据双边沿

        input          [7:0] insigbits,         // 多bit输入
        output reg [7:0] outsigbits_pos,    // 检测多bit数据上升沿
        output reg [7:0] outsigbits_neg,    // 检测多bit数据下降沿
        output reg [7:0] outsigbits_both    // 检测多bit数据双边沿
    );


    reg d_last;       //状态寄存器
    always @(posedge clk) begin
        d_last <= insig;			
        pos_edge <= insig & ~d_last;
        neg_edge <= ~insig & d_last;
        both_edge <= insig ^ d_last;
    end

    
    reg [7:0] signalbitsOld;
    always @(posedge clk) begin
        signalbitsOld <= insigbits;
        outsigbits_pos <= insigbits & ~signalbitsOld;
        outsigbits_neg <= ~insigbits & signalbitsOld;
        outsigbits_both <= insigbits ^ signalbitsOld;
    end

endmodule

测试程序:


module edgeDetect_tb;

    reg clk;
    reg insig;
    reg [7:0] insigbits;
    wire pos_edge, neg_edge, both_edge;
    wire [7:0] outsigbits_pos;
    wire [7:0] outsigbits_neg; 
    wire [7:0] outsigbits_both; 

    initial begin
        clk = 0;
        insig = 0;
        insigbits = 8'h00;
        #100 insig = 1;
        #50 insig = 0;
        #20 insig = 1;
        #60 insig = 0;
        #40 insig = 1;
        #40 insig = 0;
        #100 insigbits = 8'h02;
        #30 insigbits = 8'h0e;
        #30 insigbits = 8'h00;
        #10 insigbits = 8'h0e;
        #40 insigbits = 8'h19;
        #1000 $stop;
    end

    always #10 clk = ~clk;

    edgeDetect ut(
            .clk(clk),
            .insig(insig),        // 单bit输入
            .pos_edge(pos_edge),    //  检测单bit数据上升沿
            .neg_edge(neg_edge),    //  检测单bit数据下降沿
            .both_edge(both_edge),    //  检测单bit数据双边沿
            .insigbits(insigbits),       // 多bit输入
            .outsigbits_pos(outsigbits_pos),    // 检测多bit数据上升沿
            .outsigbits_neg(outsigbits_neg),    // 检测多bit数据下降沿
            .outsigbits_both(outsigbits_both)    // 检测多bit数据双边沿
        );

endmodule

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值