边沿检测
Verilog边沿检测是数字电路设计中常用的方法之一。它是一种检测输入信号边沿变化的技术,用于实现时序控制、数据采集和数字信号处理等功能。其基本原理是通过触发器检测输入信号的状态变化,并触发相应的逻辑操作。
// 边沿检测模块
// 使用两个寄存器存储输入信号的状态,然后判断边沿类型。
module RisingEdgeDetector
(
input wire clk , // 系统时钟
input wire rst_n , // 复位信号,低电平有效
input wire sig , // 要进行边沿检测的信号
output wire p_edge // 上升沿有效信号。检测到 sig 上升沿后拉高一个时钟周期
);
reg sigPrev0; // 存储 sig 上一个时钟周期的状态
reg sigPrev1; // 存储 sigPrev0 上一个时钟周期的状态
// sigPrev0 赋值
always@(posedge clk or negedge rst_n) begin
if(rst_n == 1'b0)
sigPrev0 <= 1'b0;
else
sigPrev0 <= sig;
end
// sigPrev1 赋值
always@(posedge clk or negedge rst_n) begin
if(rst_n == 1'b0)
sigPrev1 <= 1'b0;
else
sigPrev1 <= sigPrev0;
end
// Combinational logic
assign p_edge = ~sigPrev1 & sigPrev0; // 上升沿检测
//assign neg_edge = sigPrev1 & ~sigPrev0; // 下降沿
//assign both_edge = sigPrev0 ^ sigPrev1; // 上升沿或下降沿
endmodule
仿真代码如下:
`include "RisingEdgeDetector.v"
// Code your testbench here
// or browse Examples
module testbench;
reg clk;
reg sig;
reg rst_n;
wire p_edge;
RisingEdgeDetector red_inst
(
.clk (clk) ,
.rst_n (rst_n) ,
.sig (sig) ,
.p_edge (p_edge)
);
// Generate a clock of 100MHz
always #5 clk = ~clk;
// Drive simulus to the design
initial begin
$dumpfile("RisingEdgeDetector.vcd");
$dumpvars(0, testbench);
clk <= 0;
rst_n <= 0;
sig <= 0;
#10 rst_n <= 1; // 10ns 后拉高复位信号
#15 sig <= 1;
#20 sig <= 0;
#15 sig <= 1;
#10 sig <= 0;
#20 $finish;
end
endmodule
仿真波形如下:
加作者薇信:jiyuyun18, 交流电子技术
留言:CSDN FPGA 入群,加入 FPGA 技术交流群