88 点阵汉字滚动显示Word文档下载推荐.docx
- 文档编号:19736480
- 上传时间:2023-01-09
- 格式:DOCX
- 页数:12
- 大小:235.37KB
88 点阵汉字滚动显示Word文档下载推荐.docx
《88 点阵汉字滚动显示Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《88 点阵汉字滚动显示Word文档下载推荐.docx(12页珍藏版)》请在冰豆网上搜索。
(1)在8*8LED发光二极管点阵上由右至左的方向滚动显示多个汉字
(2)使用FPGA芯片实现硬件设计,并提供后置配置方案
(3)建立描述滚动显示多汉字信息原理的数学模型。
输出预定义“北华电子”
设计原理
LED点阵原理
以下为8×
8点阵LED外观及引脚图及其等效电路,只要其对应的X、Y轴顺向偏压,即可使LED发亮。
例如如果想使左上角LED点亮,则Y0=1,X0=0即可。
应用时限流电阻可以放在X轴或Y轴。
点阵LED扫描法介绍
点阵LED一般采用扫描式显示,实际运用分为三种方式:
(1)点扫描
(2)行扫描
(3)列扫描
若使用第一种方式,其扫描频率必须大于16×
64=1024Hz,周期小于1ms即可。
若使用第二和第三种方式,则频率必须大于16×
8=128Hz,周期小于7.8ms即可符合视觉暂留要求。
此外一次驱动一列或一行(8颗LED)时需外加驱动电路提高电流,否则LED亮度会不足。
8×
8扫描LED点阵的工作原理同8位扫描数码管类似。
它有8个共阴极输出端口,每个共阴极对应有8个LED显示灯,所以其扫描译码地址需3位信号线(SEL0-SEL2),其汉字扫描码由16位段地址(0-8)输入。
通过时钟的每列扫描显示完整汉字。
设计方案
方案一
8扫描LED点阵只要其对应的X、Y轴顺向偏压,即可使LED发亮。
它有8个共阴极输出端口,每个共阴极对应有8个LED显示灯。
本实验就是要通过芯片产生读时序,将字形从寄存器中读出,然后产生写时序,写入8×
8的点阵,使其扫描显示输出。
为了显示整个汉字,首先分布好汉字的排列,以列给出汉字信息(从8个Y轴线输入字模信息);
然后以128HZ的时序逐个点亮每一行(行扫描),即每行逐一加高电平,根据人眼的视觉残留特性,使之形成整个汉字的显示。
LED点阵每个点都有一个红色的发光二极管。
点阵内的二极管间的连接都是行共阳,列共阴(要点亮的二极管给出低电平字模信息)。
本实验采用共阴,当二极管的共阳极为高电平,共阴极为低电平时,所接点发光;
反之处于截止状态,不放光。
本实验采取行扫描方式,用列给文字信息,利用周期为1s的脉冲来控制所显示的字。
汉字的存储
用动态分时扫描技术使LED点阵模块显示图像,需要进行两步工作。
第一步是获得数据并保存,即在存贮器中建立汉字数据库。
第二步是在扫描模块的控制下,配合行扫描的次序正确地输出这些数据。
获得图像数据的步骤是,先将要显示的每一幅图像分成8×
8共64个小方格的矩形框中,再在有笔划下落处的小方格里填上“1”,无笔划处填上“0”,这样就形成了与这个汉字所对应的二进制数据在该矩形框上的分布,再将此分布关系以32×
16的数据结构组成64个字节的数据,并保存在只读存贮器ROM中。
以这种方式将若干个汉字的数据贮存在存贮器内,就完成了图像数据库的建立工作。
汉字显示
汉字显示使用的是8×
8的点阵,EDA实验箱上有其接口电路,列选信号为SEL0,SEL1,SEL2经4线8线译码器输出8列,从左起为第一列,列选信号是由一个3位向量SEL[2..0]控制;
行选信号为H0~H7,是由8个行信号组成的,每一行由一个单独的位来控制,高电平有效。
例如“0000”表示第0列,“00000001”表示第一行的点亮。
由于列是由一个向量决定,而每一时刻的值只能有一个固定的值,因而只能使某一列的若干个点亮,因此就决定了只能用逐列扫描的方法。
例如要使第一列的2,4,6,8,行亮,则列为“001”、行为“10101010”就可以实现了。
下面是各个部分的程序设计
列循环扫描
通过对每一列的扫描来完成对字母的现实,只要扫描的频率足够快,就能给人以连续的感觉。
因此要控制扫描的频率,不能太低,否则,就会造成视觉上的不连续,本设计的扫描频率不得低于50Hz,扫描程序如下:
Libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
Entitydz_xsis
Port(enable,clk:
instd_logic;
--端口定义输入信号
Sel:
outstd_logic_vector(2downto0));
--端口定义输出信号
Enddz_xs;
Architecturecountofdz_xsis
Signallie:
std_logic_vector(2downto0);
Begin
Process(clk,enable)--脉冲、使能信号
begin
Ifclk'
eventandclk='
1'
then
Ifenable='
then
Iflie>
"
000"
Lie<
=lie-"
001"
;
Else
="
111"
Endif;
Endif;
Sel<
=lie;
Endprocess;
字符样式设计
本环节是建立一个数据库,使之能在扫描的同时读取所需要的信息,从而完成汉字的显示。
本次设计“北、华”汉字样式设计(仅取前二字)程序如下:
--端口定义输入信号
h0,h8:
outstd_logic_vector(7downto0));
--端口定义输出信号(h0-列数据输出,h8-代表行数据输出)
std_logic_vector(3downto0);
--信号标志
Signalpast1:
std_logic_vector(1downto0);
Process(enable,clk)--脉冲、使能信号
Caselieis
When"
00"
=>
Caselieis--“北”字设计
h0<
00001000"
h8<
00010100"
10000100"
010"
01000110"
01111110"
011"
01100000"
00000000"
100"
00000001"
101"
00100000"
01010000"
110"
Endcase;
01"
Caselieis--“华”字设计
When"
00010000"
00100011"
00100010"
00011110"
11110001"
00011111"
00111111"
00011010"
00011100"
Endcase;
Whenothers=>
Endif;
为使字母不断地循环显示,并且使每个字母之间有停顿,就需要在中间加一定的延时和循环环节。
在这一环节中,可以通过修改其数值来控制每个字母的显示时间。
其程序如下:
process(clk)
variableint:
integerrange0to10000;
ifclk’eventandclk=’1’then
ifint<
10000then
int:
=int+1;
else
int:
=0;
ifnext1=”11”then
next1<
=”00”;
else
=next1+’1’;
endif;
endif;
endprocess;
方案一总结:
可能由于所学知识有限,基于模块化的方案一在仿真时没有成功,检查源程序也没发现问题,不得已采用了方案二。
方案二:
方案二没有采取模块化思想,而是每一次行扫描都需要整个的汉字信息,所以程序看起来比较冗繁。
源程序:
(用于汉字信息实在太多,所以这儿省略了中间的汉字信息)
libraryieee;
useieee.std_logic_arith.all;
entityled_dianzhengis
port(clk_1khz,clk_1hz:
red:
outstd_logic_vector(2downto0);
--定义列共阳红色输出控制端口red[7..0]
com:
--定义行共阴输出控制端口com[7..0]
endled_dianzheng;
architecturebehaveofled_dianzhengis
signalst1,st2:
std_logic_vector(7downto0):
11111110"
--定义信号st1,st2
--signalosc:
std_logic;
--定义信号osc
signalosd:
--定义信号osd
signalclk:
signaldata:
std_logic_vector(7downto0);
--定义信号data
signald0,d1,d2,d3,d4,d5,d6,d7:
signalcont:
std_logic_vector(4downto0);
SIGNALQ,cnt8:
begincom<
=data;
--把信号data赋值给行共阴输出控制端口com[7..0]
red<
=cnt8;
--把信号st1赋值给列共阳红色输出控制端口red[7..0]
------------------------
FenPin:
process(clk_1khz)
ifclk_1khz'
EVENTANDclk_1khz='
ifQ="
thenQ<
=(OTHERS=>
'
0'
);
ELSEQ<
=Q+'
endif;
endprocessFenPin;
clk<
=Q(0);
-----------------
osd<
=clk_1hz;
--------------------------
third:
process(osd)
begin
if(osd='
andosd'
event)then
ifcont="
11110"
then
cont<
00000"
elsecont<
=cont+'
endprocessthird;
-------------------------------
P1:
process(clk)
if(clk'
)then
casecnt8is
when"
data<
=d0;
data<
=d1;
=>
=d2;
=d3;
=d4;
=d5;
=d6;
=d7;
whenothers=>
null;
endcase;
endif;
endprocessP1;
-----------------------------------
P2:
ifclk'
eventandclk='
thencnt8<
=cnt8+1;
endprocessP2;
----------------------------
process(cont)
ifcont="
d0<
="
---------北0
d1<
---------北1
d2<
---------北2
d3<
---------北3
d4<
---------北4
d5<
---------北5
d6<
---------北6
d7<
---------北7
。
elsifcont="
11011"
00001001"
---------子0
---------子1
01001001"
---------子2
11111001"
---------子3
00001101"
---------子4
00001011"
---------子5
---------子6
---------子7
endbehave;
程序电路图:
仿真波形图:
方案二总结:
由于方案二相比较方案一来说在结构上要简单些,所以在小组成员的共同努力下,方案二顺利完成,最终成功滚动显示汉字:
北华电子。
开发环境介绍
QuartusII是Altera公司的综合性PLD开发软件,支持原理图、VHDL、Veril-ogHDL以及AHDL(AlteraHardwareDescriptionLanguage)等多种设计输入形式,内嵌自有的综合器以及仿真器,可以完成从设计输入到硬件配置的完整PLD设计流程。
QuartusII支持Altera的IP核,包含了LPM/MegaFunction宏功能模块库,使用户可以充分利用成熟的模块,简化了设计的复杂性、加快了设计速度。
对第三方EDA工具的良好支持也使用户可以在设计流程的各个阶段使用熟悉的第三方EDA工具。
此外,QuartusII通过和DSPBuilder工具与Matlab/Simulink相结合,可以方便地实现各种DSP应用系统;
支持Altera的片上可编程系统(SOPC)开发,集系统级设计、嵌入式软件开发、可编程逻辑设计于一体,是一种综合性的开发平台。
实习总结:
通过这一周的实习,让我在实践中学到了很多东西,也发现了很多问题。
让我认识到,有时候光靠书上的知识是远远不够的,很多时候还要考我们自己慢慢的去摸索。
在这个过程中让我意识到,善于借助身边的资源的重要性,比如:
有这方面知识的同学或者是上网去看看别人的实践过程,从别人的亲身经历获得的经验来帮助自己,这样能让自己少走一些弯路。
同时,也要感谢赵玉刚老师给我们提供了这么好的一次实践锻炼的机会,让我们从实践中获得了相关的知识,我相信这对我们以后的发展有很大的帮助。
总的来说,这次设计的8×
8点阵显示控制还是比较成功的,在设计中遇到了很多问题,最后在老师的辛勤的指导下,终于解决问题,有点小小的成就感,终于觉得平时所学的知识有了实用的价值,达到了理论与实际相结合的目的,不仅学到了不少知识,而且锻炼了自己的能力,使自己对以后的路有了更加清楚的认识,同时,对未来有了更多的信心。
最后,对给过我帮助的所有同学和指导老师再次表示忠心的感谢
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 88 点阵汉字滚动显示 点阵 汉字 滚动 显示