首页 > 其他分享 >基于Verilog的脉冲边缘检测电路及代码实现

基于Verilog的脉冲边缘检测电路及代码实现

时间:2023-01-07 17:00:26浏览次数:60  
标签:clk 脉冲 reg 电路 Verilog rst data tmp0 时钟

一、摘要

本篇博客主要记录使用Verilog实现对脉冲的上升沿和下降沿检测;
下面的链接是博主所写的“基于basys2的按键消抖”,其中状态机实现按键消抖使用了本篇博客所介绍的边缘检测电路。
https://www.cnblogs.com/zqh1126/p/14406822.html

二、电路结构

主要电路结构:两个寄存器(D触发器),两个反相器,两个与门
电路图如下:
image

三、代码实现

Verilog实现
`timescale 1ns / 1ps
module edge_detection(
 input clk      ,
 input rst_n    ,
 input data_in  ,
 
 output nedge   ,
 output pedge
    );
    reg  tmp0;
	reg  tmp1;
	//边沿检测,使用D触发器存储两个相邻时钟上升沿时外部输入信号(已经同步到系统时钟域中)的电平状态
   always@(posedge clk or negedge rst_n )
    begin
	  if(!rst_n)
	   begin
		 tmp0 <= 1'b0;
		 tmp1 <= 1'b0;
		 end
	  else
	    begin
		  tmp0 <= data_in;
		  tmp1 <= tmp0;
		 end
    end
	
	assign nedge = !tmp0  &  tmp1  ;    //检测到时钟下降沿时产生一个时钟周期的高脉冲
	assign pedge =  tmp0  & (!tmp1);    //检测到时钟上升沿时产生一个时钟周期的高脉冲

endmodule


Testbench
`timescale 1ns / 1ps

module edge_detection_tb;
 //input
 reg clk      ;
 reg rst_n    ;
 reg data_in  ;
 
 //output
 wire nedge   ;
 wire pedge   ;

edge_detection uut(
   .clk     (clk    ),
   .rst_n   (rst_n  ),
   .data_in (data_in),
			
   .nedge   (nedge  ),
   .pedge   (pedge)
);

always #10 clk = ~clk;

initial begin
    clk = 0;
	rst_n = 0;
	data_in = 0;
	#100  rst_n = 1;
	#1000 data_in = 0;
	#30   data_in = 1;
	#1000 data_in = 0;

end

endmodule
仿真图如下:

image

检测过程如下:

当data_in从0到1,也就是检测到上升沿时。信号变化如下:(下降沿同理,这里不再赘述)

1.初始化后所有信号都是低电平
2.data_in信号拉高后,当第一个时钟上升沿(时钟有效沿)到来后,tmp0由低电平变为高电平,tmp1保持低电平。 
3.第二个时钟上升沿(时钟有效沿)到来后,tmp0保持高电平,tmp1由低电平变为高电平;此时对tmp0和tmp1进行相关组合逻辑运算即tmp0  & (!tmp1),pedge信号会产生一个时钟周期的高脉冲;

本篇随笔为学习记录所用,如有侵权请联系作者。

标签:clk,脉冲,reg,电路,Verilog,rst,data,tmp0,时钟
From: https://www.cnblogs.com/zqh1126/p/16147094.html

相关文章