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

相关推荐
风已经起了6 小时前
FPGA学习笔记——IIC协议简介
笔记·学习·fpga开发
逐梦之程15 小时前
FPGA-Vivado2017.4-建立AXI4用于单片机与FPGA之间数据互通
fpga开发
XINVRY-FPGA1 天前
10CL016YF484C8G Altera FPGA Cyclone
嵌入式硬件·网络协议·fpga开发·云计算·硬件工程·信息与通信·fpga
嵌入式-老费1 天前
产品开发实践(常见的软硬结合方式)
fpga开发
FakeOccupational2 天前
【电路笔记 通信】AXI4-Lite协议 FPGA实现 & Valid-Ready Handshake 握手协议
笔记·fpga开发
I'm a winner2 天前
FPGA+护理:跨学科发展的探索(五)
fpga开发
Turing_kun2 天前
基于FPGA的实时图像处理系统(1)——SDRAM回环测试
fpga开发
I'm a winner3 天前
新手入门Makefile:FPGA项目实战教程(二)
笔记·fpga开发
我爱C编程3 天前
基于FPGA的8PSK+卷积编码Viterbi译码通信系统,包含帧同步,信道,误码统计,可设置SNR
fpga开发·通信·8psk·帧同步·snr·卷积编码·维特比译码
I'm a winner4 天前
新手入门 Makefile:FPGA 项目实战教程(三)
fpga开发