3. 戏说VHDL之入门游戏一:流水灯

一.   流水灯

1.1流水灯原理

流水灯是每个学电子的入门“游戏” ,示意图如图1,其原理极其简单,但是可玩性却极强,可以就8个LED写出不同花样的程序。在1.2中我们列出两个不同思路的代码作为VHDL的入门例程。

图1 流水灯电路图

1.2 流水灯例程

这里提供两个不同的代码。

第一个代码的思路是先对系统时钟分频,产生1s信号(即变量count取值到25000000,这样分频时间=20ns*25000000*2=1s),然后使用移位操作符指令进行操作。该指令是在VHDL93中引入的,包括sll,srl,sla,sra,rol,ror6个指令,指令操作如图2一目了然。值得注意的是,使用该指令,左操作数必须是BIT_VECTOR类型,右操作数必须是INTEGER类型(前面可以有负号)。

图2 移位操作符示意图

例如:令x <= “10110”,则

y <= x sll 2 ;--逻辑左移两位,y <= “ 11000”,空余位填充0

y <= x srl 2 ;--逻辑右移两位,y <= “00101”,空余位填充0

y <= x sla 2 ;--算术左移两位,y <= “11000”,空余位复制最右边上的数值

y <= x sra 2 ;--算术右移两位,y <= “11101”,空余位复制最左边上的数值

y <= x rol 2 ;--循环逻辑左移两位,y <= “11010”,左侧移出位填补到右侧

y <= x ror 2 ;--循环逻辑右移两位,y <= “10101”,右侧移出位填补到左侧

例程一:

 1 --------------------------------------------------------------------------------------------------
 2
 3 library IEEE;
 4
 5 use IEEE.std_logic_1164.all;
 6
 7 --------------------------------------------------------------------------------------------------
 8
 9 entity VHDL_LEDWATER1 is
10
11        port (
12
13                      Clk    : in  STD_LOGIC;             --创建时钟端口,连接开发板PIN23
14
15                      Rst     : in  STD_LOGIC;            --创建复位端口,连接开发板PIN116
16
17                      Output : out BIT_VECTOR(7 downto 0) --创建输出端口,对应8个LED。分别
18
19             --为PIN142-PIN133,要使用移位操作符
20
21               );                                         --其左侧必须为BIT_VECTOR类型
22
23 end VHDL_LEDWATER1;
24
25 --------------------------------------------------------------------------------------------------
26
27 architecture behave of VHDL_LEDWATER1 is
28
29        signal Clk1 : STD_LOGIC;             --建立中间时钟信号
30
31 begin
32
33 P1:process(Clk)
34
35 variable count : INTEGER range 0 to 25 := 0; --变量初始值不可综合,在仿真中使用,并
36
37 variable count1: STD_LOGIC := ‘1‘;           --且为便于仿真,这里取到25,当烧写到开
38
39        --发板时候,改写为25000000即可
40
41        begin
42
43               if(Rst = ‘0‘) then
44
45                      count := 0;
46
47               elsif(Clk‘event and Clk = ‘1‘) then
48
49                      count := count + 1;
50
51                      if(count = 25) then --这里使用=,而不是>=,可以防止产生比较器,节省硬件资源
52
53                             count := 0;
54
55                             count1 := not count1;
56
57                      end if;
58
59               end if;
60
61               Clk1 <= count1;
62
63    end process P1;
64
65 P2:process(Clk1)
66
67        variable temp : BIT_VECTOR(7 downto 0) := "11111110";--注意左操作数类型
68
69        begin
70
71               if(Clk1‘event and Clk1 = ‘1‘) then
72
73                      temp := (temp rol 1);
74
75               end if;
76
77               Output <= temp;
78
79        end process P2;
80
81 end architecture;

--------------------------------------------------------------------------------------------------

仿真波形:


从仿真波形中,可以验证例程的正确性。

第二个代码的思路是先对系统时钟分频,产生1s信号,然后对该1s信号进行模8计数,再利用case-when语句进行判断,进而控制LED。

