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”,右侧移出位填补到左侧
例程一:
--------------------------------------------------------------------------------------------------
library IEEE;
use IEEE.std_logic_1164.all;
--------------------------------------------------------------------------------------------------
entity VHDL_LEDWATER1 is
port (
Clk : in STD_LOGIC; --创建时钟端口,连接开发板PIN23
Rst : in STD_LOGIC; --创建复位端口,连接开发板PIN116
Output : out BIT_VECTOR( downto ) --创建输出端口,对应8个LED。分别
--为PIN142-PIN133,要使用移位操作符
); --其左侧必须为BIT_VECTOR类型
end VHDL_LEDWATER1;
--------------------------------------------------------------------------------------------------
architecture behave of VHDL_LEDWATER1 is
signal Clk1 : STD_LOGIC; --建立中间时钟信号
begin
P1:process(Clk)
variable count : INTEGER range to := ; --变量初始值不可综合,在仿真中使用,并
variable count1: STD_LOGIC := ''; --且为便于仿真,这里取到25,当烧写到开
--发板时候,改写为25000000即可
begin
if(Rst = '') then
count := ;
elsif(Clk'event and Clk = '') then
count := count + ;
if(count = ) then --这里使用=,而不是>=,可以防止产生比较器,节省硬件资源
count := ;
count1 := not count1;
end if;
end if;
Clk1 <= count1;
end process P1;
P2:process(Clk1)
variable temp : BIT_VECTOR( downto ) := "";--注意左操作数类型
begin
if(Clk1'event and Clk1 = '') then
temp := (temp rol );
end if;
Output <= temp;
end process P2;
end architecture;
--------------------------------------------------------------------------------------------------
仿真波形:
从仿真波形中,可以验证例程的正确性。
第二个代码的思路是先对系统时钟分频,产生1s信号,然后对该1s信号进行模8计数,再利用case-when语句进行判断,进而控制LED。
例程二:
--------------------------------------------------------------------------------------------------
library IEEE;
use IEEE.std_logic_1164.all;--该库定义了std_logic(8值)和std_ulogic(9值)多值逻辑结构
--------------------------------------------------------------------------------------------------
entity LEDWATER is
port (
Clk : in STD_LOGIC; --创建时钟端口,连接开发板PIN23
Rst : in STD_LOGIC; --创建复位端口,连接开发板PIN116
Output : out STD_LOGIC_VECTOR( downto ) --创建输出端口,连接开发板PIN142-PIN133
);
end LEDWATER;
--------------------------------------------------------------------------------------------------
architecture BEHAVIOR_LEDWATER of LEDWATER is
signal Clk1 : STD_LOGIC; --建立中间时钟信号
begin
P1: process(Clk) --进程1,对时钟信号进行N分频
variable count : INTEGER range to := ;--变量初始值不可综合,在仿真中使用
variable count1: STD_LOGIC := '';
begin
if(Rst = '') then
count := ;
elsif(Clk'event and Clk = '') then
count := count + ;
if(count = ) then
count := ;
count1:= not count1;
end if;
Clk1 <= count1;
end if;
end process;
P2: process(Clk1) --进程2,对分频信号进行计数,进而控制LED亮灭
variable count2 : INTEGER range to := ;--变量初始值不可综合,在仿真中使用
begin
if(Clk1'event and Clk1 = '') then
count2 := count2 + ;
if(count2 = ) then
count2 := ;
end if;
end if;
case count2 is
when => Output <= "";
when => Output <= "";
when => Output <= "";
when => Output <= "";
when => Output <= "";
when => Output <= "";
when => Output <= "";
when => Output <= "";
when others => Output <= (others => 'Z');
end case;
end process;
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
3. 戏说VHDL之入门游戏一:流水灯的更多相关文章
- Unity3D 入门 游戏开发 Unity3D portal game development
Unity3D 入门 游戏开发 Unity3D portal game development 作者:韩梦飞沙 Author:han_meng_fei_sha 邮箱:313134555@qq.com ...
- 神经网络入门游戏推荐BugBrain
今天看到一款神经网络入门游戏.BugBrain.在游戏中,你能够通过连接神经元.设置神经元阈值等建造虫子的大脑,让瓢虫.蠕虫.蚂蚁等完毕各种任务.下载下来玩了玩,难度真不是入门级的= =! 真心佩服作 ...
- NIOS ii 流水灯
为了做项目的前期验证工作,实验室购买了某开发板,下面是基于该板子的实现过程.作为笔记记录,供入门者参考. 1:创建一个Quartus II的工程 next选择器件,然后finish.我的器件是cycl ...
- STM32学习笔记(二) 基于STM32-GPIO的流水灯实现
学会了如何新建一个工程模板,下面就要开始动手实践了.像c/c++中经典的入门代码"hello world"一样,流水灯作为最简单的硬件设备在单片机领域也是入门首推.如果你已经有了一 ...
- 第一个FPGA工程—LED流水灯
这一章我们来实现第一个FPGA工程-LED流水灯.我们将通过流水灯例程向大家介绍一次完整的FPGA开发流程,从新建工程,代码设计,综合实现,管脚约束,下载FPGA程序.掌握本章内容,大家就算正式的开始 ...
- S5PV210_流水灯
1.整体思路:把相应的配置数据写入相应的寄存器,控制GPIO电平(Led.s)——运用工程管理Makefile编译.链接文件(由Led.s编译得到led.bin,该文件用于USB启动方式点亮LED,若 ...
- 嵌入式Linux学习入门:控制LED灯
记录自己linux学习过程,让自己能够一直坚持下去 1.原理图分析: nLED_1, nLED_2, nLED_4, 给低电平则对应LED灯亮,高电平则对应LED灯灭, S3C2440芯片GPF4-G ...
- (一)GPIO 编程实验 LED 流水灯控制
7个寄存器 是R1-R16.(当然,里面有很多是分几个模式的,所以总共有37个)类似于单片机的R0-R7. GPXCON,GPXDAT等等是另外的寄存器,应该叫,特殊功能寄存器,类似于单片机的P0,P ...
- [51单片机] EEPROM 24c02 [I2C代码封装-保存实现流水灯]
这里把EEPROM 24c02封装起来,今后可以直接调用,其连线方式为:SDA-P2.1;SCL-P2.0;WP-VCC >_<:i2c.c /*--------------------- ...
随机推荐
- SVN与TortoiseSVN实战:TortoiseSVN新建及合并分支
硬广:<SVN与TortoiseSVN实战>系列已经写了两篇,第一篇<SVN与TortoiseSVN实战:从入门到精通>,关于分支和标签的知识介绍可翻阅第二篇<SVN与T ...
- python jinjia2模板使用
https://gist.github.com/wrunk/1317933 #!/usr/bin/env python # -*- coding: utf-8 -*- from jinja2 impo ...
- CSS常用的属性命名
页头:header 如:#header{属性:属性值;}或.header{属性:属性值;},也许你需要了解class与id区别及用法 登录条:loginBar 标志:logo ...
- jQuery 遍历 - map() 方法
定义和用法 map() 把每个元素通过函数传递到当前匹配集合中,生成包含返回值的新的 jQuery 对象. 例子1: 构建表单中所有值的列表: <p><b>value为: &l ...
- VS2013 试用版到期 解决办法
摘自:http://jingyan.baidu.com/article/fec7a1e5100b481190b4e7d9.html 输入密钥:BWG7X-J98B3-W34RT-33B3R-JVYW9
- Recover damage pictures to see the crime scene
Few people know that when you take photos there is also a thumbnail embeded inside the file, even so ...
- JS常用小技巧
iframe子窗口调用父窗口方法 parent.functionName(); 二.iframe 父窗口和子窗口相互的调用方法 1.IE中使用方法: 父窗口调用子窗口:iframe_ID.iframe ...
- Longest Common Prefix [LeetCode 14]
1- 问题描述 Write a function to find the longest common prefix string amongst an array of strings. 2- 思路 ...
- 在C#中对Datatable排序【DefaultView的Sort方法】
在C#中对Datatable排序,[DefaultView的Sort方法] 代码如下: DataTable dt = new DataTable(); dt.Columns.Add("ID& ...
- C#局域网桌面共享软件制作(三)
到周末了,继续做这个桌面共享软件,下面是前两篇的链接, 链接 C#局域网桌面共享软件制作(一) 链接 C#局域网桌面共享软件制作(二) 通过对图片进行压缩以后,每张图片大小38K左右(win7/102 ...