FPGA|CPLD|ASIC论坛
直播中

熊治坤

1年用户 875经验值
擅长:控制/MCU
私信 关注

【每周一练】盘古1K开发板 练习二:按键控制彩灯实验

Key

实验目的

1 设计 8 种彩灯效果, 可通过按键切换。

2 选择一个按键作为控制输入, 按下一次换一种显示效果, 在 8 种效果中循环。

实验要求

1、 实验平台: MES2KG 开发板;

2、 按键输入由 K1 输入, LED 输出为 LD1~LD4。

实验原理

实现框架如下:
image.png

1、 顶层实现按键切换 LED 的彩灯状态;

2、 需要设计一个输入控制模块及一个输出控制模块;

这个实验带大家将多个模块整合成为一个工程, 涉及到的知识点有子模块设计、 模块例化; 子模块的设计主要是依据功能定位,确定输入输出, 再做具体的设计;

模块例化方式如下:
image.png

按键控制模块功能

接收按键输入信号。 统计按键按下次数, 由于彩灯模式是 8 种, 计数统计范围是 0~7 循环, 将计数结果传递给 LD 控制模块;

根据需求输入信号有: 时钟, 按键; 输出信号有: 彩灯控制信号;

内部功能处理:

<1>内部需要对按键信号做消抖处理;

<2>按键触发计数器( 计数值输出) 改变继而调整彩灯的状态;

image.png

按键消抖

消抖目的

机械式弹片按键, 在按下或松开时会有机械抖动, 导致在按下或松开时按键的状态不稳定, 在快速的变化, 在使用按键输入信号时如果采集了抖动时的状态,会导致工程运行出现不可控的变化, 故而我们需要将这段时间的抖动信号给滤除掉, 故此实验称之为按键消抖;
实验原理
image.png

前后抖动时间约为 5~10ms, 前后抖动共在 20ms, 以最大 20ms 做设计, 使用计数到 N 归零的计数器来做时间刻度计时; 以 20ms 的间歇对按键输入信号进行采集, 从而避开按键的抖动引起的信号快速变化;
image.png

设计 1 个 20bit 的计数器, 其计数最大值为: N = 20’ hC3500 = 20’ d800000最大计数值时, 计时为: t= N*T = N/f = 800000/40M = 20ms;注: 对于计数器完成计时功能在 LED 灯控制中已有详细讲解, 需要关注输入时钟频率以及目标计时时长, 从而得到计数器的计数范围;
LED 控制模块功能

8 种流水灯模式有按键传递过来的计数控制切换, 每一个 LED 的显示状态完整后进入下一模式初始化。 根据需求可得到如下信息:

输入信号: 时钟, 彩灯模式控制信号; 出信号: 12bit 位宽的 LED 控制信号;

程序下载

image.png

实验现象

上电后下载完固件, 默认 LD1~LD4 流水, 每按下一次 KEY1, 彩灯状态切换一次, 总共 8 种状态可供循环切换;

学习体会

1-掌握了软件延时消抖原理

2-软件计时员原理的理解与应用

3-IO输出控制方法的掌握

更多回帖

发帖
×
20
完善资料,
赚取积分