写的第一篇博客,只是用作个人学习的简单记录,有误指出还请大家指出。

按键消抖的部分参考了《勇敢的芯 伴你玩转Altera FPGA》。

按键 功能
复位键 小灯全灭
key[0] 小灯向左依次点亮
key[1] 小灯向右依次点亮
key[2] 1,3位的小灯闪烁
key[3] 2,4位的小灯闪烁

按键消抖原理:采用打拍的方式,与原按键信号组合得到下降沿标志,设置一个计时20ms的计数器,当下降沿有效时(即存在抖动时),计数器的值会清零,这样设置就可以避免采到抖动时错误的键值。一旦计数器的值达到了最大值,就对当前所有的按键值做一次锁存。最后可以通过获得的键值来选择流水灯的变化模式。

//---------按键消抖--------------//
module key_debounce(
input wire          clk,
input wire          rst_n,
input wire [3:0]    key_in,output reg [3:0] key_flag,
output reg [3:0]    key_value);parameter CNT_MAX = 1_000_000;  //1000_000wire         key;
reg         key_reg;
wire        key_neg;reg [19:0]  cnt_20ms;
reg         cnt_flag;
reg [3:0]   key_value_reg;//按键触发判断  按键在未按下时,为高电平
assign key = (key_in[0] & key_in[1] & key_in[2] & key_in[3]);//检测下降沿
always @(posedge clk or negedge rst_n) beginif(!rst_n) beginkey_reg <= 1'b1;endelse beginkey_reg <= key;  end
endassign key_neg = ~key & key_reg;//20ms计数器
always @(posedge clk or negedge rst_n) beginif(!rst_n) begincnt_20ms <= 20'b0;endelse if(key_neg) begincnt_20ms <= 20'b0;endelse begincnt_20ms <= (cnt_20ms == CNT_MAX-1) ? 20'b0 : cnt_20ms + 1'b1;end
end//完成20ms计数标志
always @(posedge clk or negedge rst_n) beginif(!rst_n) begincnt_flag <= 1'b0;endelse if(cnt_20ms == CNT_MAX-1) begincnt_flag <= 1'b1;   endelse begincnt_flag <= 1'b0;end
end//采集按键数据
always @(posedge clk or negedge rst_n) beginif(!rst_n) beginkey_value <= 4'b1111;endelse if(cnt_flag) beginkey_value <= key_in;end
endalways @(posedge clk or negedge rst_n) beginif(!rst_n) beginkey_value_reg <= 4'b1111;endelse beginkey_value_reg <= key_value;end
end//输出对应的按键控制值
always @(posedge clk or negedge rst_n) beginif(!rst_n) beginkey_flag <= 4'b0;endelse beginkey_flag <= ~key_value & key_value_reg;end
endendmodule

流水灯原理:采用的开发板晶振是50MHz,所对应的时钟周期也就是20ns,我想让小灯每隔200ms发生变化,因此需要定义一个从0记到(10000000-1)的24位计数器,以及一个控制小灯状态变化的2位状态计数器。当没有按键按下时,计数器会归零,当计数记到最大值时,状态计数器加一,当状态计数器记到最大值3时,会自动归零,以实现小灯在四个状态内的循环变化。

//--------------状态转换----------------//
reg [23:0]      cnt;
reg [1:0]       interval_flag;always @(posedge clk or negedge rst_n) beginif(!rst_n) begincnt <= 24'b0;endelse if(key_value == 4'b1111) begincnt <= 24'b0;endelse begincnt <= (cnt == INTERVAL - 1'b1) ? 24'b0 : cnt + 1'b1;end
endalways @(posedge clk or negedge rst_n) beginif(!rst_n) begininterval_flag <= 1'b0;endelse if(cnt == INTERVAL - 1'b1) begininterval_flag <= interval_flag + 1'b1;endelse if(key_value == 4'b1111) begininterval_flag <= 2'b0;endelse begininterval_flag <= interval_flag;end
end

小灯的四种模式

//---------------模式选择-------------------//
always @(posedge clk or negedge rst_n) beginif(!rst_n) beginled_out <= 4'b0000;endelse beginif(key_value[0] ==1'b0) begincase(interval_flag)2'd0: led_out <= 4'b0001;2'd1: led_out <= 4'b0010;2'd2: led_out <= 4'b0100;2'd3: led_out <= 4'b1000;endcaseendelse if(key_value[1] ==1'b0) begincase(interval_flag)2'd0: led_out <= 4'b1000;2'd1: led_out <= 4'b0100;2'd2: led_out <= 4'b0010;2'd3: led_out <= 4'b0001;endcaseendelse if(key_value[2] ==1'b0) beginled_out <= (interval_flag < 2'd2) ? 4'b1010 : 4'b0000;endelse if(key_value[3] ==1'b0) beginled_out <= (interval_flag < 2'd2) ? 4'b0101 : 4'b0000;endelse if(key_value == 4'b1111)beginled_out <= 4'b0000;endend
end

