一.   流水灯

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之入门游戏一:流水灯的更多相关文章

  1. Unity3D 入门 游戏开发 Unity3D portal game development

    Unity3D 入门 游戏开发 Unity3D portal game development 作者:韩梦飞沙 Author:han_meng_fei_sha 邮箱:313134555@qq.com ...

  2. 神经网络入门游戏推荐BugBrain

    今天看到一款神经网络入门游戏.BugBrain.在游戏中,你能够通过连接神经元.设置神经元阈值等建造虫子的大脑,让瓢虫.蠕虫.蚂蚁等完毕各种任务.下载下来玩了玩,难度真不是入门级的= =! 真心佩服作 ...

  3. NIOS ii 流水灯

    为了做项目的前期验证工作,实验室购买了某开发板,下面是基于该板子的实现过程.作为笔记记录,供入门者参考. 1:创建一个Quartus II的工程 next选择器件,然后finish.我的器件是cycl ...

  4. STM32学习笔记(二) 基于STM32-GPIO的流水灯实现

    学会了如何新建一个工程模板,下面就要开始动手实践了.像c/c++中经典的入门代码"hello world"一样,流水灯作为最简单的硬件设备在单片机领域也是入门首推.如果你已经有了一 ...

  5. 第一个FPGA工程—LED流水灯

    这一章我们来实现第一个FPGA工程-LED流水灯.我们将通过流水灯例程向大家介绍一次完整的FPGA开发流程,从新建工程,代码设计,综合实现,管脚约束,下载FPGA程序.掌握本章内容,大家就算正式的开始 ...

  6. S5PV210_流水灯

    1.整体思路:把相应的配置数据写入相应的寄存器,控制GPIO电平(Led.s)——运用工程管理Makefile编译.链接文件(由Led.s编译得到led.bin,该文件用于USB启动方式点亮LED,若 ...

  7. 嵌入式Linux学习入门:控制LED灯

    记录自己linux学习过程,让自己能够一直坚持下去 1.原理图分析: nLED_1, nLED_2, nLED_4, 给低电平则对应LED灯亮,高电平则对应LED灯灭, S3C2440芯片GPF4-G ...

  8. (一)GPIO 编程实验 LED 流水灯控制

    7个寄存器 是R1-R16.(当然,里面有很多是分几个模式的,所以总共有37个)类似于单片机的R0-R7. GPXCON,GPXDAT等等是另外的寄存器,应该叫,特殊功能寄存器,类似于单片机的P0,P ...

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

    这里把EEPROM 24c02封装起来,今后可以直接调用,其连线方式为:SDA-P2.1;SCL-P2.0;WP-VCC >_<:i2c.c /*--------------------- ...

随机推荐

  1. gerrit 调试smtp email

  2. 转载 《AngularJS》5个实例详解Directive(指令)机制

    <AngularJS>5个实例详解Directive(指令)机制 大漠穷秋 本文整理并扩展了<AngularJS>这本书第六章里面的内容,此书近期即将由电子工业出版社出版,敬请 ...

  3. .net框架版本说明

    .NET框架 1.0..NET框架 1.1..NET框架 2.0..NET框架 3.0..NET框架 3.5..NET框架 4.00 .netframework3.0Windows Presentat ...

  4. 【c实现,vc6调试通过】给出一字符串指针,计算出字符串指针中单词数

    #include <stdio.h> /* 给出一字符串指针,计算出字符串指针中单词数, 单词不包括'.',',',';','?','_','"',由0-9数字或26个字母组成 ...

  5. LDAP介绍

    摘自: http://www.blogjava.net/allen-zhe/archive/2007/03/19/104740.html LDAP介绍 原文:http://ldapman.org/ar ...

  6. CSS优先级算法是如何计算?

    CSS的specificity特性或非凡性,它是一个衡量css优先级的一个标准, 既然的标准就有判定规定和计算方式,specificity用一个四位数来表示, 更像四级从左到右,左的最大级,一级大于一 ...

  7. MYSQL的存储引擎一般只要哪些?

    根据个人个人见解: MySQL的存储引擎(构成.安全.锁) Myisam:数据操作快速的一种引擎,支持全文检索.文件保存在数据库名称为目录名的 目录中,有3个文件,分别是表定义文件(.frm).数据文 ...

  8. WordPress默认栏目设置

    WordPress是一个注重美学.易用性和网络标准的个人信息发布平台,是全球使用最多的博客系统,只需要在系统后台做一些简单的设计,基本就能实现我们日常个性化发布个人信息的需求,而博客后台的使用其实很简 ...

  9. 如何让dapper支持oracle游标呢?

    Dapper是一个轻型的ORM类.它有啥优点.缺点相信很多朋友都知道了,园里也有很多朋友都有相关介绍,这里就不多废话. 如果玩过Oracle都知道,存储过程基本都是通过游标返回数据的,但是dapper ...

  10. ASP.NET中前台调用后台的方法

    学习文章:http://www.cnblogs.com/kingteach/archive/2010/11/12/1875633.html 练习代码: 前台: <html xmlns=" ...