009---基于Verilog HDL的单比特信号边沿检测

文章目录


摘要

文章为学习记录。采用时序逻辑和组合逻辑实现边沿检测的核心逻辑。组合逻辑实现的上升沿和下降沿的脉冲比时序逻辑实现的上升沿和下降沿的脉冲提前一拍。


一、边沿检测

边沿检测主要作用是能够准确的识别出单比特信号的上升沿或下降沿。

边沿检测原理:利用寄存器对信号前一状态和后一状态进行寄存,若前后两个状态不同,则检测到了边沿。

二、时序逻辑实现

仿真波形如下图所示。

2.1 rtl

复制代码
module edge_dect(
input  wire  clk,
input  wire  rst_n,
input  wire  data,

output reg   pos_edge,
output reg   neg_edge
    );

reg  data_reg1;
reg  data_reg2;
reg  data_reg3;

always @(posedge clk or negedge rst_n)
begin
    if(!rst_n)
        begin
            data_reg1 <= 0;
            data_reg2 <= 0;
            data_reg3 <= 0;
        end
    else
        begin
            data_reg1 <= data;
            data_reg2 <= data_reg1;
            data_reg3 <= data_reg2;
        end
end

always @(posedge clk or negedge rst_n)
begin
    if(rst_n == 1'b0)
       pos_edge <= 1'b0;
    else if(data_reg2 && (~data_reg3)) 
       pos_edge <= 1'b1;
   else 
       pos_edge <= 1'b0;
end


always @(posedge clk or negedge rst_n)
begin
    if(rst_n == 1'b0)
       neg_edge <= 1'b0;
    else if((~data_reg2) && data_reg3) 
       neg_edge <= 1'b1;
   else 
       neg_edge <= 1'b0;
end

endmodule

2.2 tb

复制代码
module tb_edge_dect();

reg  clk;
reg  rst_n;
reg  data;

wire   pos_edge;
wire   neg_edge;

initial
begin
    rst_n = 0;
    data  = 0;
    #101;
    rst_n = 1;
    #200;
    data  = 1;
    #500;
    data  = 0;
    #200;
    $stop;
end


initial
begin
    clk = 1;
end
always #10 clk = ~clk;

edge_dect  edge_dect_inst1
(
. clk(clk),
. rst_n(rst_n),
. data(data),

. pos_edge(pos_edge),
. neg_edge(neg_edge)
    );

endmodule

三、组合逻辑实现

仿真波形如下图所示。

3.1 rtl

复制代码
module edge_dect(
input  wire  clk,
input  wire  rst_n,
input  wire  data,

output wire   pos_edge,
output wire   neg_edge
    );

reg  data_reg1;
reg  data_reg2;
reg  data_reg3;

always @(posedge clk or negedge rst_n)
begin
    if(!rst_n)
        begin
            data_reg1 <= 0;
            data_reg2 <= 0;
            data_reg3 <= 0;
        end
    else
        begin
            data_reg1 <= data;
            data_reg2 <= data_reg1;
            data_reg3 <= data_reg2;
        end
end

assign pos_edge = data_reg2 && (~data_reg3);
assign neg_edge = ~data_reg2 && data_reg3;
//always @(posedge clk or negedge rst_n)
//begin
//    if(rst_n == 1'b0)
//       pos_edge <= 1'b0;
//    else if(data_reg2 && (~data_reg3)) 
//       pos_edge <= 1'b1;
//   else 
//       pos_edge <= 1'b0;
//end


//always @(posedge clk or negedge rst_n)
//begin
//    if(rst_n == 1'b0)
//       neg_edge <= 1'b0;
//    else if((~data_reg2) && data_reg3) 
//       neg_edge <= 1'b1;
//   else 
//       neg_edge <= 1'b0;
//end

endmodule

3.2 tb

tb文件与时序逻辑实现的tb文件一样。

相关推荐
小柯博客35 分钟前
从零开始打造 OpenSTLinux 6.6 Yocto 系统 - STM32MP2(基于STM32CubeMX)(六)
c语言·git·stm32·单片机·嵌入式硬件·开源·yocto
意法半导体STM3237 分钟前
【官方原创】防止STM32CubeMX删除用户文件的方法 LAT1442
stm32·单片机·嵌入式硬件·stm32cubemx·stm32开发·stm32生态
unicrom_深圳市由你创科技1 小时前
基于ARM+DSP+FPGA异构计算架构的高速ADC采集卡定制方案
arm开发·fpga开发
lingzhilab1 小时前
零知IDE——STM32旋转编码器计数系统:原理可视化 + 精准计数实现
stm32·单片机·嵌入式硬件
LS_learner1 小时前
ROS (Robot Operating System) 一个灵活的机器人软件框架及其适用平台
嵌入式硬件
chengpei1472 小时前
Ender-3S加装3DTouch实现自动网床校准
单片机·嵌入式硬件·3d打印
松涛和鸣2 小时前
DAY69 Practical Guide to Linux Character Device Drivers
linux·服务器·arm开发·数据库·单片机·嵌入式硬件
bai5459362 小时前
STM32 CubeIDE 超声波测距
stm32·单片机·嵌入式硬件
robet_hua2 小时前
DSP28377D项目实战 (4) - 高速串口打印波形
单片机·嵌入式硬件
北京青翼科技2 小时前
高速采集卡丨AD 采集丨 多通道数据采集卡丨高速数据采集系统丨青翼科技FMC 子卡
图像处理·人工智能·fpga开发·信号处理·智能硬件