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 /*--------------------- ...
随机推荐
- Leetcode001 two sum
/* c++ STL is much nore than what i think before in these aspects: * initializer for node element in ...
- SVN 忽略获取和提交obj、bin文件夹
一.全局设置的方式(貌似不行) SVN忽略文件夹刚开始用的是这种方式: Settings => Subversion里的Global ignore pattern增加这两项*/bin */obj ...
- 【Linux】自动化部署可信任登录
Linux信任登录,免密码登录的脚本: 需要安装expect,可以yum也可以编译安装,编译后注意脚本中的expect路径. rsa.exp #!/usr/bin/expect ########### ...
- Question2Answer初体验
Question2Answer初体验 高质量的问答社区十分有价值,很多无法解决的问题能通过问答社区找到解决办法,而对于站长来说,垂直的问答社区也很有潜力.最近盯上问答这一块,发现和我的一些思路很符 ...
- myeclipse上SVN代码合并详细步骤图解
1. 在装有svn插件的myeclipse中,在主干上选择需要合并的文件或文件夹 右击 -> 合并(merge) 2. 选择合并类型--合并两个不同的树 Merge -> Next 3. ...
- Android IOS WebRTC 音视频开发总结(十八)-- 手机适配
本文主要介绍上次碰到的某些机器上看不到视频的问题,文章来自博客园RTC.Blacker,转载请说明出处. 之前做的视频聊天App一直运行良好,前几天客户反馈说在三星9100. Android4.0.3 ...
- JSON-JQuery常用技巧
1:Jquery对象选择查找 var group = $(".classeslist li"); class 为 classeslist 内部 的所有 li 元素对象 遍历: fo ...
- ★★★.NET 在meta标签中使用表达式设置页面的关键字
在aspx文件中 给meta标签的属性复制是不能直接使用 表达式的 错误的写法: <meta name="keywords" content="<%=news ...
- House of hello恶搞包之真假辨别
第一次在我这边购买的客户都会问我:“是否保证正品?”确实,现在市面上Hoh的假货非常多,不过我想说的是,作为一位House of hello恶搞包的代理,我觉得买假货是非常可耻的,而且Abby自己也是 ...
- Nginx下10个安全问题提示
Nginx是当今最流行的Web服务器之一.它为世界上7%的web流量提供服务而且正在以惊人的速度增长.它是个让人惊奇的服务器,我愿意部署它 下面是一个常见安全陷阱和解决方案的列表,它可以辅助来确保你的 ...