0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

基于fpga的图像处理

CHANBAEK 来源:小小研究生 作者:xxyjs2020 2023-06-23 16:53 次阅读

设计规划

开发板上使用的机械按键在闭合及断开的瞬间均伴随有一连串的抖动,按键抖动会引起一次按键被误读多次,需要进行消抖处理:在按键闭合稳定时读取按键的状态,并且必须判别到按键释放稳定后再作处理 。

如果按键个数少,可以用硬件消抖,按键多时需要用软件消抖:检测出按键闭合后执行一个 20ms的延时程序 (抖动的时间为5ms~10ms)再一次检测键的状态,如果仍保持闭合状态电平,则确认为真正有键按下。硬件消抖需要有额外的电路,软件消抖没有这种顾虑。

先用波形图模拟出按键被按下和释放时抖动的毛刺状态:

图片

计数器一节中已经介绍过计数的实现方法,这里20ms的延迟需要一个20ms的计数器cnt_20ms。系统检测到按键输入为低电平就开始计数,如果20ms(50MHz的晶振需要计数个数为999_999)内检测出高电平说明是一个抖动,计数器清零。计数器计满999_999之后,key_flag拉高,一个时钟周期后变低,因此key_flag是脉冲信号。计数器计满后的状态至关重要,如果清零,当输入是低电平的时间过长就会造成一次按键却有多个key_flag脉冲的情况。

图片

如果计满后不清零,到kin_in为高电平时再清零也会有新的问题,就是key_flag维持高电平时间太长,不再是一个脉冲信号。

图片

此时如果令计数器记到999_998,就可以达到预期的效果。

图片

编写代码

module key_filter
#(
parameter CNT_MAX = 20'd999_999 
)
(
input wire sys_clk ,
input wire sys_rst_n , 
input wire key_in , 
output reg key_flag //key_flag为1时表示消抖后检测到按键被按下
//key_flag为0时表示没有检测到按键被按下
);


//reg define
reg [19:0] cnt_20ms ; //计数器


