记录一个小实验吧,实验的目的是仅仅是塞塞牙缝而已,没其他意思,很简单。

功能:拨码开关控制led灯工作与否,拨码开关为on,led灯工作,否则不工作;导航按键up和down,也就是独立按键而已,控制led等流动方向。当按下导航开关up时,led灯从高到低流动,按下down时,led灯从低到高流动。

分析:拨码开关没啥说的,很简单,拨码开关为on,也就是为低电平时,用一个使能寄存器变量led_en控制led灯处于工作状态。

至于导航按键,存在一个抖动问题,所以需要进行去抖动操作,去抖动操作的方法有很多,这里依然沿用最简单的方式,见曾经的博文分析:《按键消抖与LED控制》实验的个人思考与总结

这里使用的代码是特权的,但是按键抖动部分,我改成了我能看懂的,也就是最简单的方式。

led灯的流动使用移位的方式实现。代码如下:

使用硬件平台实现的时候,记得进行物理约束,也即管脚约束即可。

/
//工程硬件平台: Xilinx Spartan 6 FPGA
/
//拨码开关SW3作为开关信号,导航按键UP和DOWN作为LED流动方向控制信号,实现8个LED开关、方向可控的流水灯功能
module sp6_ljs(input ext_clk_25m,   //外部输入25MHz时钟信号input ext_rst_n, //外部输入复位信号,低电平有效input switch,    //拨码开关SW3输入,ON -- 低电平;OFF -- 高电平input key_upup,key_down,  //up和down两个导航按键输入,未按下为高电平,按下后为低电平output reg[7:0] led      //8个LED指示灯接口    );//-------------------------------------
//按键抖动判断逻辑
reg key;    //所有按键值相与的结果,用于按键触发判断
reg key_r;  //按键值key的缓存寄存器
wire key_an;always @(posedge ext_clk_25m or negedge ext_rst_n)if (!ext_rst_n) key <= 1'b1;else key <= key_upup & key_down;always @(posedge ext_clk_25m or negedge ext_rst_n)if (!ext_rst_n) key_r <= 1'b1;else key_r <= key;assign key_an = key_r&(~key); //只有按键状态变化,key_an都会出现一个高电平,是由于按键抖动引起的
//如下示意:
//  key  1 1 1 1 0 1
//~key   0 0 0 0 1 0
//key_r    1 1 1 1 0 1
//key_an   0 0 0 1 0
//-------------------------------------
//定时计数逻辑,用于对按键的消抖判断
reg[19:0]  cnt; always @ (posedge ext_clk_25m or negedge ext_rst_n)if (!ext_rst_n) cnt <= 20'd0;  else if(key_an) cnt <=20'd0;else if(cnt < 20'd999_999) cnt <= cnt + 1'b1;else cnt <= 20'd0;reg[1:0] key_value[1:0];always @(posedge ext_clk_25m or negedge ext_rst_n)if (!ext_rst_n) beginkey_value[0] <= 2'b11;key_value[1] <= 2'b11;endelse if(cnt == 20'd999_999) begin    //定时键值采集key_value[0] <= {key_upup,key_down};key_value[1] <= key_value[0];    endwire[1:0] key_press = key_value[1] & (~key_value[0]);      //消抖后按键值变化标志位   //------------------------------------
//流水灯开启、停止和流动方向控制开关、按键值采集
reg led_en;     //LED流水灯工作使能信号,高电平有效
reg led_dir;    //LED流水灯方向控制信号,1--从高到低流动,0--从低到高流动always @ (posedge ext_clk_25m or negedge ext_rst_n)if(!ext_rst_n) begin led_en <= 1'b0;led_dir <= 1'b0;endelse begin//流水灯开启/停止控制if(!switch) led_en <= 1'b1; //拨码开关为on时,led灯工作else led_en <= 1'b0;//流水灯方向控制if(key_press[0]) led_dir <= 1'b0;    //从低到高流动else if(key_press[1]) led_dir <= 1'b1; //从高到低流动else ;end//------------------------------------
//LED流水灯变化延时计数器
reg[23:0] delay;    always @ (posedge ext_clk_25m or negedge ext_rst_n)if(!ext_rst_n) delay <= 24'd0;else delay <= delay+1'b1;  //-------------------------------------
//流水灯开启、停止和流动切换控制always @ (posedge ext_clk_25m or negedge ext_rst_n)if(!ext_rst_n) led <= 8'b1111_1110;   else if((delay == 24'h3fffff) && led_en) begincase (led_dir)1'b0: led <= {led[6:0],led[7]}; //从低到高流动    1'b1: led <= {led[0],led[7:1]};    //从高到低流动default: ;endcaseendelse ;endmodule

实验证明,很完美。

【 FPGA 】按键消抖与LED灯流动小实验相关推荐

  1. 关于按键消抖以及LED灯控制的一个实例

    要求: 1.未按建则所有LED全黑: 2.按K1按钮,则用前8个LED灯二进制显示25: 3.按K2按钮,则12只LED合并显示流水灯效果,3个LED点亮并向右流水. 注:是HR-240B FPGA  ...

  2. stm32 工业按键检测_STM32单片机按键消抖和FPGA按键消抖大全

    写在前面: 物联网STM32入门 - 直播课程 - 创客学院​www.makeru.com.cn 按键去抖:由上图可以看出理想波形与实际波形之间是有区别的,实际波形在按下和释放的瞬间都有抖动的现象,抖 ...

  3. stm32硬件消抖_STM32单片机按键消抖和FPGA按键消抖大全

    原标题:STM32单片机按键消抖和FPGA按键消抖大全 写在前面: 按键去抖:由上图可以看出理想波形与实际波形之间是有区别的,实际波形在按下和释放的瞬间都有抖动的现象,抖动时间的长短和按键的机械特性有 ...

  4. FPGA按键消抖(高级篇)

    一. 硬件介绍 FPGA开发板 一个按键 一个led灯 二. 功能介绍 可以满足三种不同要求的消抖方式 通过led灯测试三种消抖方式 三. 消抖方式介绍 mode 0 : 按键按下消抖后,算一次. m ...

  5. 《按键消抖与LED控制》实验的个人思考与总结

    2019/01/08,第一个判断是否有按键按下的操作好像有问题,有空在修改! 红色为修改部分: 问题描述: 当三个独立按键的某一个被按下后,相应的LED被点亮:再次按下后,LED熄灭,按键控制LED亮 ...

  6. 基于51单片机的led灯控制小实验

    该小实验是为了更好的理解51单片机的使用,其完成的要求如下: 1.第一个键控制两个灯的翻转; 2.第二个键控制一个灯的翻转; 3.第三个键接在51单片机的外部中断口,每检测到一次,翻转三下; 4.第四 ...

  7. Verilog实现4位按键消抖,分别控制一个LED

    Verilog实现4位按键消抖,分别控制一个LED 代码思路(完整代码在后) 完整代码 参考:(主要是第一篇,第二篇不严谨) <按键消抖与LED控制>实验的个人思考与总结 Verilog实 ...

  8. FPGA编程按键消抖

    FPGA按键消抖 编写思路 1.按键消抖的基本原理 2.代码原理 3.代码部分 4.仿真代码编写 5.仿真 6.总结 一.按键消抖的基本原理 按键消抖,按下,松开存在毛刺,主要为了消除毛刺.通过稳定后 ...

  9. ISE 下按键消抖实验

    实验原理 按键做为基本的人机输入接口,在很多电子设计中都能见到,由于机械特性,在按键按下或 松开的时候,按键输入值是有抖动的,无论按下去是多平稳,都难以消除抖动,按键消抖方式有 很多,本实验主要是通过 ...

最新文章

  1. Mysql5.5配置主从复制
  2. plugin ‘org.springframework.boot:spring-boot-maven-plugin:‘not found
  3. windows serve 2012部署操作系统之部署(三)
  4. CetnOS 6.7安装Hive 1.2.1
  5. 三个内置模块shutil logging hashlib config
  6. python:使用strip()去掉首尾空格
  7. ActiveMQ(19):高级特性之独有消费者(Exclusive Consumer)
  8. spss相关性分析_关公配赤兔——因子分析和SPSS
  9. 微信小程序音量调节插件
  10. 14期-连肝7个晚上,总结了计算机网络的知识点!(共66条)
  11. Tornado get/post请求异步处理框架分析
  12. [源码解读]一文彻底搞懂Events模块
  13. 常见端口号一览(详细)
  14. UVA10537 The Toll! Revisited
  15. 数字化与数据化——概念界定与辨析
  16. 采用头插法和尾插法建立单链表
  17. 重做日志文件(redo log file)
  18. 一个有成就感又有挫败感的日子
  19. 企业实名认证api数据接口介绍
  20. PyQT5 - 打包为.EXE文件

热门文章

  1. JingRiverOS的自由软件之路
  2. 简单截屏恶搞程序(客户端+服务端)
  3. python 新运算符定义_【干货系列之萌新知识点】python与变量和运算符
  4. spark指定python版本_如何将正常的Python应用程序正确转换为PySpark版本
  5. 启动ipython_ipython,_ipython 启动错误,ipython - phpStudy
  6. bal插口_EBS R12各模块接口表大全
  7. count(*)效率提高_想使用多线程来提高处理速度,却还不知道使用CountDownLatch与CyclicBarries?...
  8. DAC输出波形的最大频率是多少?
  9. 利用Python模拟鼠标操作,一键将GIF文件载入CSDN的Markdown编辑器
  10. 械模拟计算器 - 计算尺