FPGA基础设计(—):边沿检测电路

简介

边沿检测指的是检测一个信号的上升沿或者下降沿,如果发现上升沿或者下降沿,则给出一个信号指示出来。
边沿检测电路分为:上升沿检测电路,下降沿检测电路,双沿检测电路。

实现方法

  1. 直接上图分析,例:上升沿检测电路FPGA基础设计(—):边沿检测电路_第1张图片
    检测信号data的上升沿,即data_posedge。把信号data寄存一拍,得到data_delay,然后取反在与data相与得到data_posedge:
assign D_posedge = Data & (~data1);//检测上升沿

同理:

assign D_negedge = ~Data & (data1);//检测下降沿
assign D_po_ne = Data ^ data1;//检测双沿
  1. 比方法1更容易理解,本质一样:使用两级寄存器,第二级寄存器(由D触发器组成)锁存某一时钟沿有效时的输入电平,第一级寄存器锁存住下一时钟沿有效时对应的输入电平。若两次锁存信号不一样,说明检测到了边沿。
    具体是上升沿/下降沿/双沿 同样由组合逻辑实现
assign data_posedge = (data1 && ~data2) ? 1 : 0;//上升沿
assign data_negedge = (~data1 && data2) ? 1 : 0; //下降沿
assign data_posedge = {(data1 && ~data2) | (~data1 && data2)} ? 1 : 0;//双沿
设计代码(法1)
module edge_detect(Clk,Rst_n,Data,D_posedge,D_negedge,D_po_ne);

      input Clk;
		input Rst_n;
		input Data;
		
		output D_posedge;
		output D_negedge;
		output D_po_ne;
		
		reg data1;
		
		always@(posedge Clk or negedge Rst_n)begin
		
		if(!Rst_n)
		  data1 <= 1'b0;
		else
		  data1 <= Data; //一级触发器	
		end
				
		assign D_posedge = Data & (~data1);
		assign D_negedge = ~Data & (data1);
		assign D_po_ne = Data ^ data1;
endmodule 
测试代码
`timescale 1ns/1ps

module edge_detect_tb();
      
		 reg clk;
		 reg rst;
		 reg dat;
       
		 wire D_po;
		 wire D_ne;
		 wire D_po_ne;
		 
		 initial begin
		   clk = 1'b0;
			rst = 1'b0;
			dat = 1'b0;
			
			#200 rst = 1'b1;
			#100 dat = 1'b1;
			#100 dat = 1'b0;
			#100 dat = 1'b1;
			#100
			$stop;
		 end
       always #10 clk = ~clk;
       edge_detect u1(
              .Clk(clk),
				  .Rst_n(rst),
				  .Data(dat),
				  .D_posedge(D_po),
				  .D_negedge(D_ne),
				  .D_po_ne(D_po_ne)
				  );

endmodule 
仿真结果

在这里插入图片描述

法2 参考:边沿检测

注意

实现异步信号边沿检测电路打两拍时,若输入信号data变化刚好发生在clk的建立时间与保持时间之间,第一级寄存器输出可能进入亚稳态,进而影响整个电路。
又因为进入亚稳态到稳定时间不会超过一个周期,所以第二级寄存器会采集到稳定电平,此时增加第三级寄存器,由第二级,第三级寄存器锁存的结果进行边沿检测,这样系统更稳定!

应用

在复杂的逻辑系统设计中,许多情况需检测信号的跳变;如果某个信号跳变,给出一个指示,这个指示用来触发其他动作(类似中断),此时需要一个边沿检测电路。

  1. 捕获信号的突变(UART,SPI等信号使能突变)。
  2. 逻辑分析仪中信号的边沿检测。
  3. 将时钟边沿使能转换为边沿检测使能,使时钟同步化。

你可能感兴趣的:(#,FPGA基础设计,fpga开发)