FPGA-信号边缘检测
在FPGA逻辑电路中,输入信号的边缘检测是一个常用的操作,这算是FPGA的基本功之一。
信号边缘检测应用十分广泛,例如:通信协议的时序操作,按键的检测等,都应用到按键的检测。按键的检测分为上升沿和下降沿两种,基本的检测思想是一致的。本博客的思想是先介绍阻塞和非阻塞两种赋值,在理解这个的基础上然后去分析边缘检测。这里,首先分析一下Verilog语言中阻塞赋值(=)和非阻塞赋值(<=)的区别,给出相应的案例来帮助理解:
module prj1(in,b,c,d,clk,rst_n); input in;
input clk;
input rst_n;
output b,c,d;
reg b,c,d; always @(posedge clk or negedge rst_n) begin
if(!rst_n) begin
b <=;
c <=;
d <=;
end
else begin
b <=in;
c <=b;
d <=c;
end
end
endmodule
这个目的是为了展示非阻塞赋值过程中的时序变化,对应的RTL电路图和仿真波形如下图:
从仿真图可以看书,b,c,d是在每个时钟后依次传递的,如果采用阻塞赋值,如果in改变,那么b,c,d立刻改变,这个就在这里不给出仿真。
阻塞赋值和非阻塞赋值的另外一个区别在于综合的时候,如果输出只有d,bc作为中间变量,阻塞赋值在综合的过程中会自动省略掉中间过程。给出如下仿真,理解更为清楚
module prj1(in,b,c,clk,rst_n); input in;
input clk;
input rst_n;
output b,c;
reg b,c, e,f, m,n;
/* <= */
always @(posedge clk or negedge rst_n) begin
if(!rst_n) b <=;
else begin
e <=in;
f <=e;
b <=f;
end
end
/* = */
always @(posedge clk or negedge rst_n) begin
if(!rst_n) c=;
else begin
m = in;
n = m;
c = n;
end
end
endmodule
综合后结果如图,可以看出,采用阻塞赋值,综合后的逻辑单元只有一个,中间变量m,n直接省去了。
信号边缘检测:
回归主题,现在谈谈边缘检测思想。我们姑且这么叫:b<=in; status<=b 称为 in到status的一次延迟赋值(延迟时间为一个时钟),in到status的n次延迟就以此类推。
输入 in: 1 1 1 1 1 0 0 0 0 0 0 0 1 1 1
一次延迟 delay1: x 1 1 1 1 1 0 0 0 0 0 0 0 1 1 1
输入取反 ~in: 0 0 0 0 0 1 1 1 1 1 1 1 0 0 0
一次延迟取反 ~delay1:x 0 0 0 0 0 1 1 1 1 1 1 1 0 0 0
上升沿检测:(~delay1)&in --in bit13
下降沿检测:(~in)&delay1 --in bit6
说明:针对边缘毛刺多的地方,比如按键的消除抖动,这里面的延迟需要设定够大(比较好的按键消抖时间20ms左右),通过对时钟的分频进行一次延迟赋值,这样子就能够消除延迟中的抖动,并且能够很好的检测出来按键的边缘。
给出一个简单的边缘检测程序:
module prj1(clk,rst_n,in,pos_edge,neg_edge); input clk,rst_n,in;
output pos_edge,neg_edge; reg delay1;
reg pos_edge,neg_edge; always @(posedge clk or negedge rst_n) begin
if(!rst_n) begin
delay1<=;
pos_edge<=;
neg_edge<=;
end
else begin
delay1<=in;
pos_edge <=(~delay1)∈
neg_edge <=(~in)&delay1;
end
end endmodule
仿真结果如图:
FPGA-信号边缘检测的更多相关文章
- FPGA中的时序分析(一)
谈及此部分,多多少少有一定的难度,笔者写下这篇文章,差不多是在学习FPGA一年之后的成果,尽管当时也是看过类似的文章,但是都没有引起笔者注意,笔者现在再对此知识进行梳理,也发现了有很多不少的收获.笔者 ...
- 【黑金原创教程】【TimeQuest】【第五章】网表质量与外部模型
声明:本文为黑金动力社区(http://www.heijin.org)原创教程,如需转载请注明出处,谢谢! 黑金动力社区2013年原创教程连载计划: http://www.cnblogs.com/al ...
- STM32之中断
在STM32(Cortex-M3)中没有显示的代码拷贝,只有启动代码进行了向量的初始化,一直以为是编译器在程序影像中自己完成了相关向量的拷贝,即,拷贝到固定的NVIC区,事实上并不是这样,cortex ...
- TIMEQUEST学习之黑金动力(四)
现在知道时序约束主要是FPGA to ic,或者ic to FPGA. 上图可以表示FPGA to IC, IC to FPGA. fpga2ic:fpga2ext 是 fpga 致 ic 信号的走线 ...
- 使用ChipScope Pro调试硬件
chipscope_icon提供与其他ChipScope内核的通信 chipscope_opb_iba促进传统片上外设总线(OPB)事务的监控 chipscope_plb_iba便于监控处理器本地总线 ...
- 基于FPGA的Sobel边缘检测的实现
前面我们实现了使用PC端上位机串口发送图像数据到VGA显示,通过MATLAB处理的图像数据直接是灰度图像,后面我们在此基础上修改,从而实现,基于FPGA的动态图片的Sobel边缘检测.中值滤波.Can ...
- 基于 FPGA 的图像边缘检测
本文主要内容是实现图像的边缘检测功能 目录 mif文件的制作 调用 ip 核生成rom以及在 questasim 仿真注意问题 灰度处理 均值滤波:重点是3*3 像素阵列的生成 sobel边缘检测 图 ...
- 【转】基于FPGA的Sobel边缘检测的实现
前面我们实现了使用PC端上位机串口发送图像数据到VGA显示,通过MATLAB处理的图像数据直接是灰度图像,后面我们在此基础上修改,从而实现,基于FPGA的动态图片的Sobel边缘检测.中值滤波.Can ...
- 关于 FPGA 内部信号扇入扇出
扇入.扇出系数 扇入系数是指门电路允许的输入端数目.一般门电路的扇入系数为1—5,最多不超过8.扇出系数是指一个门的输出端所驱动同类型门的个数,或称负载能力.一般门电路的扇出系数为8,驱动器的扇出系数 ...
随机推荐
- jstl标签: c:Foreach详解
为循环控制,它可以将集合(Collection)中的成员循序浏览一遍.运作方式为当条件符合时,就会持续重复执行的本体内容. 为循环控制,它可以将集合(Collection)中的成员循序浏览一遍.运作方 ...
- NIO与IO的区别
nio是new io的简称,从jdk1.4就被引入了.现在的jdk已经到了1.6了,可以说不是什么新东西了.但其中的一些思想值得我来研究.这两天,我研究了下其中的套接字部分,有一些心得,在此分享. ...
- JNI 接口规范
1. 简介 Java 本地接口概述 背景 JDK 1.0 本地方法接口 Java 运行时接口 原始本地接口和 Java/COM 接口 目标 Java 本地接口方法 利用 JNI 编程 JDK 1.1. ...
- 架构-MVVM:MVVM核心概念
ylbtech-架构-MVVM:MVVM核心概念 1.返回顶部 1. MVVM模式是Model.View.ViewModel的简称,最早出现在WPF,现在Silverlight中也使用该模式,MVVM ...
- 枚举与#define 宏的区别
1),#define 宏常量是在预编译阶段进行简单替换.枚举常量则是在编译的时候确定其值.2),一般在编译器里,可以调试枚举常量,但是不能调试宏常量.3),枚举可以一次定义大量相关的常量,而#defi ...
- 704. Binary Search
Given a sorted (in ascending order) integer array nums of n elements and a target value, write a fun ...
- hdoj1528【二分匹配】
题意: 在一幅扑克牌里,有两个人在比大小,第二个人最多能赢第一个人几张牌. 思路: 这道题目用一下二分匹配还是很明显的. 那么就是建图似乎要麻烦一下,但还是很方便的.将扑克牌一次进行编号,然后牌面比他 ...
- Android中R.java丢失不见的解决方案
最近在做android项目时,遇到报错情况,于是clean了一下,结果java类全都报错了,里面的R下有红线,我一找,发现R.java不见了,真是奇怪,如下图(这是解决以后的): 然后查看了一下Con ...
- NOIp 2015信息传递【tarjan/拓扑/并查集】
一道好的NOIp题目,在赛场上总能用许多算法A掉.比如这道和关押罪犯. 题目传送门 法一:tarjan在有向图中跑最小环 有人从别人口中得知自己信息,等效于出现了一个环.于是 这就变成了一个有向图ta ...
- jQuery笔记之工具方法
jQuery 工具方法 $.type()判断数据类型 $.isArray() $.isFunction() $.isWindow()... $.trim()消除空格 $.proxy()改变this指向 ...