实验六LED点阵实验.docx

上传人:b****5 文档编号:5068064 上传时间:2022-12-13 格式:DOCX 页数:14 大小:365.84KB
下载 相关 举报
实验六LED点阵实验.docx_第1页
第1页 / 共14页
实验六LED点阵实验.docx_第2页
第2页 / 共14页
实验六LED点阵实验.docx_第3页
第3页 / 共14页
实验六LED点阵实验.docx_第4页
第4页 / 共14页
实验六LED点阵实验.docx_第5页
第5页 / 共14页
点击查看更多>>
下载资源
资源描述

实验六LED点阵实验.docx

《实验六LED点阵实验.docx》由会员分享,可在线阅读,更多相关《实验六LED点阵实验.docx(14页珍藏版)》请在冰豆网上搜索。

实验六LED点阵实验.docx

实验六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并将它运用到点阵中去,学会了利用扫描的方法让点阵滚动显示所需的汉字,列选的时间和字与字之间的时间间隔要控制好才能编出显示效果非常好的图形字符。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 军事

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1