例程二:

  1 --------------------------------------------------------------------------------------------------
  2
  3 library IEEE;
  4
  5 use IEEE.std_logic_1164.all;--该库定义了std_logic(8值)和std_ulogic(9值)多值逻辑结构
  6
  7 --------------------------------------------------------------------------------------------------
  8
  9 entity LEDWATER is
 10
 11 port (
 12
 13        Clk    : in  STD_LOGIC;                  --创建时钟端口,连接开发板PIN23
 14
 15        Rst    : in  STD_LOGIC;                  --创建复位端口,连接开发板PIN116
 16
 17      Output : out  STD_LOGIC_VECTOR(7 downto 0) --创建输出端口,连接开发板PIN142-PIN133
 18
 19 );
 20
 21 end LEDWATER;
 22
 23 --------------------------------------------------------------------------------------------------
 24
 25 architecture BEHAVIOR_LEDWATER of LEDWATER is
 26
 27        signal Clk1 : STD_LOGIC;                           --建立中间时钟信号
 28
 29 begin
 30
 31 P1: process(Clk)                                          --进程1,对时钟信号进行N分频
 32
 33 variable count : INTEGER range 0 to 25 := 0;--变量初始值不可综合,在仿真中使用
 34
 35        variable count1: STD_LOGIC := ‘1‘;
 36
 37        begin
 38
 39               if(Rst = ‘0‘) then
 40
 41                      count := 0;
 42
 43               elsif(Clk‘event and Clk = ‘1‘) then
 44
 45                      count := count + 1;
 46
 47                      if(count = 25) then
 48
 49                             count := 0;
 50
 51                             count1:= not count1;
 52
 53                      end if;
 54
 55                      Clk1 <= count1;
 56
 57               end if;
 58
 59        end process;
 60
 61 P2: process(Clk1)                                  --进程2,对分频信号进行计数,进而控制LED亮灭
 62
 63        variable count2 : INTEGER range 0 to 8 := 0;--变量初始值不可综合,在仿真中使用
 64
 65        begin
 66
 67               if(Clk1‘event and Clk1 = ‘1‘) then
 68
 69                      count2 := count2 + 1;
 70
 71                      if(count2 = 8) then
 72
 73                             count2 := 0;
 74
 75                      end if;
 76
 77               end if;
 78
 79               case count2 is
 80
 81                      when 0 => Output <= "11111110";
 82
 83                      when 1 => Output <= "11111101";
 84
 85                      when 2 => Output <= "11111011";
 86
 87                      when 3 => Output <= "11110111";
 88
 89                      when 4 => Output <= "11101111";
 90
 91                      when 5 => Output <= "11011111";
 92
 93                      when 6 => Output <= "10111111";
 94
 95                      when 7 => Output <= "01111111";
 96
 97                      when others => Output <= (others => ‘Z‘);
 98
 99               end case;
100
101        end process;
102
103 end BEHAVIOR_LEDWATER;

仿真波形:


从仿真波形中,可以验证例程的正确性。

1.3 总结

其实,肯定还有其他精妙的想法,这里只列举了两种代码作为学习的开头。不过通过两个代码的学习,也熟悉了移位操作符和case-when语句的使用。下一节将开始数码管的学习。

参考文献:

[1] Volnei A.Pedroni.VHDL 数字电路设计教程[M].北京:电子工业出版社,2009:39-40;

[2] http://leonmoon.blog.hexun.com/4609284_d.html

时间: 2024-10-24 14:13:38

3. 戏说VHDL之入门游戏一:流水灯的相关文章

Unity3D 入门 游戏开发 Unity3D portal game development

Unity3D 入门 游戏开发 Unity3D portal game development 作者:韩梦飞沙 Author:han_meng_fei_sha 邮箱:[email protected] E-mail: 313134555 @qq.com 视频学习链接:Video learning link: [教学视频]深入浅出Unity3D--第一篇-何韬-CSDN学院-在线学习教程 u3d 4.6 c#  性能上 比 java脚本 好一些 C # is better than a Java

神经网络入门游戏推荐BugBrain

今天看到一款神经网络入门游戏,BugBrain,在游戏中,你可以通过连接神经元,设置神经元阈值等建造虫子的大脑,让瓢虫.蠕虫.蚂蚁等完成各种任务.下载下来玩了玩,难度真不是入门级的= =!真心佩服作者的智商. 游戏官方主页 http://www.biologic.com.au/bugbrain/ (左下是蠕虫的大脑) (一个蚂蚁的大脑就如此复杂···) BugBrain游戏提供了一个非常不错的游戏地图编辑器,和测试平台.地图编辑器中玩家可以根据个人喜好,编辑你自己的虚拟世界,让你的小虫们生活在这

