边沿检测电路

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

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

边沿检测

上升沿检测

原理图

请添加图片描述
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

波形如下:

请添加图片描述

FPGA中,边沿检测电路主要用于检测信号的上升沿或下降沿,并给出相应的指示信号。边沿检测电路的实现方法有多种,其中一种方法是通过寄存器和逻辑门的组合来实现。具体步骤如下: 1. 首先,将需要检测边沿的信号延迟一拍,得到延迟后的信号。 2. 然后,将延迟后的信号与原始信号进行逻辑运算,以检测出上升沿或下降沿。例如,对于上升沿检测电路,可以使用逻辑与门将延迟后的信号与原始信号的取反进行逻辑与运算。 3. 最后,将逻辑与门的输出作为边沿检测电路的输出信号。 这样,当输入信号发生上升沿或下降沿时,边沿检测电路将给出相应的信号指示。 需要注意的是,在实际应用中,为了确保稳定性,可以采用多级寄存器来实现边沿检测电路。例如,使用两级或三级寄存器来锁存结果,以避免亚稳态的影响。通过多级寄存器的组合,可以提高电路的稳定性和可靠性。 总结起来,FPGA边沿检测电路可以通过延迟信号、逻辑运算和寄存器的组合来实现。这样的电路能够检测输入信号的上升沿或下降沿,并给出相应的指示信号。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [FPGA基础设计(—):边沿检测电路](https://blog.csdn.net/weixin_47421560/article/details/123011273)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值