一、实验目的

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 环境中实现语言综合、调试、下载验证。

四、实验仿真

  1. 硬件平台

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)相关推荐

  1. FPGA | 按键、拨码开关控制流水灯实验(附完整代码)

    FPGA 课程设计,果断选择最简单的花式点灯 实验要求 一.设计一个8路流水灯控制电路 二.有多种变化方式: 1)自左向右逐次点亮,或自右向左逐次点亮,到终点后在从头开始: 2)自左向右逐次熄灭,或自 ...

  2. 51单片机_7-1独立按键控制流水灯方向

    文章目录 要求 资源 效果 main函数 要求 1.使用单片机内部定时器做为延时函数 2.独立按键K1控制流水灯左移 3.独立按键K2控制流水灯右移 资源 工程文件压缩包 链接:https://pan ...

  3. 四、 按键控制流水灯的运行与暂停

    按键控制流水灯的运行与暂停 项目要求: [1]程序开始时,4个LED灯全亮一会,然后,再全灭一会,开始进入跑马灯. [2]跑马灯过程为:D4灯亮,其余熄灭,延时,D3灯亮,其余熄灭,延时,D6灯亮, ...

  4. proteus7.7+Keil2仿真80C51控制流水灯

    在今年夏天发布的关于8051的诸多博文中, 我都是用STC89C52RC实验箱来验证8051控制程序的正确性的. 这样做的好处是可以直接和真正的8051单片机打交道, 且能熟练掌握将.hex文件烧写到 ...

  5. 单片机-四个按键控制流水灯

    单片机-四个按键控制流水灯 代码 代码 代码片. #include "reg51.h" sbit key1 = P2 ^ 0; sbit key2 = P2 ^ 1; sbit k ...

  6. 基于FPGA实现的流水灯实验

    版权声明:如需转载,请注明出处 https://blog.csdn.net/chengfengwenalan/article/details/79606351 基于FPGA实现的流水灯实验 一.开发环 ...

  7. 基于FPGA实现的流水灯项目

    基于FPGA实现的流水灯实验 一.开发环境 软件环境:Quartus Prime 17.1 ,notepad++,gvim,modelsim-SE,TimeGen3 硬件环境:DE2-115(Inte ...

  8. 单片机c语言 流水灯 教案,单片机控制流水灯讲课教案.doc

    单片机控制流水灯 前言 随着人们生活环境的不断改善和美化,在许多场合可以看到彩色霓虹灯不断变化闪烁.LED灯由于其丰富的灯光色彩,低廉的造价以及控制简单等特点而得到了广泛的应用,用彩灯来装饰街道和城市 ...

  9. 用c语言完成流水灯控制的程序设计,单片机C语言程序设计之TIMER0控制流水灯

    描述 基于单片机的LED流水灯的应用十分广泛,由单片机作为的核心控制器,通过按键实现控制功能和数据输入是非常普遍的.通常在所需按键数量不多时,系统常采用独立式按键.这种按键的电路配置灵活,软件结构简单 ...

最新文章

  1. 相机数据格式设置不对踩坑
  2. 自学python需要的软件-学习Python,从入门到精通,其实只需要两个月就够了
  3. pythonweb框架Flask学习笔记05-简单登陆
  4. “3D几何与视觉技术”全球在线研讨会第三期
  5. UVa1422 Processor
  6. 高等组合学笔记(九): 球盒模型的十二模式,分拆的生成函数
  7. 常用服务器安装和部署
  8. java接口构造函数_Java8自定义函数式编程接口和便捷的引用类的构造器及方法
  9. 计算机曝光模式有哪些,摄影:单反相机中P、A、S、M四种曝光模式的用法详解 -电脑资料...
  10. 语义分割——Spatial Pyramid Pooling (SPP)的作用
  11. python小说全站爬虫_起点小说网全站爬虫(Python)
  12. Linux文件的三个时间概念
  13. Arduino十大滤波算法程序大全(精编无错版)
  14. Python 列表应用之“简易好友管理系统”
  15. easyui框架搭建
  16. 转~ubuntu的一些常用软件
  17. Android11权限管理,Android 11 中的权限更新
  18. WE出海增长图书馆 | 世界杯豪门面纱下,不容忽视的【增长】沃土
  19. Android 10.0在电话拨号盘(Dialer app中)通过暗码进入工厂测试模式
  20. 【国内动态】服务器列表

热门文章

  1. MySQL page cleaner占用CPU较高问题
  2. [音乐天堂]Ce train qui s’en va 离站的火车
  3. 四足动物模型控制中的模型自适应神经网络
  4. iso22000食品安全管理体系_ISO22000《食品安全管理体系》
  5. 「容联云」组织效能提升,从统一通讯到综合协同
  6. 我灰是啥意思是什么_吃灰是什么意思
  7. python计算三角形面积_Python3计算三角形的面积代码
  8. IGMP、MLD原理
  9. 修改mysql的密码时遇到问题ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corre
  10. 我的INTERNET网络收藏夹网址