FPGA实现花样彩灯相关推荐

  1. 51单片机实例5——基于单片机的花样彩灯

    基于单片机的花样彩灯 1.设计目的 (1)4种样式持续循环 (2)花样1:从上到下依次点亮8位led (3)花样2:从下到上依次熄灭8位led (4)花样3:从两边向中间依次点亮8位led (5)花样 ...

  2. 彩灯控制器课程设计vhdl_VHDL花样彩灯控制器的设计

    10 分 得 分 一.实验名称 实验 8 :花样彩灯控制器的设计 二.任务及要求 [基本部分] 5 分 1 .在 QuartusII 平台上,采用文本输入设计方法,通过编写 VHDL 语言程序,设计一 ...

  3. 花样彩灯的c语言程序设计,单片机花样彩灯课程实施方案报告.doc

    个人收集整理 仅供参考学习 个人收集整理 仅供参考学习 PAGE / NUMPAGES 个人收集整理 仅供参考学习 1.引言 随着人们生活环境地不断改善和美化,在许多场合可以看到彩色霓虹灯. LED ...

  4. 基于FPGA的花样流水灯

    今天一个学弟来问我关于状态机的事,我就给他讲了下经典的三段式状态机,然后就让他试着用状态机去点亮几个LED灯. 状态一:让所有的灯全部熄灭:状态二:全部的灯按照奇偶位的来进行闪烁:状态三:全部的灯从左 ...

  5. 基于FPGA的多路彩灯设计及代码

    1.技术规范 1.1实现功能 本次课程设计要 ModelSim 仿真工具进行逻辑仿真和时序仿真和利用QuartusII 工具进行设计综合利用多路彩灯控制器,能够使花型循环变化,具有复位清零功能,并可以 ...

  6. 基于VHDL的可变速彩灯控制器的设计

    使用VHDL进行设计,首先应该理解,VHDL语言是一种全方位硬件描述语言,包括系统行为级,寄存器传输级和逻辑门级多个设计层次.应充分利用VHDL"自顶向下"的设计优点以及层次化的设 ...

  7. Arduino Mixly入门到精通教程

    目录 1.介绍 2.实验器材和相关资料下载链接 3. Uno Plus 开发板和米思齐软件 第1小节  简单介绍 Uno Plus 开发板 第2小节 Uno Plus 开发板的驱动安装方法 第3小节 ...

  8. 基于51单片机音乐盒仿真设计(音乐播放器)

    基于51单片机音乐盒仿真设计( proteus仿真+程序+原理图+PCB+报告+讲解视频) 仿真图proteus 7.8及以上 程序编译器:keil 4/keil 5 编程语言:C语言 设计编号:S0 ...

  9. stc89c51单片机音乐盒系统设计_基于单片机的音乐盒设计资料 含PCB与原理图,源程序和报告...

    1 选题的背景 本次课设是应用单片机原理和控制理论设计音乐演奏控制器的硬件电路,并利用C语言进行程序设计.通过控制单片机内部的定时器来产生不同频率的方波,驱动喇叭发出不同的音调的音乐,在利用延迟来控制 ...

最新文章

  1. JVM中可生成的最大Thread数量
  2. 双作用叶片泵图形符号_液压气动图形符号及识别
  3. iOS9 Search API 之 Spotlight
  4. ComeFuture英伽学院——2020年 全国大学生英语竞赛【C类初赛真题解析】(持续更新)
  5. 连接数据库字符串编辑
  6. 鸿蒙os怎么还没发布,关于鸿蒙OS系统!小米为何从支持到“失声”?看看中兴就知道了!...
  7. 功率曲线k值_什么叫离心泵的流量——功率曲线?它们之间有什么关系?
  8. vue tree组件_使用Vue 3.0做JSX(TSX)风格的组件开发
  9. HtmlHelper让我们的效率更高
  10. NodeJS + Lighthouse + Gulp 搭建自动化网站性能测试工具
  11. c access mysql数据库_基于C#的Access MsSQL MySQL 三种数据库访问演示(含源文件Demo)...
  12. java案例代码14-guiJframe简单小案例
  13. 实验二、人工智能:产生式系统(动物识别系统)
  14. linux bios格式化磁盘,BIOS设置与磁盘分区、格式化.doc
  15. Excel做多元线性回归
  16. 类似新浪微博中取消关注的弹出确认框
  17. 登录企业邮箱imap服务器,企业邮箱IMAP客户端的同步设置
  18. 电子信息工程找什么工作,能干什么
  19. 8-9(CCPD车牌数据集)
  20. GeoGebra入门之一分钟制作光的反射动态仿真模拟课件

热门文章

  1. vps文件服务器,vps搭建媒体文件服务器
  2. 系统学习SSH(一)--SSH
  3. qbo web接口分析
  4. 随机森林(RandomForest,RF)网格搜索法调参
  5. linux中错误编号对应意思
  6. 【计算机网络】Socket详解
  7. 作为产品经理,有必要考各种证书吗?比如:pmp,npdp
  8. 什么是HTTPS证书
  9. Android辅助H5做一个Web版的相册功能
  10. 常见Web漏洞的修复建议手册