边沿检测电路

本文详细介绍了Verilog代码实现上升沿检测、下落沿检测和双边沿检测的原理与示例,通过实例展示了如何使用寄存器进行信号状态捕获。通过模块posedge_detect、negedge_detect2和double_detect2的代码,配合波形分析,帮助读者理解在时钟周期内的触发条件和输出逻辑。
摘要由CSDN通过智能技术生成

边沿检测

上升沿检测

原理图

请添加图片描述
Verilog代码如下:

module posedge_detect(
  input clk,
  input rst_n,
  input in_a,
  output p_det
);
  reg reg_q;

  always @(posedge clk or negedge rst_n) begin
    if(~rst_n) 
      reg_q <= 0;
    else begin
      reg_q <= in_a;
    end
  end
  assign p_det = in_a && (!reg_q);
endmodule

仿真代码如下:

module tb();
  reg		clk;
  reg		rst_n;
  reg   in_a;
  wire	p_det;
                                          
  parameter		CLOCK_CYCLE = 20;    
                                          
  posedge_detect DUT(
    .clk    (clk ),
    .rst_n  (rst_n),
    .in_a   (in_a),
    .p_det  (p_det)
  );

  initial begin
    clk = 1'b0;		       		
    rst_n = 1;
    in_a = 0;
  end

  always #(CLOCK_CYCLE/2) clk = ~clk;  		
                                                   
  initial  begin						       		
    #(CLOCK_CYCLE*2);				            
    rst_n = 1'b0;
    #(CLOCK_CYCLE*2);				            
    rst_n = 1'b1;
    
    @(posedge clk);
    #35 in_a = 1;

    @(posedge clk);
    #15 in_a = 0;

    @(posedge clk);
    #35 in_a = 1;

    @(posedge clk);
    #15 in_a = 0;

    #(CLOCK_CYCLE*5);
    $finish();
  end

  initial	begin
	 $fsdbDumpfile();	    
   	 $fsdbDumpvars;
  end

endmodule     

波形如下:

请添加图片描述

tb中若使in_a在clk的上升沿变为1,则reg_q会在同一个时钟上升变为1,同一个时钟上升沿p_det采样到in_a 和req_q 的值都为0。

打两拍

原理图
请添加图片描述

module posedge_detect2(
  input clk,
  input rst_n,
  input in_a,
  output p_det
);
  reg reg_q1;
  reg reg_q2;

  always @(posedge clk or negedge rst_n) begin
    if(~rst_n) begin 
      reg_q1 <= 0;
      reg_q2 <= 0;
    end
    else begin
      reg_q1 <= in_a;
      reg_q2 <= reg_q1;
    end
  end
  assign p_det = in_a && (!reg_q2);
endmodule

波形如下:
请添加图片描述

下升沿检测

原理图
请添加图片描述

Verilog代码如下:

module negedge_detect2(
  input clk,
  input rst_n,
  input in_a,
  output n_det
);
  reg reg_q1;
  reg reg_q2;

  always @(posedge clk or negedge rst_n) begin
    if(~rst_n) begin 
      reg_q1 <= 0;
      reg_q2 <= 0;
    end
    else begin
      reg_q1 <= in_a;
      reg_q2 <= reg_q1;
    end
  end
  assign n_det = (!in_a) && (reg_q2);

endmodule

**波形如下:
请添加图片描述

双边沿检测

原理图
请添加图片描述

Verilog代码如下:

module double_detect2(
  input clk,
  input rst_n,
  input in_a,
  output d_det
);
  reg reg_q1;
  reg reg_q2;

  always @(posedge clk or negedge rst_n) begin
    if(~rst_n) begin 
      reg_q1 <= 0;
      reg_q2 <= 0;
    end
    else begin
      reg_q1 <= in_a;
      reg_q2 <= reg_q1;
    end
  end
  assign d_det = (in_a) ^ (reg_q2);

endmodule

波形如下:

请添加图片描述

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值