Verilog-实现脉冲边缘检测电路
一、摘要
本篇博客主要记录使用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信号会产生一个时钟周期的高脉冲;
本篇随笔为学习记录所用,如有错误,请各位指正批评。
分类:
Verilog
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人