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文件一样。

相关推荐
嵌入式老牛8 小时前
HC32F460_ADC驱动(三)
单片机·嵌入式硬件
秀秀更健康9 小时前
stm32: 系统时钟如何配置为72Mhz
stm32·单片机·嵌入式硬件
QAQ小菜鸟12 小时前
一、安装Altium Designer 26.1
嵌入式硬件
嵌入式-老费13 小时前
esp32开发与应用(用面包板去学模块)
嵌入式硬件
归零鸟14 小时前
WD Elements移动硬盘能识别出盘但不能出盘的修复记录
stm32·单片机·嵌入式硬件
追兮兮15 小时前
MCUQuickStart v1.1.0发布,一键生成Keil工程+RTOS模板
stm32·单片机·嵌入式硬件·freertos·gd32·keil5
国科安芯15 小时前
ASP7A84AS与主流架构兼容替代及系统级电源完整性解决方案的深度研究
单片机·嵌入式硬件·架构
kaikaile199515 小时前
STC8单片机实现简单花样DMX512控制器
单片机·嵌入式硬件
szxinmai主板定制专家15 小时前
RK3568 + CODESYS+实时系统运动控制器PLC,支持 AI 视觉目标检测,预测性维护,混合多系统部署,多路模拟量采集
arm开发·人工智能·嵌入式硬件·fpga开发
rit843249915 小时前
STM32移植NES模拟器指南
stm32·单片机·嵌入式硬件