同步信号边沿检测@sync_sig_edge_detect
1、边沿检测
1.1 目的
检测信号的跳变,即上升沿(0→1)或下降沿(1→0)。
1.2 应用
常用于检测1bit信号的电平跳变,例如光耦、按键、微动开关等器件在正常工作时会产生由0到1或者由1到0的跳变,检测到边沿的跳变后就能知道这些器件在什么时候被触发,方便进行其它的逻辑判断。
1.3 检测方法
设置两个寄存器A和B,分别寄存当前状态和后一状态,若当前状态和后一状态不同,则表示信号有跳变。具体判断逻辑如下:
(1)若A为High,而B为Low,则检测到上升沿;
(2)若A为Low,而B为High,则检测到下降沿;
(3)若A≠B,则检测到双边沿。
2、Verilog代码
2.1 功能描述
用于检测与系统时钟同步的信号的上升沿和下降沿
2.2 源代码
//==========================================================
// 作者:DingXY的硬件笔记本
// 邮箱:1324830818@qq.com
// 日期:2025/08/13
// 功能描述:用于检测与系统时钟同步的信号的上升沿和下降沿
//==========================================================
module sync_sig_edge_detect
#(
parameter INITIAL_VALUE = 1'b1 //待检测的同步信号的初始值
)(
input clk ,//系统时钟
input rst_n ,//复位信号(低电平有效)
input sync_sig ,//待检测的同步信号
output wire sync_sig_pos,//同步信号的上升沿
output wire sync_sig_neg //同步信号的下降沿
);
//----------------------------------------------------------
// 同步信号的上升沿和下降沿
//----------------------------------------------------------
reg sync_sig_temp ;//待检测的同步信号寄存1拍
always @(posedge clk or negedge rst_n) begin
if(rst_n == 1'b0)
sync_sig_temp <= INITIAL_VALUE ;
else
sync_sig_temp <= sync_sig ;
end
assign sync_sig_pos = ( sync_sig) & (~sync_sig_temp) ;
assign sync_sig_neg = (~sync_sig) & ( sync_sig_temp) ;
endmodule
2.3 TestBench仿真代码
//定义时间刻度
`timescale 1ns/1ns
module sync_sig_edge_detect_tb();
//-------------------------------------------------------------------
// 信号定义
//-------------------------------------------------------------------
reg clk ;//系统时钟
reg rst_n ;//复位信号,低电平有效
reg sync_sig ;//待检测的同步信号
wire sync_sig_pos;//同步信号的上升沿
wire sync_sig_neg;//同步信号的下降沿
//-----------------------------------------------------------
// 定义主时钟,周期20ns,频率50MHz
//-----------------------------------------------------------
always #10 clk = ~ clk ;
//-----------------------------------------------------------
// 设计仿真时序
//-----------------------------------------------------------
initial begin
clk <= 1'b0 ;
rst_n <= 1'b0 ;
sync_sig <= 1'b1 ;
//系统开始工作
#50 rst_n <= 1'b1 ;
//设计待检测信号
#100 sync_sig <= 1'b0 ;
#200 sync_sig <= 1'b1 ;
#140 sync_sig <= 1'b0 ;
#180 sync_sig <= 1'b1 ;
//结束仿真
#100 $finish ;
end
//-----------------------------------------------------------
// 例化sync_sig_edge_detect模块
//-----------------------------------------------------------
sync_sig_edge_detect
#(
.INITIAL_VALUE (1'b1 ) //待检测的同步信号的初始值
)
sync_sig_edge_detect_inst0
(
.clk (clk ),//系统时钟
.rst_n (rst_n ),//复位信号(低电平有效)
.sync_sig (sync_sig ),//待检测的同步信号
.sync_sig_pos (sync_sig_pos ),//同步信号的上升沿
.sync_sig_neg (sync_sig_neg ) //同步信号的下降沿
);
endmodule