一、摘要
本篇博客主要记录使用Verilog实现对脉冲的上升沿和下降沿检测;
下面的链接是博主所写的“基于basys2的按键消抖”,其中状态机实现按键消抖使用了本篇博客所介绍的边缘检测电路。
https://www.cnblogs.com/zqh1126/p/14406822.html
二、电路结构
主要电路结构:两个寄存器(D触发器),两个反相器,两个与门
电路图如下:
三、代码实现
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
检测过程如下:
当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