[转]FPGA的边沿检测

以前我曾一度傻乎乎的使用

always @ (posedge signal)

这样的代码去检测signal的上升沿,闹出了很多问题。

当受实验室的一同学指教后,再也不会傻乎乎的这样干了。当然,你看完下文也不会这样干了。

检测上升沿的原理:使用高频的时钟对信号进行采样,因此要实现上升沿检测,时钟频率至少要在信号最高频率的2倍以上,否则就可能出现漏检测。具体请参见下面代码。

module edge_check(clk, rst_n, signal, pos_edge, neg_edge, both_edge);

input clk;
input rst_n;
input signal;
output pos_edge;
output neg_edge;
output both_edge;

reg sig_r0, sig_r1;  // 状态寄存器
always @ (posedge clk or negedge rst_n)
    if (!rst_n) begin
        sig_r0 <= 1‘b0;
        sig_r1 <= 1‘b0;
    end else begin
        sig_r0 <= signal;
        sig_r1 <= sig_r0;
    end 

assign pos_edge = (~sig_r1) & (sig_r0);
assign neg_edge = sig_r1 & (~sig_r0);
assign both_edge = sig_r1 ^ sig_r0;  // 双边沿检测,或pos_edge|neg_edge

endmodule

用Quartus II综合布线之后的RTL视图如下:

从RTL视图中可以看出,电路是通过一个异步复位的D触发器实现的。

ModelSim的仿真视图如下,从中可看出已检测出上升和下降沿,但存在一个延时,这是因为使用了时钟同步的检测。

或者上面的Verilog代码还可以换一种写法,效率上差不了太多;

module edge_check(clk, rst_n, signal, pos_edge, neg_edge, both_edge);

input clk;
input rst_n;
input signal;
output pos_edge;
output neg_edge;
output both_edge;

reg [1:0]sig_fifo;
reg sig_r0, sig_r1;  // 状态寄存器
always @ (posedge clk or negedge rst_n)
    if (!rst_n) begin
        sig_fifo <= 2‘b0;
    end else begin
        sig_fifo <= {sig_fifo[0], signal};
    end 

assign pos_edge = (sig_fifo == 2‘b01);
assign neg_edge = (sig_fifo == 2‘b10);
assign both_edge = sig_fifo[0] ^ sig_fifo[1];  // 双边沿检测,或pos_edge|neg_edge

endmodule

生成的RTL视图为

时间: 2024-10-12 02:15:02

[转]FPGA的边沿检测的相关文章

FPGA基础入门篇(四) 边沿检测电路

FPGA基础入门篇(四)--边沿检测电路 一.边沿检测 边沿检测,就是检测输入信号,或者FPGA内部逻辑信号的跳变,即上升沿或者下降沿的检测.在检测到所需要的边沿后产生一个高电平的脉冲.这在FPGA电路设计中相当的广泛. 没有复位的情况下,正常的工作流程如下: (1)D触发器经过时钟clk的触发,输出trigger信号,保存了t0时刻的信号. (2)同时由trigger通过非门输出信号,保留了当前时刻t1的触发信号 (3)经过与门输出信号pos_edge,neg_edge a) 只有t0时刻为高

FPGA学习笔记之格雷码、边沿检测、门控时钟

一.格雷码 格雷码的优点主要是进位时只有一位跳变,误码率低. 1.二进制转格雷码 我们观察下表: 二进制码 格雷码 00 00 01 01 10 11 11 10 二进制码表示为B[],格雷码表示为G[],则有 G(i) = B(i),i为最高位 G(i-1) = B(i) xor B(i-1),i非最高位 用verilog可以这样写 1 reg [WIDTH-1:0] bin; 2 reg [WIDTH-1:0] gray; 3 parameter WIDTH = 8; 4 always @(

GTA5自动驾驶二 边沿检测

边沿检测采用Candy算法,比较经典,opencv自带 Candy算法的原理可以参见这篇博文:http://www.tuicool.com/articles/Y3q2Mf 整个流程是这样的: 读取图像 将图像转化为灰度图像 运行高斯滤波 运行Candy算子得到边沿 示例代码如下: #! usr/bin/python #coding=utf-8 #doing all the relevant imports import matplotlib.pyplot as plt import matplo

verilog 之数字电路 边沿检测电路

由代码可知:此边沿检测电路是由两个触发器级联而成,sign_c_r 输出是sign_c_r2的输入.并且有异步复位端没有使能端.最后输出:由触发器的输出取反和直接输出相与.如下的RTL图.

从多级延迟触发器到边沿检测

一.多级延迟触发器(或延迟触发器链) (1)多级延迟触发器电路 多级延迟触发器,顾明思议就是多个触发器串在一起,对信号进行打拍,一个触发器就延时了一拍,也就是延迟了一个时钟周期. 多级触发器的代码如下所示:  1 module DFF_N #(parameter N=3)(  2   input clk,  3   input reset,  4   input [N-1:0] D,  5   output reg [N-1:0] Q  6 );  7 reg [N-1:0]d0;  8 reg

边沿检测电路设计verilog

Abstract 边沿检测电路(edge detection circuit)是个常用的基本电路. Introduction 所谓边沿检测就是对前一个clock状态和目前clock状态的比较,如果是由0变为1,能够检测到上升沿,则称为上升沿检测电路(posedge edge detection circuit),若是由1变为0,能够检测到下降沿,则被称为下降沿检测电路(negedge edge dttection circuit),能够同时检测上升沿与下降沿的电路称为双沿检测电路(double

从延迟触发器链到边沿检测

本文记录一下关于延迟触发器链与它的常用用法(即边沿检测.多级延迟的触发器应该是比较常用的,当我们需要对信号信号进行延时,这个时候我们就用到了延迟触发器链.下面就来记录一下吧. 一.多级延迟触发器(或延迟触发器链) (1)多级延迟触发器电路 多级延迟触发器,顾明思议就是多个触发器串在一起,对信号进行打拍,一个触发器就延时了一拍,也就是延迟了一个时钟周期. 多级触发器的代码如下所示: 1 module DFF_N #(parameter N=3)( 2 input clk, 3 input rese

触发器链的应用——同步器与边沿检测电路

主要内容 多级延迟触发器电路 同步器 边沿检测电路 与移位寄存器的区别 1.多级延迟触发器电路 定义:是多个触发器串联组合,每进行一次传输,数据就延迟一个周期.可以通过增加触发器的数量来决定延时的拍数. module DFF_N #(parameter N=3)( input clk, input reset, input [N-1:0] D, output reg [N-1:0] Q ); reg [N-1:0] d0; reg [N-1:0] d1; always @(posedge clk

fpga过零检测算法

过零检测法也就是比较器的作用,可以将一定频率的正弦波转换为方波或脉冲波.这在测频率等地方是必要的,因为fpga只认沿,而不认识正弦波. 算法分为两部分,零点的确定和脉冲波的产生. 为什么需要确定零点.我们知道,一般的ad是比如0~5V转为0~255之类的,或者可以-2~2V输入,内部会有转化的电路.所以一般的零点不会是0,而更可能是125或者126.不过为了更加精确,真正的零点应该是(max+min)/2.采集最大值和最小值的程序很常见,就是来一个暂存器不断更新,一段时间后把值赋给max或min