龙空技术网

FPGA——数码管应用(含层次化设计+按键消抖)

小锋学长生活大爆炸 318

前言:

当前同学们对“fpga计数器数码管显示888什么意思呀怎么回事”大约比较关切,咱们都想要剖析一些“fpga计数器数码管显示888什么意思呀怎么回事”的相关知识。那么小编同时在网上搜集了一些对于“fpga计数器数码管显示888什么意思呀怎么回事””的相关知识,希望你们能喜欢,咱们一起来学习一下吧!

Ø项目需求

统计按键次数,按键每按下一次,计数值加一,并将计数值显示到数码管;复位键按下,数据清零;前五个数码管都显示F,第六个数码管显示计数值(0~F)

Ø分析项目需求中所涉及的所有外设的工作原理

图 1.4-1字母对应关系

图 1.4-2 data与数码管

图 1.4-3数码管选通

观察原理图1.4-3可知,数码管的位选信号Sel为低时选通,从000~111分别对应第1~6个数码管;段选信号Seg为低时对应发光二极管亮。

由图1.2-3知,按键默认上拉,所以设置为按键按下时,检测到低电平,计数加1;当加到F时,清零;

Ø绘制系统框图

图 1.4-4 流水灯框图

Ø编写代码

·数码管部分

6个数码管每个4位,所以设置一大24位的data存放状态:reg [23:0] data; 按照要求,在初始化时赋值fffff0;设置data_buf读取data对应状态位送入数码管进行显示。

参考图1.4-3可知,6个数码管每次只能选通一个,所以要实现6个数码管同时亮,需要用“扫描”方式,以人眼无法分辨的频率对数码管的状态进行刷新。可对Sel进行控制:

确定了数码管的选通和刷新,接下来要让它显示正确的数字,还需要根据数码管结构进行编码:

·计数部分

按键按下,数字加1;计数到F,再按一下按键,数字为0;

·频率部分

设置合适的频率,让数码管全亮,同时不会有闪顿或残影,本次取1kHz即可;这里的counter1为1kHz,作为刷新用;counter2是100Hz,其实是做按键消抖用。

·按键部分

机械按键在接通和断开时,并非理想的阶跃,而是有很多的毛刺,这些毛刺会导致数码管错误认为是我们在按按键,导致数码管乱跳动。消除按键抖动的一个常用方法是加延时;

加延时方法也有好多。如果用counter计数来延时,可能能实现但效果不佳;或用老师上课的方法——按键按下开始计数,按键松开停止计数,判断计数是否在设定的有效范围内,这样的效果不错,但代码量太大,看起来也很费劲;我采用的是类似延时的方法,原理相同,但代码中见不到counter计数延时。

一般按键按下后抖动的时间在5~10ms,而人按键一般在20ms以上;所以只要在前20ms内屏蔽信号,在20ms后重新检测,若还是按键按下,则加1;

Key模块里面是不是很简单,就是大家能想到的代码。

·消抖实现

消抖部分:

Clk_up与按键相连,每按一次按键,always内就执行一次,data就加1;而module Key中的Clk是counter2设定的100Hz,即每100Hz检测一次按键;对于不同按键,可以通过更改counter2的计数来改变按键响应频率,以获得更好效果;

·层次化设计

各个部分模块全部设置完毕,回顾一下用到了数码管、按键、频率模块,如果都写在一个模块里,难免显得杂乱而且不易于移植。跟C语言一样,Verilog也可以分模块写,即层次化设计。

图 1.3-5层次化设计

一般的FPGA开发 需要将要实现的模块按照功能划分成一个个子模块,顶层文件就是将这些小的功能模块连接起来,以实现最终的功能的文件。本项目的顶层文件:

Ø项目总结

层次化设计这种编程思路,在工程创建中很实用,检查问题也很快。一个层次清晰的设计思路和结构保证工程在调试和维护过程中非常方便。机械开关由于机械触点的弹性作用,因而在闭合及断开的瞬间均伴随有一连串的抖动,为了不产生这种现象而作的措施就是按键消抖。

注:版权所有,转载请注明出处。

标签: #fpga计数器数码管显示888什么意思呀怎么回事