• FPGA_边沿检测电路设计


    边沿检测原理图

    状态转移表可以看出,其转换条件中需要检测到下降沿以及上升沿,而边沿检测其原理就是利用寄存器在时钟信号的控制下,输入状态即为下一时刻输出状态这一特性进行比较判断,如下图所示。
    在这里插入图片描述
    其检测过程,可以假设 data_in 从 0 变 1,也就是上升沿:

    1. 第一个时钟到来,第一个寄存器 regA_data 的输出为 0;
    2. 第二个时钟沿到来后第一个寄存器输出为 1,第二个寄存器输出此时为0,这样对两个寄存器输出进行相关组合逻辑运算则可检测出上升沿;
    3. 同理 data_in 从 1 变为 0,也就是下降沿:
    4. 第一个时钟到来,第一个寄存器 regA_data 的输出为 1;
    5. 第二个时钟沿到来后第一个寄存器输出为 0,第二个寄存器输出此时为1。

    本部分逻辑设计如下,这样就实现了当有上升沿时信号 pedge 就会产生一个时钟周期的高电平,当有下降沿时信号 nedge 也会产生一个时钟周期的高电平,没有上升沿或者下降沿变化时 pedge 以及 nedge 保持低电平状态。这里使用的“!”是逻辑非运算,对 4’b0110 逻辑非运算后是 4’b0000;而“~”是按位取反,对 4’b0110按位取反后是 4’b1001。

    reg key_tmpa,key_tmpb;
     wire pedge,nedge;
     always@(posedge Clk or negedge Rst_n)
     if(!Rst_n)begin
     key_tmpa <= 1'b0;
     key_tmpb <= 1'b0;
     end
     else begin
     key_tmpa <= key_in_sb;
     key_tmpb <= key_tmpa; 
     end
     assign nedge = !key_tmpa & key_tmpb;
     assign pedge = key_tmpa & (!key_tmpb);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    波形图分析

    我们该如何准确找到这个下降沿呢?这就引入了另一个新的知识——边沿检测。边沿检测主要作用是能够准确的识别出单比特信号的上升沿或下降沿,也就是我们希望当上升沿或下降沿来到时,能够产生一个唯一标识上升沿或下降沿的脉冲信号来告诉我们上升沿或下降沿来了,我们就可以根据这个脉冲信号作为后续电路功能的启动。如下图所示,我们对同一信号打一拍后在①位置处就可以检测到上升沿,使之拉高一个时钟的脉冲;在②位置处可以检测到下降沿,使之拉高一个时钟的脉冲。要实现这个功能,我们该如何编写代码呢?

    在这里插入图片描述
    上升沿检测核心代码:在①处检测到 data 为高电平且 data_reg 为低电平时,表示有上升沿产生。

    实现方法

    方法一:与逻辑实现

    always@(posedge sys_clk or negedge sys_rst_n)
     if(sys_rst_n == 1'b0)
     podge <= 1'b0;
     else if((data) && (~data_reg)) //核心逻辑
     podge <= 1'b1;
     else 
     podge <= 1'b0;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    方法二:或逻辑实现

    01 always@(posedge sys_clk or negedge sys_rst_n)
    02 if(sys_rst_n == 1'b0)
    03 podge <= 1'b0;
    04 else if((~data) || (data_reg)) //核心逻辑
    05 podge <= 1'b0;
    06 else 
    07 podge <= 1'b1;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    下降沿检测核心代码:在②处检测到 data 为低电平且 data_reg 为高电平时,表示有下
    降沿产生,和上升沿的情况刚好相反。

    方法三:与逻辑实现

    01 always@(posedge sys_clk or negedge sys_rst_n)
    02 if(sys_rst_n == 1'b0)
    03 nedge <= 1'b0;
    04 else if((~data) && (data_reg)) //核心逻辑
    05 nedge <= 1'b1;
    06 else 
    07 nedge <= 1'b0;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    方法二:或逻辑实现

    always@(posedge sys_clk or negedge sys_rst_n)
    02 if(sys_rst_n == 1'b0)
    03 nedge <= 1'b0;
    04 else if((data) || (~data_reg)) //核心逻辑
    05 nedge <= 1'b0;
    06 else 
    07 nedge <= 1'b1;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    注:上面的例子是用时序逻辑实现的,和上图所示波形完全一致。其核心逻辑也可以结合三目运算符用组合逻辑 assign 来实现,会使 podge 和 nedge 检测到上升沿和下降沿的脉冲均会提前一拍。希望大家能够记住边沿检测的核心逻辑以方便使用,当看到类似的代码也可以反推出检测的是上升沿还是下降沿。

  • 相关阅读:
    在HBuilderX的git上导入github项目/把项目传到github
    IOS开发之免费证书+不越狱真机调试
    【英语:基础进阶_原著扩展阅读】J1.英文原著的选择和有效阅读方法
    比 O(nlog(n)) 做得更好 — 5.结束语和基准
    常见锁的分类
    浅谈Linux系统信息与资源
    关于离子色谱仪的结构和应用原理分析
    webpack构建vue项目 基础09之生产环境 打包为zip文件 与 public静态文件的copy
    @PreDestroy注解
    大数据技术之Hadoop:Yarn集群部署(七)
  • 原文地址:https://blog.csdn.net/weixin_41226265/article/details/133997554