FPGA_边沿检测电路设计

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。

c 复制代码
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);

波形图分析

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

上升沿检测核心代码:在①处检测到 data 为高电平且 data_reg 为低电平时,表示有上升沿产生。

实现方法

方法一:与逻辑实现

c 复制代码
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;

方法二:或逻辑实现

c 复制代码
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;

下降沿检测核心代码:在②处检测到 data 为低电平且 data_reg 为高电平时,表示有下

降沿产生,和上升沿的情况刚好相反。

方法三:与逻辑实现

c 复制代码
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;

方法二:或逻辑实现

c 复制代码
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;

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

相关推荐
风_峰2 天前
Ubuntu Linux SD卡分区操作
嵌入式硬件·ubuntu·fpga开发
FPGA_Linuxer2 天前
FPGA 40 DAC线缆和光模块带光纤实现40G UDP差异
网络协议·fpga开发·udp
风_峰2 天前
Petalinux相关配置——ZYNQ通过eMMC启动
嵌入式硬件·ubuntu·fpga开发
风_峰2 天前
【ZYNQ开发篇】Petalinux和电脑端的静态ip地址配置
网络·嵌入式硬件·tcp/ip·ubuntu·fpga开发
碎碎思3 天前
一块板子,玩转 HDMI、USB、FPGA ——聊聊开源项目 HDMI2USB-Numato-Opsis
fpga开发
ooo-p3 天前
FPGA学习篇——Verilog学习Led灯的实现
学习·fpga开发
嵌入式-老费3 天前
Zynq开发实践(FPGA之选择开发板)
fpga开发
风_峰3 天前
PuTTY软件访问ZYNQ板卡的Linux系统
linux·服务器·嵌入式硬件·fpga开发
电子凉冰3 天前
FPGA入门-状态机
fpga开发
Aczone283 天前
硬件(十)IMX6ULL 中断与时钟配置
arm开发·单片机·嵌入式硬件·fpga开发