实验四 静态数码管显示
1. 实验目的
通过本实验让学生学习7段数码管显示译码器的设计,进一步了解、熟悉和掌握FPGA开发软件Quartus II的使用方法及VHDL语言的编程方法,学习LPM兆功能模块的调用。 2. 实验内容
实验箱上有2个4位动态共阳极数码管LEDD4和LEDD3,其中8个位码DIG0~DIG7和8位段码SEG0~SEG7分别与FPGA相应的引脚相连。这样只要DIG0~DIG7上一直输出低电平“0”,则8个数码管将显示相同的数码,这样8位动态数码管就变成了静态数码管。
本实验的内容是建立7段译码显示模块,用于控制LED数码管的静态显示。要求在试验箱上循环显示0~9和A~F 16个字符。
3. 实验原理
数码管LED显示是工程项目中使用较广的一种输出显示器件。常见的数码管有共阴和共阳两种。共阴数码管是将8个发光二极管的阴极连接在一起作为公共端,而共阳数码管是将8个发光二极管的阳极连接在一起作为公共端。公共端常称为位码,而将其它8位称为段码,分别为:a、b、c、d、e、f、g、h,其中h为小数点。对于共阳极数码管,只要公共端为高电平“1”,某个段输出为低电平“0”,则相应的段就亮。 本实验通过分频模块得到1Hz的频率信号,加载于4位计数器的时钟输入端,计数循环输出0~9和A~F 16个字符,通过7段译码模块后在数码管上显示出来。
4. 实验步骤
(1) 启动Quartus II,建立一个空白工程,然后命名为sled.qpf。
(2) 新建decl7s.vhd源程序文件,源代码如下。然后进行综合编译。若在编译过程中发现错误,则找出并更正错误,直到编译成功为止。生产符号文件decl7s.bsf (File→ Create/_Update → Create Symbol Files for Current File)。 程序参考
LIBRARY IEEE; USE USE USE PORT(
d:
IN STD_LOGIC_VECTOR(3 DOWNTO 0); --输入4位二进制码
--七段译码输出
seg: OUT STD_LOGIC_VECTOR(7 DOWNTO 0)
IEEE.STD_LOGIC_1164.ALL; IEEE.STD_LOGIC_UNSIGNED.ALL; IEEE.STD_LOGIC_ARITH.ALL;
ENTITY decl7s IS
);END;
ARCHITECTURE ONE OF decl7s IS
SIGNAL seg_r:STD_LOGIC_VECTOR(7 DOWNTO 0); --定义数码管输出寄存器 BEGIN seg<=seg_r; PROCESS(d) BEGIN
CASE d IS
WHEN WHEN WHEN
X\X\X\
seg_r<=X\显示0 seg_r<=X\显示1 seg_r<=X\显示2
6
--输出数码管译码结果
--七段译码
WHEN WHEN WHEN WHEN WHEN WHEN WHEN WHEN WHEN WHEN WHEN WHEN WHEN WHEN
X\X\X\X\X\X\X\X\X\X\X\X\X\
seg_r<=X\显示3 seg_r<=X\显示4 seg_r<=X\显示5 seg_r<=X\显示6 seg_r<=X\显示7 seg_r<=X\显示8 seg_r<=X\显示9 seg_r<=X\显示a seg_r<=X\显示b seg_r<=X\显示c seg_r<=X\显示d seg_r<=X\显示e seg_r<=X\显示f
OTHERS=> seg_r<=X\
END CASE;
END PROCESS; END;
(3) 将实验模块库里的int_div.vhd和int_div.bsf拷贝到工程目录下。 (4) 添加4位兆计数器功能模块。步骤如下:
① 在Quartus II主界面中选择Tools—Mega Wizard Plug-In Manager,打开如图所示的兆功能模块向导。选择Create a new custom megafunction variation新建一个新的兆功能模块。
图 添加兆功能模块向导对话框——Page1
② 单击Next进入向导第2页,按照如下图所示填写。选择LPM_COUNTER,设置号输出文件的类型和路径,使用Cyclone族的器件。
③ 单击Next进入向导第3页,,按照如下图所示填写。选择4位计数器。
④ 剩余步骤不需更改设置,在这里可以一步一步单击Next,或者直接单击Finish结束。注意在结束时一定要选择生成“*.bsf”符号文件。
7
图 添加兆功能模块向导对话框——Page2
图 添加兆功能模块向导对话框——Page3
8
(5) 新建图形设计文件,命名为sled.bdf并保存。文件的设计如下图所示。
图 静态LED显示顶层模块图
(6) 选择目标器件并对相应的引脚进行锁定,这里选择的器件为Altera公司的Cyclone II系列的EP2C5Q208C8,或者Cyclone I系列的EP1C12Q240C8。引脚锁定方法如下表所列。
表 引脚锁定方法
信号 EP2C5 seg[0] seg[1] seg[2] seg[3] seg[4] seg[5] seg[6] seg[7] clock 145 142 143 139 141 137 138 134 23 引脚 EP1C12 161 144 159 141 156 139 143 140 153 dig[0] dig[1] dig[2] dig[3] dig[4] dig[5] dig[6] dig[7] 信号 EP2C5 135 127 133 117 128 115 118 113 引脚 EP1C12 138 137 136 135 134 133 132 131
(7) 将sled.bdf设置成顶层实体(Project—Set as Top-level Entity)。对该工程文件进行全程编译处理,若在编译过程中发现错误,则找出并更正错误,直至编译成功为止。
(8) 下载程序到芯片上,观察数码管的显示状态。
9
实验五 动态数码管显示
1. 实验目的
学习动态扫描显示的原理及电路的设计。
2. 实验内容
本实验内容是建立数码管动态扫描显示模块。在试验箱上完成LED数码管的动态显示1~8这8个数。稳定显示后,放慢扫描速度演示动态显示的原理过程。
3. 实验原理
数码管LED显示是工程项目中使用较广的一种输出显示器件。常见的数码管共阴和共阳两种。共阴数码管是将8个发光二极管的阴极连接在一起作为公共端,而共阳数码管是将8个发光二极管的阳极连接在一起作为公共端。公共端常称为位码,而将其它8位称为段码,分别为:a、b、c、d、e、f、g、h,其中h为小数点,只要公共端为高电平“1”,某个段输出为低电平“0”,则相应的段就亮。把每个数码管的8个段都分别连接到SEG0~SEG7,8个数码管分别由8个选通信号DIG0~DIG7来选择。被选通的数码管显示,其余关闭。例如在某一时刻,DIG2为“0”,其余数码管选通信号为“1”,这是仅DIG2对应的LED数码管显示来自段码信号端的数据,而其他数码管成关闭状态。根据这种电路状态,如果希望8个数码管全都显示想要的数据,就必须使得8个选通信号DIG0~DIG7分别单独选通,同时在段输入端加上对应的数据。虽然每次只有一个LED显示,但只要扫描的速率够快,由于人眼视觉的余晖效益,我们仍会感觉所有数码管都在同时显示。
4. 实验步骤
(1) 启动Quartus II,建立一个空白工程,然后命名为dled.qpf。
(2) 新建scan_led.vhd源程序文件,源代码如下。然后进行综合编译。若在编译过程中发现错误,则找出并更正错误,直到编译成功为止。生产符号文件scan_led.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 scan_led IS PORT(
clk_1k: d:
IN IN
STD_LOGIC;
STD_LOGIC_VECTOR(31 DOWNTO 0);
--输入要显示的数据 --数码管选择输出引脚 --数码管段输出引脚
dig: OUT STD_LOGIC_VECTOR(7 DOWNTO 0); seg: OUT STD_LOGIC_VECTOR(7 DOWNTO 0) );
END ENTITY;
ARCHITECTURE one OF scan_led IS
SIGNAL seg_r: SIGNAL dig_r: SIGNAL SIGNAL BEGIN
10
count:
STD_LOGIC_VECTOR(7 DOWNTO 0); STD_LOGIC_VECTOR(7 DOWNTO 0); STD_LOGIC_VECTOR(2 DOWNTO 0);
--定义数码管输出寄存器 --定义数码管选择输出寄存器 --定义显示数据寄存器 --定义计数寄存器
disp_dat: STD_LOGIC_VECTOR(3 DOWNTO 0);