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

相关推荐
wenchm15 小时前
细说STM32H743XIH6单片机通过FMC访问片外NAND Flash的方法及实例
stm32·单片机·嵌入式硬件
三佛科技-1341638421216 小时前
KP32511SGA固定12V输出小家电电源芯片 典型应用电路
单片机·嵌入式硬件
xingzhemengyou117 小时前
STM32启动流程
stm32·单片机·嵌入式硬件
1750633194517 小时前
Vivado Zynq7020 生成正弦波(查表法) + 行为级仿真
fpga开发
Terasic友晶科技17 小时前
4-DE10-Nano的HDMI方块移动案例——I2C通信协议
fpga开发·i2c·hdmi·de10-nano·i2c通信协议
youcans_17 小时前
【动手学STM32G4】(4)STM32G431之ADC与DAC
stm32·单片机·嵌入式硬件·数据采集·串口通信
boneStudent20 小时前
Day32:SPI 配置与使用
stm32·单片机·嵌入式硬件
逆小舟21 小时前
【RTOS】处理中断
单片机·嵌入式硬件
ACP广源盛139246256731 天前
GSV1015@ACP#1015/2015产品规格详解及产品应用分享
单片机·嵌入式硬件·音视频
三品吉他手会点灯1 天前
STM32F103学习笔记-19-SysTick-系统定时器(第1节)-功能框图讲解和优先级配置
笔记·stm32·单片机·嵌入式硬件·学习