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 检测到上升沿和下降沿的脉冲均会提前一拍。希望大家能够记住边沿检测的核心逻辑以方便使用,当看到类似的代码也可以反推出检测的是上升沿还是下降沿。

相关推荐
hahaha601612 小时前
HLS高层次综合设计技巧--数组
开发语言·嵌入式硬件·算法·fpga开发
NamoAmitabha12813 小时前
直接上手 UVM 例子
fpga开发
cmc102817 小时前
301.modelsim自动仿真
fpga开发
Riwuarua1 天前
从近似0基础开始FPGA开发 -- part.10 verilog-ethernet开源UDP协议栈工程学习
fpga开发·udp·开源
my_daling2 天前
紫光FPGA远程升级注意事项(关于GTP_CFGCLK原语使用问题)
笔记·学习·fpga开发
Riwuarua2 天前
从近似0基础开始FPGA开发 -- part.11 AXI总线协议与工程应用
fpga开发
自小吃多2 天前
高云 FPGA 添加时序约束笔记
笔记·fpga开发
学习FPGA的电气小兴兴3 天前
基于FPGA的CORDIC旋转模式实现sin和cos运算
fpga开发·信号处理·数字信号处理·verilog·fpga·verilog hdl·cordic
blue_ice .3 天前
DDS原理及简易实现
开发语言·经验分享·笔记·嵌入式硬件·fpga开发
明德扬3 天前
AD9653采集模块怎样连接FPGA底板?从ADC采样到数据处理
学习·fpga开发·fpga