FPGA拨码开关控制流水灯(VHDL)
一、实验目的
1.根据FPGA 开发板资源设计拨码开关控制流水灯实验;
2.利用VHDL 语言自行设计拨码开关控制流水灯程序;
3.在FPGA 开发板上验证。
二、实验原理
FPGA 芯片外部输入的固定晶振时钟信号为40MHz,先进行降频,得到适合的同步时钟,完成拨码开关控制激励流水灯的流向。该功能模块,有5 个输入:时钟信号,复位信号,3 个拨码开关,3 个输出:3 个LED,功能框图为:
模块功能要求:
(1) Reset=0 时复位,Reset=1 时解除复位;
(2) 当拨码开关=111 时,流水灯从左到右跑2 遍后,自动改为从右到左跑1 遍,然后重复;
(3) 当拨码开关=000 时,流水灯从右到左跑2 遍后,自动改为从左到右跑1 遍,然后重复;
(4)在FPGA 实验板上验证时,人眼必须能观察到流水灯运行结果。
三、实验内容和步骤
1、自行安装 EDA 软件;
2、用 VHDL 语言自行编程设计时钟降频逻辑 ,拨码开关控制流水灯逻辑;
3、在 EDA 环境中实现语言综合、调试、下载验证。
四、实验仿真
- 硬件平台
FPGA 硬件管脚信息:
40MHz Clock 为 PIN_16
Reset 为 PIN_17
拨码开关为 PIN_27 PIN_28 PIN_31
LED 灯为 PIN_10 PIN_11 PIN_26
在FPGA 开发板上LED 位置,Reset 按键位置
2.软件仿真
----实验方法1,使用分频+case赋值
1. Library ieee;
2. use ieee.std_logic_1164.all;
3.
4. entity led_button is
5. port( clk:in std_logic;
6. -- f_out:buffer std_logic;
7. rst:in std_logic;
8. button : in std_logic_vector(2 downto 0);
9. led:buffer bit_vector(2 downto 0)
10. );
11. end led_button;
12. architecture behave of led_button is
13. signal cnt1:integer range 0 to 11 ;
14. signal cnt2: integer range 0 to 11;
15. signal q: integer range 0 to 40000000;
16. signal f_out: std_logic ;
17. begin
18.
19. P1:process(clk,rst)
20. variable ans: std_logic ;
21. begin
22. if rst =''0''then
23. ans:=''0'';
24. q<=0;
25. elsif(clk''event and clk=''1'') then
26. if q<=20000000 then ----周期
27. q<=q+1;
28. if q <= 10000000 then ----设置成可调占空比
29. ans := ''0'';
30. else
31. ans :=''1'';
32. end if;
33. else
34. q<=0;
35. end if;
36. end if;
37. f_out <=ans;
38. end process P1;
39.
40. P3:process(f_out,rst,button)
41. begin
42. if (rst = ''0'') then
43. cnt2 <= 0;
44. cnt1 <= 0;
45. led <= "000";
46. else
47. if (button="111") then
48. cnt2 <= 0;-------拨码开关111生效 就复位拨码开关000状态
49. if (f_out''event and f_out=''1'') then
50. cnt1<=cnt1+1;
51. if cnt1>=12 then
52. cnt1<=0;
53. end if;
54. end if;
55.
56. case cnt1 is
57. when 0=>led<="000";
58. when 1=>led<="100";
59. when 2=>led<="010";
60. when 3=>led<="001";
61. when 4=>led<="000";
62. when 5=>led<="100";
63. when 6=>led<="010";
64. when 7=>led<="001";
65. when 8=>led<="000";
66. when 9=>led<="001";
67. when 10=>led<="010";
68. when 11=>led<="100";
69. end case;
70. elsif(button="000") then
71. cnt1 <= 0;-------拨码开关000生效 就复位拨码开关111状态
72. if f_out''event and f_out=''1'' then
73. cnt2<=cnt2+1;
74.
75. if cnt1>=12 then
76. cnt1<=0;
77. end if;
78. end if;
79. case cnt2 is
80. when 0=>led<="000";
81. when 1=>led<="001";
82. when 2=>led<="010";
83. when 3=>led<="100";
84. when 4=>led<="000";
85. when 5=>led<="001";
86. when 6=>led<="010";
87. when 7=>led<="100";
88. when 8=>led<="000";
89. when 9=>led<="100";
90. when 10=>led<="010";
91. when 11=>led<="001";
92. end case;
93. else
94. cnt1 <= 0;
95. cnt2 <= 0;
96. led<="000";
97. end if;
98. end if;
99.
100. end process P3;
101.
102. end behave;
实验仿真:Verification/Debugging files——university program VWF。
1.File->new->university program VWF->OK打开仿真页面
2.edit->insert->insert node or bus或者直接双击左边空白地方弹出insert node or bus对话框。
3.node finder->list-> >> ->OK->OK
分频系数设置小一点,结果表现符合预期。
————————————————分割线————————————————————————
----实验方法2,使用分频+状态机+移位实现(尝试—没实现)(没FPGA用啦、仿真结果不太对劲)
1. Library ieee;
2. use ieee.std_logic_1164.all;
3. entity led_button is
4. port( clk:in std_logic;
5. rst:in std_logic;
6. button : in std_logic_vector(2 downto 0);
7. led:buffer bit_vector(3 downto 0));
8. end led_button;
9. architecture behave of led_button is
10. type st is (s0,s1);---状态机的定义,2个循环状态
11. signal state: st;
12. signal cnt:integer range 0 to 11 ;
13. signal q: integer range 0 to 40000000;
14. signal f_out: std_logic ;
15. begin
16. P1:process(clk,rst)
17. variable ans: std_logic ;
18. begin
19. if rst =''0''then
20. ans:=''0'';
21. q<=0;
22. elsif(clk''event and clk=''1'') then
23. if q<=20000000 then ----周期
24. q<=q+1;
25. if q <= 10000000 then ----设置成可调占空比
26. ans := ''0'';
27. else
28. ans :=''1'';
29. end if;
30. else
31. q<=0;
32. end if;
33. end if;
34. f_out <=ans;
35. end process P1;
36. P3:process(f_out,rst,button)
37. begin
38. if (rst = ''0'') then
39. cnt <= 0;
40. led <= "1000";
41. else
42. if (f_out''event and f_out=''1'') then
43. if (button="111") then
44. case state is
45. when s0 => led <= led ror 1;--循环移位,依次点亮
46. if cnt<=8 then
47. cnt<=cnt+1; --移两遍
48. else
49. state<=s1; --进入下一个状态
50. cnt<=0; --计数器复位
51. end if;
52. when s1 => led <= led rol 1;
53. if cnt<=3 then
54. cnt<=cnt+1; --仅仅移一遍
55. else
56. state<=s0; --进入下一个状态
57. cnt<=0; --计数器复位
58. end if;
59. end case;
60. elsif(button="000") then
61. case state is
62. when s0 => led <= led rol 1;--移位
63. if cnt<=8 then
64. cnt<=cnt+1;
65. else
66. state<=s1; --进入下一个状态
67. cnt<=0; --计数器复位
68. end if;
69. when s1 => led <= led ror 1;
70. if cnt<=3 then
71. cnt<=cnt+1;
72. else
73. state<=s0; --进入下一个状态
74. cnt<=0; --计数器复位
75. end if;
76. end case;
77.
78. else
79. led<="1000";
80. end if;
81. end if;
82. end if;
83. end process P3;
84. end behave;
FPGA拨码开关控制流水灯(VHDL)相关推荐
- FPGA | 按键、拨码开关控制流水灯实验(附完整代码)
FPGA 课程设计,果断选择最简单的花式点灯 实验要求 一.设计一个8路流水灯控制电路 二.有多种变化方式: 1)自左向右逐次点亮,或自右向左逐次点亮,到终点后在从头开始: 2)自左向右逐次熄灭,或自 ...
- 51单片机_7-1独立按键控制流水灯方向
文章目录 要求 资源 效果 main函数 要求 1.使用单片机内部定时器做为延时函数 2.独立按键K1控制流水灯左移 3.独立按键K2控制流水灯右移 资源 工程文件压缩包 链接:https://pan ...
- 四、 按键控制流水灯的运行与暂停
按键控制流水灯的运行与暂停 项目要求: [1]程序开始时,4个LED灯全亮一会,然后,再全灭一会,开始进入跑马灯. [2]跑马灯过程为:D4灯亮,其余熄灭,延时,D3灯亮,其余熄灭,延时,D6灯亮, ...
- proteus7.7+Keil2仿真80C51控制流水灯
在今年夏天发布的关于8051的诸多博文中, 我都是用STC89C52RC实验箱来验证8051控制程序的正确性的. 这样做的好处是可以直接和真正的8051单片机打交道, 且能熟练掌握将.hex文件烧写到 ...
- 单片机-四个按键控制流水灯
单片机-四个按键控制流水灯 代码 代码 代码片. #include "reg51.h" sbit key1 = P2 ^ 0; sbit key2 = P2 ^ 1; sbit k ...
- 基于FPGA实现的流水灯实验
版权声明:如需转载,请注明出处 https://blog.csdn.net/chengfengwenalan/article/details/79606351 基于FPGA实现的流水灯实验 一.开发环 ...
- 基于FPGA实现的流水灯项目
基于FPGA实现的流水灯实验 一.开发环境 软件环境:Quartus Prime 17.1 ,notepad++,gvim,modelsim-SE,TimeGen3 硬件环境:DE2-115(Inte ...
- 单片机c语言 流水灯 教案,单片机控制流水灯讲课教案.doc
单片机控制流水灯 前言 随着人们生活环境的不断改善和美化,在许多场合可以看到彩色霓虹灯不断变化闪烁.LED灯由于其丰富的灯光色彩,低廉的造价以及控制简单等特点而得到了广泛的应用,用彩灯来装饰街道和城市 ...
- 用c语言完成流水灯控制的程序设计,单片机C语言程序设计之TIMER0控制流水灯
描述 基于单片机的LED流水灯的应用十分广泛,由单片机作为的核心控制器,通过按键实现控制功能和数据输入是非常普遍的.通常在所需按键数量不多时,系统常采用独立式按键.这种按键的电路配置灵活,软件结构简单 ...
最新文章
- 相机数据格式设置不对踩坑
- 自学python需要的软件-学习Python,从入门到精通,其实只需要两个月就够了
- pythonweb框架Flask学习笔记05-简单登陆
- “3D几何与视觉技术”全球在线研讨会第三期
- UVa1422 Processor
- 高等组合学笔记(九): 球盒模型的十二模式,分拆的生成函数
- 常用服务器安装和部署
- java接口构造函数_Java8自定义函数式编程接口和便捷的引用类的构造器及方法
- 计算机曝光模式有哪些,摄影:单反相机中P、A、S、M四种曝光模式的用法详解 -电脑资料...
- 语义分割——Spatial Pyramid Pooling (SPP)的作用
- python小说全站爬虫_起点小说网全站爬虫(Python)
- Linux文件的三个时间概念
- Arduino十大滤波算法程序大全(精编无错版)
- Python 列表应用之“简易好友管理系统”
- easyui框架搭建
- 转~ubuntu的一些常用软件
- Android11权限管理,Android 11 中的权限更新
- WE出海增长图书馆 | 世界杯豪门面纱下,不容忽视的【增长】沃土
- Android 10.0在电话拨号盘(Dialer app中)通过暗码进入工厂测试模式
- 【国内动态】服务器列表
热门文章
- MySQL page cleaner占用CPU较高问题
- [音乐天堂]Ce train qui s’en va 离站的火车
- 四足动物模型控制中的模型自适应神经网络
- iso22000食品安全管理体系_ISO22000《食品安全管理体系》
- 「容联云」组织效能提升,从统一通讯到综合协同
- 我灰是啥意思是什么_吃灰是什么意思
- python计算三角形面积_Python3计算三角形的面积代码
- IGMP、MLD原理
- 修改mysql的密码时遇到问题ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corre
- 我的INTERNET网络收藏夹网址