//cnt_20ms:如果时钟的上升沿检测到外部按键输入的值为低电平时,计数器开始计数
always@(posedge sys_clk or negedge sys_rst_n)
if(sys_rst_n == 1'b0)
cnt_20ms <= 20'b0;
else if(key_in == 1'b1)
cnt_20ms <= 20'b0;
else if(cnt_20ms == CNT_MAX && key_in == 1'b0)
cnt_20ms <= cnt_20ms;
else
cnt_20ms <= cnt_20ms + 1'b1;


always@(posedge sys_clk or negedge sys_rst_n)
if(sys_rst_n == 1'b0)
key_flag <= 1'b0;
else if(cnt_20ms == CNT_MAX - 1'b1)
key_flag <= 1'b1;
else
key_flag <= 1'b0;
endmodule

首先定义了参数CNT_MAX是计数器的最大值,然后定义了输入输出和计数器。2^19<999999<2^20,因此需要20位的计数器。然后,还是要分析两个信号的变化,一个是计数器的状态,一个是标志位的状态。他们变化的条件都是时钟上升沿和复位有效(下降沿)。

cnt_20ms的变化是,如果复位有效就清零;如果检测到输入为高电平就清零;如果计满且输入为低电平就保持;如果没计满就+1。

图片

key_flag的变化是,复位有效就清零,计数到999999-1就拉高,其他时候都为0。

图片

编写testbench

`timescale 1ns/1ns
module tb_key_filter();
 parameter CNT_1MS = 20'd19 ,
 CNT_11MS = 21'd69 ,
 CNT_41MS = 22'd149 ,
 CNT_51MS = 22'd199 ,
 CNT_60MS = 22'd249 ;


 wire key_flag ; 
 reg sys_clk ; 
 reg sys_rst_n ; 
 reg key_in ; 
 reg [21:0] tb_cnt ; 


 initial begin
 sys_clk = 1'b1;
 sys_rst_n <= 1'b0;
 key_in <= 1'b0;
 #20
 sys_rst_n <= 1'b1;
 end


 //sys_clk:模拟系统时钟,每10ns电平翻转一次,周期为20ns,频率为50MHz
 always #10 sys_clk = ~sys_clk;


 //tb_cnt:按键过程计数器,通过该计数器的计数时间来模拟按键的抖动过程
 always@(posedge sys_clk or negedge sys_rst_n)
 if(sys_rst_n == 1'b0)
 tb_cnt <= 22'b0;
 else if(tb_cnt == CNT_60MS)
 tb_cnt <= 22'b0;
 else
 tb_cnt <= tb_cnt + 1'b1;


 //key_in:产生输入随机数,模拟按键的输入情况
 always@(posedge sys_clk or negedge sys_rst_n)
 if(sys_rst_n == 1'b0)
 key_in <= 1'b1; //按键未按下时的状态为为高电平
 else if((tb_cnt >= CNT_1MS && tb_cnt <= CNT_11MS)
||(tb_cnt >= CNT_41MS && tb_cnt <= CNT_51MS))
 key_in <= {$random} % 2;  //随机数模拟抖动
 else if(tb_cnt >= CNT_11MS && tb_cnt <= CNT_41MS)
 key_in <= 1'b0;
 else
 key_in <= 1'b1;


 //------------------------key_filter_inst------------------------
 key_filter
 #(
 .CNT_MAX (20'd24 )
 )
 key_filter_inst
 (
 .sys_clk (sys_clk ), //input sys_clk
 .sys_rst_n (sys_rst_n ), //input sys_rst_n
 .key_in (key_in ), //input key_in
 .key_flag (key_flag ) //output key_flag
 );


 endmodule

1、定义参数,这里和上一节一样,为了缩短仿真时间,将参数值设置得小一些。

2、定义几个信号:时钟、复位、输入、计数、输出

3、初始化:时钟信号为高,复位为低,输入为低,延迟20ns后,复位为高

4、定义时钟:每10ns翻转一次,周期为20ns,频率为50MHz

5、定义计数器:计数器计数到CNT_60MS,计数0-249。复位变为0,计满变为0.否则+1。

6、定义输入:输入在前后10ms内抖动,因此输入数在CNT_1MS-11MS和41MS-51MS内取0或1的随机数来模拟抖动。在11MS-41MS内为低电平,持续时间要超过CNT-MAX(80>24)。0MS-1MS和41MS以上都为高电平。

7、实例化:这里定义了CNT_MAX,要小于11MS-41MS,否则会一直抖动。

对比波形

整体波形图,达到了预期效果:key_in低电平开始计数到CNT_MAX-1时一旦检测到输入高电平就清零,但是没有检测到输入信号为高电平,那么key_flag拉高成为一个脉冲信号。

图片

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • FPGA
    +关注

    关注

    1628

    文章

    21722

    浏览量

    602879
  • 计数器
    +关注

    关注

    32

    文章

    2255

    浏览量

    94469
  • 时钟
    +关注

    关注

    10

    文章

    1732

    浏览量

    131437
  • 开发板
    +关注

    关注

    25

    文章

    5025

    浏览量

    97355
  • 按键消抖
    +关注

    关注

    2

    文章

    27

    浏览量

    10448
收藏 人收藏

    评论

    相关推荐

    FPGA图像处理之CLAHE算法

    FPGA图像处理--CLAHE算法(一)中介绍了为啥要用CLAHE算法来做图像增强。
    的头像 发表于 01-04 12:23 2477次阅读
    <b class='flag-5'>FPGA</b><b class='flag-5'>图像</b><b class='flag-5'>处理</b>之CLAHE算法

    #FPGA #图像处理 图像处理(概论)

    fpga图像处理
    奔跑的小鑫
    发布于 :2023年07月27日 10:15:04

    FPGA图像处理初学者的迷茫

    哪位大神现在在从事基于FPGA图像处理的相关工作,我现在在学习,导师给选的方向,自己前一段时间用FPGA实现了中值滤波,sobel边缘检测,然后就是一些书本上面简单算法的实现 ,感觉高
    发表于 06-29 20:38

    FPGA图像处理论文大全

    本帖最后由 lorlin000 于 2015-3-15 22:53 编辑 FPGA图像处理论文大全
    发表于 03-15 22:46

    FPGA图像处理IP核

    有谁知道现在国内外有哪些公司卖FPGA图像处理相关的IP核?
    发表于 04-28 21:34

    FPGA图像处理技术,你知道多少?

    最近一段时间一直在研究基于FPGA图像处理,乘着这个机会和大家交流一下,自己也顺便总结一下。主要是为了大家对用FPGA图像
    发表于 04-21 14:25

    FPGA图像处理必备!

    图像细节。FPGA 图像处理方法1、图像增强两大方法:空间域方法和时间域方法(以后再详述)2、图像
    发表于 12-26 15:57

    FPGA图像处理基板的逻辑功能

    1.FPGA功能设计上图所示的是FPGA图像处理基板的逻辑功能框图,图中左侧是背板接头,FPGA与背板接头相连的信号主要包括8路3.125G
    发表于 11-10 08:06

    FPGA图像处理

    FPGA图像处理
    发表于 12-14 22:29 19次下载

    基于FPGA图像处理及自动调控电路的设计

    设计了一种基于现场可编程门阵列(FPGA)EP3C25F25617 的图像处理及自动调控电路。该电路主要完成可见光图像的直方图均衡、中值滤波、十字叉叠加、快速自动调焦等
    发表于 11-06 15:36 9次下载
    基于<b class='flag-5'>FPGA</b>的<b class='flag-5'>图像</b><b class='flag-5'>处理</b>及自动调控电路的设计

    略谈FPGA图像处理

    FPGA图像处理之路,从此开始,接下来,让我们把时间交给“图像处理”。一休哥在动笔之前,一直在犹豫,反复思考着一个问题,这个问题一直困扰着我
    发表于 05-09 17:05 4158次阅读

    FPGA图像处理方法

    图像细节。 FPGA图像处理方法 1、图像增强 两大方法:空间域方法和时间域方法(以后再详述) 2、图像
    的头像 发表于 12-25 14:15 3430次阅读
    <b class='flag-5'>FPGA</b><b class='flag-5'>图像</b><b class='flag-5'>处理</b>方法

    FPGA图像处理应用详细介绍

    FPGA图像处理应用详细介绍
    发表于 02-28 10:29 50次下载

    FPGA图像处理算法有哪些

    早之前的朋友知道我发过一个用chatgpt分析出来的 FPGA图像处理的知识树,里面包含了从色域,镜头,接口和算法。然后我就发现这个算法部分chatgpt 给我整理的比较乱,查询了一番,确实发现
    的头像 发表于 09-12 09:59 1050次阅读
    <b class='flag-5'>FPGA</b><b class='flag-5'>图像</b><b class='flag-5'>处理</b>算法有哪些

    FPGA图像处理方法

    图像细节。 FPGA 图像处理方法 1、图像增强 两大方法:空间域方法和时间域方法(以后再详述) 2、
    的头像 发表于 12-02 13:15 1108次阅读