实验二 流水灯
1. 实验目的
通过本实验让学生进一步了解、熟悉和掌握CPLD/FPGA开发软件的使用方法及VHDL语言的编程方法;学习简单的时序电路的设计和硬件测试。
2. 实验内容
本实验的内容是控制实验箱上的发光二极管LED1—LED8,使之实现流水灯显示。 3. 实验原理
在LED1~LED8引脚上周期性地输出流水数据,即输出的数据依次为11111111、11111110、11111100、11111000、11110000、11100000、11000000、10000000、00000000,如此循环显示,输出数据“0”,表示点亮相应的LED小灯。为了方便观察,流水的速率控制在2Hz左右。在核心板上有一个48MHz的标准时钟源,该时钟源与芯片EP2C5的23脚相连。为了产生2Hz的时钟源,在此调用了分频模块int_div。
4. 实验步骤
(1) 启动Quartus II,建立一个空白工程,然后命名为led_waterflow.qpf。
(2) 新建ledwater.vhd源程序文件,源代码如下。然后进行综合编译。若在编译过程中发现错误,则找出并更正错误,直到编译成功为止。生产符号文件ledwater.bsf (File→ Create/_Update → Create Symbol Files for Current File)。 流水灯程序参考
LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; USE IEEE.STD_LOGIC_Arith.ALL; USE IEEE.STD_LOGIC_Unsigned.ALL; ENTITY ledwater IS PORT(
clk: IN STD_LOGIC;
led: OUT STD_LOGIC_VECTOR(7 DOWNTO 0) );END;
ARCHITECTURE one
SIGNAL BEGIN
led<=led_r(7 DOWNTO 0); PROCESS(clk) BEGIN
IF clk’event and clk=’1’ THEN
led_r<=led_r(7 DOWNTO 0) & '0';
IF led_r=\ --循环完毕吗?
led_r<=\ --是,则重新赋初值
END IF;
OF ledwater
IS
led_r:STD_LOGIC_VECTOR(8 DOWNTO 0);
END IF; END PROCESS;
END;
(3) 将实验模块库里的int_div.vhd和int_div.bsf拷贝到工程目录下。
1
(4) 新建图形文件,命名为led_waterflow.bdf并保存。在空白处双击鼠标,打开symbol对话框,在symbol对话框的左上角的libraies中,分别将project下的ledwater和int_div模块放在图形文件led_waterflow.bdf中,加入输入input、输出output引脚,双击各引脚符号,进行引脚命名。完整的顶层模块原理图如下图1所示。双击int_div中的参数框,并修改参数,如下图2所示。将F_DIV的值改为24000000,F_DIV_WIDTH的值改为25,单击“确定”按钮保存修改的参数。
图 流水灯顶层模块
图 参数修改对话框
如果在led_waterflow.bdf上不能看到参数设置框,在空白出右击鼠标,选择Show Parameter Assignments命令来显示参数设置框。
(5) 将实验模块选择目标器件并对相应的引脚进行锁定,这里选择的器件为Altera公司的Cyclone II系列的EP2C5Q208C8,或者Cyclone I系列的EP1C12Q240C8。引脚锁定方法如下表所列。
(6) 将led_waterflow.bdf设置成顶层实体Project→ Set as Top-level Entity。对该工程文件进行全程编译处理,若在编译过程中发现错误,则找出并更正错误,直至编译成功为止。
(7) 把JP20的led0~led7的跳帽插上,使发光二极管有效。下载程序到芯片上,观察流
2
水灯的变化。更改分频模块的分频系数,并重新编译下载,观察流水灯的变化。
表 引脚锁定方法 信号 EP2C5 Led[0] Led[1] Led[2] Led[3] Led[4] 116 110 114 107 112 引脚 EP1C12 128 127 126 125 124 Led[5] Led[6] Led[7] clock 信号 EP2C5 105 63 106 23 引脚 EP1C12 123 122 121 153
3
实验三 读取按键信号
1. 实验目的
通过本实验让学生进一步了解、熟悉和掌握CPLD/FPGA开发软件的使用方法及VHDL语言的编程方法;并熟悉VHDL文件为顶层模块的设计;学习和体会分支条件语句case的使用方法及FPGA I/O口的输出控制。
2. 实验内容
实验箱上有8个发光二极管LED1~LED8和8个按键KEY1~KEY8。本实验的内容是用这8个按键分别控制8个发光二极管,一旦有键按下,则点亮相应的发光二极管。
3. 实验原理
FPGA的所有I/O控制块允许每个I/O引脚单独配置为输入口,不过这种配置是系统自动完成的。当该I/O口被设置为输入口使用时(如定义key1为输入引脚:input),该I/O控制块将直接使三态缓冲的控制端接地,使得该I/O引脚对外呈高阻态,这样该I/O引脚即可用作专用输入引脚。正确分配并锁定引脚后,一旦在KEY1~KEY8中有键输入,即可在检测到键盘输入的情况下,继续判断其键盘并作出相应的处理。
4. 实验步骤
(1) 启动Quartus II,建立一个空白工程,然后命名为key_led.qpf。
(2) 新建key_led.vhd源程序文件,源代码如下。然后进行综合编译。若在编译过程中发现错误,则找出并更正错误,直到编译成功为止。 程序参考
LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; USE IEEE.STD_LOGIC_Arith.ALL; USE IEEE.STD_LOGIC_Unsigned.ALL; ENTITY keyled
PORT(
key: led: );END;
ARCHITECTURE one OF keyled IS
SIGNAL led_r: STD_LOGIC_VECTOR(7 DOWNTO 0); SIGNAL buffer_r:STD_LOGIC_VECTOR(7 DOWNTO 0); BEGIN led<=led_r;
PROCESS(key,buffer_r) BEGIN
buffer_r<=key; CASE buffer_r IS
WHEN \led_r<=\ WHEN \led_r<=\ WHEN \led_r<=\ WHEN \led_r<=\ WHEN \led_r<=\ WHEN \led_r<=\
4
IN
STD_LOGIC_VECTOR(7 DOWNTO 0); OUT STD_LOGIC_VECTOR(7 DOWNTO 0)
IS
WHEN \led_r<=\ WHEN \led_r<=\ WHEN
OTHERS=>
led_r<=\
END CASE; END PROCESS;
END;
(3) 选择目标器件并对相应的引脚进行锁定,这里选择的器件为Altera公司的Cyclone II系列的EP2C5Q208C8,或者Cyclone I系列的EP1C12Q240C8。引脚锁定方法如下表所列。
表引脚锁定方法
信号 Led[0] Led[1] Led[2] Led[3] Led[4] Led[5] Led[6] Led[7] 引脚 EP2C5 116 110 114 107 112 105 63 106 EP1C12 信号 Key[0] Key[1] Key[2] Key[3] Key[4] Key[5] Key[6] Key[7] 引脚 EP2C5 56 59 57 61 58 64 60 68 EP1C12
(4) 对该工程文件进行全程编译处理,若在编译过程中发现错误,则找出并更正错误,直至编译成功为止。
(5) JP6是一个3针的插座,如果把短接帽接到下面,使下面两个插针短接,则按键有效;如果把短接帽接到上面,使上面两个插针短接,则矩阵键盘有效。本实验令按键有效,把短接帽接到下面。把JP20的led0~led7的跳帽插上,使发光二极管有效。下载程序到芯片上,按下KEY1~KEY8的任何一键,观察发光二极管LED1~LED8的亮灭状态。
5