实验六LED点阵实验.docx
- 文档编号:5068064
- 上传时间:2022-12-13
- 格式:DOCX
- 页数:14
- 大小:365.84KB
实验六LED点阵实验.docx
《实验六LED点阵实验.docx》由会员分享,可在线阅读,更多相关《实验六LED点阵实验.docx(14页珍藏版)》请在冰豆网上搜索。
实验六LED点阵实验
南昌大学实验报告
学生姓名:
学号:
6100210173专业班级:
中兴101班
实验类型:
□验证□综合■设计□创新实验日期:
2012
实验六LED点阵实验
一、实验目的
利用EDA技术实现16×16LED点阵屏的的扫描和动态显示。
二、实验要求
能利用16×16LED点阵显示自己所设计的汉字。
(我设计的汉字是“中兴班”)
三、实验原理
首先对LED屏的显示方式给出方案论证。
(1)方案的提出
方案一:
静态显示。
所谓静态显示就是对LED电子显示屏中每一象素点都通过硬件单独控制,整个LED电子显示屏的显示实际上就是所有LED的同时显示。
方案二:
采用动态扫描法并行输出数据。
所谓动态扫描法实际上是利用人眼的视觉暂留现象而实现的一种显示方法。
(2)方案的比较
方案一的优点在于编程简单且硬件保证无闪烁。
缺点:
硬件利用率低,造成硬件成本较高。
例如一个16*16的LED显示屏,如用8位锁存器,需32个,此外还有32个锁存器口地址所需的译码电路以及LED驱动电路。
显然,这种硬件开销是不能接受的。
方案二采用动态扫描来实现LED电子显示屏的显示过程,软件操作实现简便。
本实验采用了采用动态扫描法并行输出数据的显示方法。
LED点阵的列为扫描选通信号、行为数据输入。
显示采用逐行扫描方式,数据端不断输入数据,列扫描按一定顺序逐行选通,扫描一个周期(16次)产生一帧画面。
图5.1以4×4共阴LED阵列为例,给出了LED阵列的组合方式,列选通高有效,数据低有效;数据端输入数据,选通列根据相应数据亮灯,接着送入第二列数据,选通第二列,依次完成一屏的扫描。
图2.6.1LED阵列结构
四、定制ROM的方法
1、建立.mif格式文件:
首先在QuartusFile菜单中选择NEW,在NEW窗中选择MemoryInitializationFile项,单击OK产生ROM数据文件大小选择窗口。
这里选ROM的数据数Number为48,,数据宽Wordsize取16位。
如图所示,将“中兴班”对应数码输入其中即可,如图所示:
保存为adf.mif
2、定制LPM_ROM元件。
在Tools中选择MegaWizardPlug-InManager产生如图界面,选择Createanewcustom项,如图所示
单击next后,选择VHDL CycloneII ROM1-Port如图所示
选择ROM控制线、地址线和数据线,如图所示address[5..0],q[15..0].
接下来按下面步骤操作
单击next出现如下图的对话框,在Filename中输入刚才建立的.mif文件,在Allow…前打勾,并在下面输入ROM1单击next即可
按图单击next
如下图,单击finish即完成了ROM的定制。
打开其生成的VHDL语言文件,编译后生成如下图的模块后即可调用了。
五、实验程序
实验总图:
分频程序:
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_arith.all;
useieee.std_logic_unsigned.all;
--------------------------------------------------------------------
entityfenpinis
port(clkin:
instd_logic;--20M时钟输入
clk1:
outstd_logic
);
endfenpin;
--------------------------------------------------------------------
architecturebehaveoffenpinis
signalclk:
std_logic:
='0';
begin
process(clkin)
variablecount:
integerrange0to12010:
=0;
begin
ifclkin'eventandclkin='1'then
count:
=count+1;
if(count=12000)then
clk<=notclk;--进行24000分频,产生方波
count:
=0;
endif;
endif;
clk1<=clk;
endprocess;
endarchitecturebehave;
列选模块程序
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_arith.all;
useieee.std_logic_unsigned.all;
--------------------------------------------------------------------
entityheis
port(clk1:
instd_logic;--时钟输入
keyc:
outstd_logic_vector(15downto0);--点阵列控制
address:
outstd_logic_vector(5downto0)--点阵行地址输出
);
endhe;
--------------------------------------------------------------------
architecturebehaveofheis
signalcdount:
std_logic_vector(3downto0);
signaldount:
std_logic_vector(9downto0);
signalS:
std_logic_vector(1downto0);
begin
process(clk1)--显示时序控制
begin
ifclk1'eventandclk1='1'then
dount<=dount+1;
ifdount=510then
ifS>1then--“中兴班”三个字循环显示的控制,分频数比列选大
S<="00";
else
S<=S+1;
endif;
endif;
ifcdount<15then--循环列选
cdount<=cdount+1;
else
cdount<="0000";
endif;
endif;
endprocess;
process(cdount,S)
begin
casecdountis
when"0000"=>keyc<="0000000000000001";--列选择
when"0001"=>keyc<="0000000000000010";
when"0010"=>keyc<="0000000000000100";
when"0011"=>keyc<="0000000000001000";
when"0100"=>keyc<="0000000000010000";
when"0101"=>keyc<="0000000000100000";
when"0110"=>keyc<="0000000001000000";
when"0111"=>keyc<="0000000010000000";
when"1000"=>keyc<="0000000100000000";
when"1001"=>keyc<="0000001000000000";
when"1010"=>keyc<="0000010000000000";
when"1011"=>keyc<="0000100000000000";
when"1100"=>keyc<="0001000000000000";
when"1101"=>keyc<="0010000000000000";
when"1110"=>keyc<="0100000000000000";
when"1111"=>keyc<="1000000000000000";
whenothers=>keyc<="0000000000000000";
endcase;
ifS="00"then
casecdountis
when"0000"=>address<="000000";--行显示中的地址
when"0001"=>address<="000001";
when"0010"=>address<="000010";
when"0011"=>address<="000011";
when"0100"=>address<="000100";
when"0101"=>address<="000101";
when"0110"=>address<="000110";
when"0111"=>address<="000111";
when"1000"=>address<="001000";
when"1001"=>address<="001001";
when"1010"=>address<="001010";
when"1011"=>address<="001011";
when"1100"=>address<="001100";
when"1101"=>address<="001101";
when"1110"=>address<="001110";
when"1111"=>address<="001111";
whenothers=>address<=null;
endcase;
elsifS="01"then
casecdountis
when"0000"=>address<="010000";--行显示显示兴的地址
when"0001"=>address<="010001";
when"0010"=>address<="010010";
when"0011"=>address<="010011";
when"0100"=>address<="010100";
when"0101"=>address<="010101";
when"0110"=>address<="010110";
when"0111"=>address<="010111";
when"1000"=>address<="011000";
when"1001"=>address<="011001";
when"1010"=>address<="011010";
when"1011"=>address<="011011";
when"1100"=>address<="011100";
when"1101"=>address<="011101";
when"1110"=>address<="011110";
when"1111"=>address<="011111";
whenothers=>address<=null;
endcase;
elsifS="10"then
casecdountis
when"0000"=>address<="100000";--行显示显示班的地址
when"0001"=>address<="100001";
when"0010"=>address<="100010";
when"0011"=>address<="100011";
when"0100"=>address<="100100";
when"0101"=>address<="100101";
when"0110"=>address<="100110";
when"0111"=>address<="100111";
when"1000"=>address<="101000";
when"1001"=>address<="101001";
when"1010"=>address<="101010";
when"1011"=>address<="101011";
when"1100"=>address<="101100";
when"1101"=>address<="101101";
when"1110"=>address<="101110";
when"1111"=>address<="101111";
whenothers=>address<=null;
endcase;
endif;
endprocess;
endarchitecturebehave;
六、波形仿真
先分析列选的仿真情况:
如图所示
结合上图,看ROM的输出:
通过与.mif文件对比发现仿真图的输出与其完全一样,所以程序仿
是可以达到实验要求的。
七、实验现象
实验现象:
LED屏上动态的显示“中兴班”三字。
然后改变ROM中数据(通过更替MIF文件),LED屏上产生了不同的动画效果。
达到了实验要求的目的。
八、实验心得
通过本次实验,最主要的收获是学会了如何去定制ROM并将它运用到点阵中去,学会了利用扫描的方法让点阵滚动显示所需的汉字,列选的时间和字与字之间的时间间隔要控制好才能编出显示效果非常好的图形字符。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 实验 LED 点阵