FPGA—边沿检测电路(下降沿)

主要用来检测信号的边沿的变化情况,以串口通信为例,串口通信数据帧的起始位到来的时候,下降沿到来的才开始传送数据,那么我们需要对这个所谓的下降沿到来做一个检测

  • 首先为什么需要边沿检测电路?always中的敏感事件列表可以用来检测信号变化,但是如果对于一个想要在always语句块中的信号边沿变化的时候,我们就需要边沿检测电路;例如下面代码中的我们需要在always语句块中检查dst_edge变化
always@(posedge clk)
begin
   case(state)
   	S1:
   		if(dst_edge) AAA;
   		else	BBB;
end
  • 边沿检测电路的核心思想,我们对要检测的信号做一个二级寄存器的延迟,然后观察这两个寄存器输出,具体如下:temp是被检测的信号,它出现了一个下降沿我们要检测这个下降沿,然后D0和D1是两个寄存器,我们可以做以下操作,也就是求<~D0 && D1>,当这个值发生一个脉冲的时候,就表示我们有边沿到来
dst = D1 && ~D0

FPGA—边沿检测电路(下降沿)_第1张图片

  • 以下是边沿检测电路的代码实现过程
module temp_test(
    input clk,
    input rst,
    input dst,
    
    output d0,
    output d1,
    output f
    );

reg d0,d1;

assign f = d1 && ~d0;

always@(posedge clk or negedge rst)
begin
    if(!rst)
        begin
            d0 <= 1'b0;
            d1 <= 1'b0;
        end
    else
        begin
            d0 <= dst;
            d1 <= d0;
        end
end

endmodule

testbench如下

module vtf_temp_test;
    reg clk;
    reg rst;
    reg dst;
    
    wire d0,d1,f;
    
    always #25 clk = ~clk;
    
    temp_test tst(
        .clk(clk),
        .rst(rst),
        .dst(dst),
        
        .d0(d0),
        .d1(d1),
        .f(f)
    );
    
    initial begin
        clk = 0;
        rst = 0;
        dst = 1;
        
        #100;    rst = 1;
        #100;    dst = 0;
    end
    
endmodule
  • RTL
    FPGA—边沿检测电路(下降沿)_第2张图片

  • 仿真波形如下

FPGA—边沿检测电路(下降沿)_第3张图片

你可能感兴趣的:(FPGA)