四位流水灯Led_4

流水灯实验是我们学习开发板或语言的入门程序,通过流水灯这个可视化的实验,会增加我们对学习语言的乐趣, 会让我们觉得其实语言也是可以玩出花样的,接下来呈上代码,大家可以下到自己的板子里试试,. //Led_4.v module Led_4(clk,rst,led); input clk; input rst; output [3:0] led; reg [3:0] led; always @(posedge clk or negedge rst) begin if(!rst) begin led

第一个FPGA工程—LED流水灯

这一章我们来实现第一个FPGA工程-LED流水灯.我们将通过流水灯例程向大家介绍一次完整的FPGA开发流程,从新建工程,代码设计,综合实现,管脚约束,下载FPGA程序.掌握本章内容,大家就算正式的开始入门FPGA开发了. 1.1.1.电路说明 1.1.2.新建工程 第一步:从开始菜单启动Quartus II 13.1(64 bit) ,如下图. 第二步:菜单栏选择File->New Project Wizard,新建工程. 第三步:弹出新建工程对话框,点击Next,下一步. 第三步:如下图,依次

2. 基于STM32F10x.3.5.0库的流水灯程序实现

上文主要描写了如何新建一个工程,那么下面就开始了stm32芯片的学习之旅,像c/c++中经典的入门代码"hello world"一样,stm32入门程序流水灯绝对也是经典,如果你已经有了一定的C语言基础以及对51芯片有一定了解,那么学习起来绝对事半功备,当然没有也不需要担心,本程序代码量很少,实现起来很简单.不过学习stm32,第一点就是要转变思路,从现在开始你不在是仅仅和编程语言打交道了,交叉编译的方式注定嵌入式软硬件不分家,必要的硬件知识也是必须的(本博客中所有程序都是在stm32

永远的流水灯(Verilog)

1. 为了更好地学习FPGA和深入理解Verilog语法,首先从最简单的流水灯做起.虽然简单,但是也包含了不少知识.通过这次实验项目,可以了解开发软件的使用及Verilog的编程方法,熟悉模块化设计的方法. 2. 该项目主要实现的功能为: (1)10位的流水灯 (2)中间两个led灯每隔100ms闪烁一次 (3)两边的led灯每隔100ms流动一下,从中间向两边流水. 3.  具体实现如下 (1)首先定义一个时间计数寄存器counter,每当达到预定的100ms时,计数寄存器就清零,否则的话寄存

Qt利用代码实现流水灯的效果

用代码实现流水灯的效果 其实很想实现这种流水灯的效果了,看起来挺酷的,用处也很多,只是开始没有思路不知道怎么去实现,于是在我的超市收银项目中就采用了图片加载的方式进行显示,效果如下图所示: 由于是动态图片,显示的时候就要用到QMovie进行加载,简单的代码如下所示: QMovie *move = new QMovie(":/images/splash.gif"); QLabel *label = new QLabel("",0); label->setWind

51单片机第一弹---流水灯

转行搞硬件..acm算是走到头了,毕竟电子是自己专业的特色.. 初撸单片机,买的板子是STC89C52(某宝58大洋淘来的..) 郭天祥新概念的那本书(好像有点不配套不过凑活着弄了也..) 说一下容易犯的错误吧. 1.串口驱动搞了1个多小时..一直安装不上,后来跟着教程做的 2.书上写的控制LED端口的是P1 ,但实际上买的这快板子是P2 ,最开始搞了半天老是点不亮灯,后来一想会不会端口错了,换成0试试?换了不行,又换了2..亮了(这是个问题,以后要找学长问问,怎么根据开发板看出来每个模块的端口

[51单片机] EEPROM 24c02 [I2C代码封装-保存实现流水灯]

这里把EEPROM 24c02封装起来,今后可以直接调用,其连线方式为:SDA-P2.1;SCL-P2.0;WP-VCC >_<:i2c.c 1 /*----------------------------------------------- 2 名称:IIC协议 3 内容:函数是采用软件延时的方法产生SCL脉冲,固对高晶振频率要作 一定的修改....(本例是1us机器 4 周期,即晶振频率要小于12MHZ) 5 ---------------------------------------