用VHDL设计LED+汉字滚动显示器毕业设计论文附程序.docx
《用VHDL设计LED+汉字滚动显示器毕业设计论文附程序.docx》由会员分享,可在线阅读,更多相关《用VHDL设计LED+汉字滚动显示器毕业设计论文附程序.docx(41页珍藏版)》请在冰豆网上搜索。
用VHDL设计LED+汉字滚动显示器毕业设计论文附程序
本科毕业设计(论文)
题目
用VHDL设计
LED汉字滚动显示器
学生姓名
任雪宾
学 号
04066230
教学院系
电子信息工程学院
专业年级
通信工程2004级
指导教师
王章瑞
职 称
副教授
单 位
电子信息工程学院
辅导教师
职称
单 位
完成日期
2008
年
6
月
日
SouthwestPetroleumUniversity
GraduationThesis
DesignaLEDChineseCharacterRolling
DisplaywithVHDL
Grade:
2004
Name:
RenXuebin
Specialty:
TelecommunicationsEngineering
Instructor:
WangZhangrui
SchoolofElectronicandInformationEngineering
2008-6
摘要
本文对基于FPGA控制的LED汉字滚动显示器的设计方法进行了探讨。
提出了两个实现方案。
并对其中一个方案作了详细说明。
文中首先介绍了LED发光二极管点阵的控制原理;然后研究了在LED发光二极管点阵上滚动显示汉字的方法;最后,用VHDL语言程序设计了一个完整的LED汉字滚动显示器。
本系统由扫描控制模块、只读存储器ROM和FPGA外面的LED点阵显示模块、一个反相器和两个4-16译码器构成。
其中:
扫描控制模块和只读存储器ROM集成在FPGA芯片内部。
两个4-16译码器(74LS154)和一个反相器配合FPGA中的列扫描控制模块共同完成了两块16×16点阵显示模块的32列的扫描控制。
FPGA定义的只读存储器ROM中保存了要显示的汉字的数据,并以16位的数据宽度输出到LED阵显示模块的行端,配合列扫描控制共同完成汉字的滚动显示。
本系统利用数字系统设计自动化(EDA)技术实现了全硬件方式的LED点阵显示。
利用FPGA内部的物理资源,将只读存储器ROM和主要功能模块设计在FPGA内部。
充分显示了EDA技术设计的灵活性,同时也大大提高了系统的集成度和稳定性。
关键词:
FPGA;LED;EDA;动态扫描
Abstract
ThisarticlediscussesthedesigningmethodofFPGAcontrolledLEDChinesecharacterrollingdisplay.Thisarticlealsoproposestwofeasibleplansandgivesadetailedexplanationtooneoftheplans.ThearticlefirstlyintroducestheLEDcontrolprinciple.ThenthearticlestudiesrolledthedemonstrationChinesecharactermethodontheLEDlightemitterdiodelattice.Finally,IdesignacompleteLEDChinesecharacterrollingdisplaywithVHDLlanguageprogram.
Thissystemiscomposedofascanningcontrolmodule,aROM,anLEDplotarraymodule,aninverterandtwodecoders,withthescanningcontrolmoduleandtheROMinstalledinsidetheFPGAchip.Thetwodecodersandtheinverterworkwiththeout-scanningcontrolmoduleintheFPGAtoexercise32-arrayscanningcontrolofthetwo16×16dot-matrixdisplaymodule.TheFPGA-definedROMpreservesthedataoftheChinesecharactersthatwillbedisplayed,anditsendsthedata,bywayofa16-bitdatawidth,totheendoftheLEDplotarraymodule.Withthearray-scanningcontroller,theChinesecharactersachievetheirrollingdisplay.
ThissystemhasrealizedtheentirehardwarewayLEDlatticedemonstrationusingthenumbersystemdesignautomation(EDA)technology.UsingFPGAinternalphysicsresources,non-erasablestorageROMandmajorfunctionmoduledesigninFPGA.IthaddemonstratedfullytheEDAtechnicaldesign'sflexibility,simultaneouslyalsogreatlyenhancedsystem'sintegrationrateandthestability.
Keywords:
FPGA;LED;EDA;Dynamicscanning
1绪论
1.1本设计的研究背景和研究目的
受到体育场馆用LED显示屏需求快速增长的带动,近年来,中国LED显示屏应用逐步增多。
目前,LED已经广泛应用在银行、火车站、广告、体育场馆之中。
而随着奥运会、世博会的临近,LED显示屏将广泛的应用在体育场馆以及道路交通指示中,LED显示屏在体育广场中的应用将出现快速增长。
2007年,中国LED显示屏市场需求额为49.5亿元,比2006年增长22.2%,这其中全彩显示屏需求额达到21.1亿元,占整体市场的42.6%,双色显示屏的需求额位于第二位,需求额为18.3亿元,占整体市场的40%,单色显示屏需求额为10.1亿元。
2008年奥运会的召开将会直接推动体育场用屏幕数量的快速增加,同时,由于奥运会用屏对LED显示屏的质量要求也较高,因此,高端屏幕的使用比例也将会增加,数量和质量的提高带动LED显示屏市场的增长。
除了体育场馆之外,奥运会和世博会等重大活动召开的另一直接推动领域就是广告领域国内外的广告公司必然会看好奥运会和世博会带来的商机,因此必然会增加广告用屏的数量来提高自身收入,从而促进了广告用屏市场的发展。
奥运会和世博会等重大活动的召开必然会伴随着很多大型活动,政府、新闻媒体和各种组织都可能会在奥运会和世博会之间举办各种相关活动,某些活动可能需要大屏LED,这些需求直接带动显示屏市场。
目前,国内从事LED显示屏生产的企业众多,同时,受到外资企业LED显示屏价格过高的影响,在中国LED显示屏市场上多以本土企业为主。
目前,本土LED显示屏生产企业除供应国内需求外,还不断把产品出口到国外市场。
而近年来,受到成本压力的影响,国际上一些知名的LED显示屏企业也逐步把生产基地移到了中国,如巴可在北京设立了显示屏生产基地,Lighthouse在惠州也拥有生产基地,Daktronics、莱茵堡都在国内设立了生产工厂。
随着国际LED显示屏生产大厂不断把生产基地转移至国内,加之国内众多的LED显示屏本土企业,中国正在成为全球LED显示屏的主要生产基地。
因此研究研究LED汉字滚动显示屏的设计方法具有重要的理论和现实意义。
1.2研究内容及方法
采用传统方法设计的汉字滚动显示器,通常需要使用单片机、存储器和制约逻辑电路来进行PCB(印制电路板)板级的系统集成。
尽管这种方案有单片机软件的支持较为灵活,但是由于受硬件资源的限制,未来对设计的变更和升级,总是难以避免要付出较多研发经费和较长投放市场周期的代价。
随着电子设计自动化(EDA)技术的进展,基于可编程ASIC器件的数字电子系统设计的完整方案越来越受到人们的重视,并且以EDA技术为核心、的能在可编程ASIC器件上进行系统芯片集成的新设计方法,也正在快速地取代基于PCB板的传统设计方式。
如何使用EDA工具设计电子系统是人们普遍关心的问题。
在EDA工具软件QuartusII的支持下,本设计通过了编译、适配和软件仿真验证。
最后载入硬件系统证明了它的正确性。
1.3设计的主要工作
本设计需要利用EDA工具软件QuartusII编写并调试系统的VHDL程序。
并且每一个模块都在这个软件下进行了仿真。
系统的VHDL程序编好过后先在实验室的EDA实验箱上下载调试,成功过后再根据电路焊接相应的电路板。
最好将程序下载到制好的电路上验证。
2设计方案
2.1方案一
本文系统的LED点阵模块,共由16×32=512个LED发光二极管组成。
如何在该点阵模块上显示汉字是本文设计的关键技术。
本文系统设计是采用一种32路动态分时扫描技术来实现的。
具体方法是,将8个8×8数组的显示模块组合成两个16行16列的扫描结构并将其串联(如图2.1所示)。
其行输入端与FPGA内的只读存储器ROM的16位数据输出端口相连;32个列控制端与两个4-16译码器A、B的输出相连;而译码器A、B的输入端和片选信号又与FPGA内的列扫描控制模块的输出端口scan4-scan0相连。
图2.1为方案的结构框图。
2.2方案二
VHDL程序设计的是硬件,他和编程语言的最大区别是它可以“并发执行”。
本设计可以将LED显示屏要的显示内容抽象成一个二维数组(数组中的‘1’对映点阵显示屏上面的亮点),用VHDL语言设计一个进程将这个数组动态显示在LED显示屏上,再利用另一个进程对这个数组按一定频率进行数据更新,更新的方式可以有多种。
因为两个进程是同时进行的(并发执行),如果对数组中的汉字数据按滚动的方
式更新,则可实现汉字的滚动显示。
图2.2为该方案的原理图。
2.3方案比较
方案一很容易实现,而且占用FPGA的资源较少。
但是由于其实现方式的局限性,该方案只能实现汉字的滚动显示。
方案二中将LED点阵抽象成了一个二维数组。
可以设计一些比较复杂的算法来控制这个数组,使设计的系统不但可以滚动显示汉字,还可以扩展一些其它的显示效果。
但是方案二中对数组的处理部分对FPGA芯片的资源消耗太大学校实验室里的EPF10K10LC84-4芯片只有576个逻辑单元远远不够设计要求。
所以最终选择方案一。
3扫描控制模块
3.1LED点阵原理
以下为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亮度会不足。
3.2汉字的存储
用动态分时扫描技术使LED点阵模块显示图像,需要进行两步工作。
第一步是获得数据并保存,即在存贮器中建立汉字数据库。
第二步是在扫描模块的控制下,配合行扫描的次序正确地输出这些数据。
获得图像数据的步骤是,先将要显示的每一幅图像画在一个如图3.3所示的被分成16×16共256个小方格的矩形框中,再在有笔划下落处的小方格里填上“1”,无笔划处填上“0”,这样就形成了与这个汉字所对应的二进制数据在该矩形框上的分布,再将此分布关系以32×16的数据结构组成64个字节的数据,并保存在只读存贮器ROM中。
以这种方式将若干个汉字的数据贮存在存贮器内,就完成了图像数据库的建立工作。
然后,依次对多汉字抽取像素信息,并按序排队存放起来,便可得到一个待显示数据序列。
将这个序列存到ROM中进一步通过寻址的方法来控制该数据序列的释放过程,就可实现在LED发光二极管点阵上滚动显示多汉字信息的目的。
由图3.4可知,某一时刻能在显示数据序列中定位待显示数据的地址指针可用下式计算:
addr=n+m (式3.1)
3.3汉字的显示
第二步工作的步骤是:
先在扫描模块的控制下,由地址线确定每次由ROM送出某一列的16个LED所要显示的汉字的控制字节数据,同时由扫描模块输出的5位扫描码经两个4-16译码器解码后决定相应的某一列可以被点亮,而另外31列都不能被点亮。
该状态持续约0.4毫秒后,就接着进行下一行的扫描。
当完成了一次32行的扫描后,也就完成了一帧画面的显示。
重复上述过程不断修改ROM的地址区间的起始地址,转向下一幅画面的数据传送和显示。
如此进行,就可以在LED点阵模块上滚动显示ROM中存储的汉字。
关键部分VHDL程序:
process(reset_n,clk_scan)--扫描信号的输出
begin
if(reset_n='0')then
cnt<=31;
elsif(rising_edge(clk_scan))then
if(cnt=cnt'high)then
cnt<=0;
else
cnt<=cnt+1;
endif;
if(cnt=cnt'high-1)then
flag_scan<='1';
else
flag_scan<='0';
endif;
endif;
endprocess;
process(reset_n,clk_scan,cnt)
begin
if(reset_n='0')then
scan<="ZZZZZ";
elsif(rising_edge(clk_scan))then
casecntis
when0=>scan<="00000";
when1=>scan<="00001";
……
when30=>scan<="11110";
when31=>scan<="11111";
whenothers=>scan<="ZZZZZ";
endcase;
endif;
endprocess;
----------------------------------
process(reset_n,clk_scan,cnt,x)--列数据的输出
variableindex:
integerrange0toL_SZ;
begin
if(reset_n='0')then
data<="0000000000000000";
elsif(rising_edge(clk_scan))then
index:
=((cnt+x)modL_SZ);
data<=ledsj(index);
endif;
endprocess;
3.4滚动速度的控制
将LED点阵看成一个滑窗。
通过这个“滑窗”每次能“看到”32个存储单元(2个汉字长度)的信息。
只读存储器ROM中链式的存放了若干个汉字的点阵信息,“滑窗”在这若干个汉字点阵信息上面滑动,我们通过“滑窗”看到的就是汉字的滚动显示。
在用VHDL编程的时候,可以定义一个变量x作为“滑窗”在ROM上的起始地址,设计一个进程按一定的频率对x进行累加,再设计一个进程将以x为起始地址的长度为32的ROM中的区域动态显示在LED点阵中。
显然x累加的速度决定了汉字的滚动速度。
关键部分的VHDL程序:
process(reset_n,clk_scan,flag_scan)--x的控制进程
variablecntx:
integerrange0to50;
begin
if(reset_n='0')then
cntx:
=0;
x<=0;
elsif(rising_edge(clk_scan))then
if(flag_scan='1')then
if(cntx=n×8orcntx=cntx'high)then--通过n来控制cntx的计数范围
cntx:
=0;
else
cntx:
=cntx+1;
endif;
if(cntx=n×8)then--通过n来控制x的增加
if(x=x'high)then
x<=0;
else
x<=x+1;
endif;
endif;
endif;
endif;
endprocess;
此进程根据定义的信号n来控制x递增的速度,n由外部的按键控制。
n的范围为0~7代表了汉字的不同的滚动速度。
当n为0时汉字滚动的速度最快,n为7时LED点阵上显示的汉字静止。
3.5存储模块
3.5.1使用参数化组件LPM_ROM来实现
为提高系统的集成度,本设计将点阵显示的图像数据库建立在EPF10K10的片内ROM中。
Flex10k10中共有3个嵌入式数组块(EAB),每块大小均为2k,可构成2048×1,1024×2,512×4,256×8等4种类型RAM/ROM中的任意一种。
更大容量的内存可由多个EAB组合在一起。
例如两个256×8的ROM块可组成一个256×16的ROM,两个512×4的ROM块可组合成一个512×8的ROM,如果需要,可以将所有的EAB级联成一个RAM/ROM。
级联是QuartusII软件自动完成的。
本设计可以选择2048×16的结构,用来构成一个能保存128个汉字的只读存储器ROM。
在FPGA中建立片内只读存储器ROM,是通过使用美国Altera公司的EDA工具软件QuartusII,并调用其中的参数化组件LPM_ROM来实现的。
具体步骤是,首先在MAXPLUSII的图形编辑器中双击空白处,便会出现如图3.5所示的“Symbol”对话框。
点击该对话框的“MegaWizardPlug-InManager”按钮,并在出现的对话框中选择storage->LPM_ROM,就会出现如图3.6所示的“MegaWizardPlug-InManager-LMPROM”系列对话框。
在该系列对话框中设置输出数据线宽度为11,存储单元的数量为2048。
并完成相应的配置环节就获得了要求的256字节的只读存储器ROM。
只读存储器ROM中的初始化数据就是本系统的汉字数据库数据。
该初始化数据的建立是在上述的LMP_ROM设计过程中通过指定一个后缀名为.mif的初始化文件来实现的。
该文件是设计者事先在文本编辑器中建立的,其VHDL格式和关键代码示意如下:
WIDTH=16;———数据线的宽度为16位
DEPTH=2048;———有2048个字节存储单元,对应11根地址线宽度
ADDRESSRADIX=HEX;———以16进制表示
DATARADIX=HEX;
CONTENTBEGIN
00:
2f;———以16进制表示的ROM内的各字节单元的地址和保存的数据
01:
6c;
02:
f8;
……
fd:
ee;
fe:
72;
ff:
00;
END;
3.5.2用FPGA内部的逻辑单元设计一个ROM
本系统也可以定义一个常数数组来存储汉字信息。
数组的下标对映ROM的地址。
下面是一个容量为L_SZ×16的ROM内存的例子,常数L_SZ决定了ROM的地址空间,ROM的每一个数据单元存储16位数据,可以很方便的驱动16×16的LED点阵。
定义这个ROM的时侯必须初始化全部存储单元。
typearray_2isarray(0toL_SZ)ofstd_logic_vector(15downto0);
constantledsj:
array_2:
=(
("0010000000000000"),
("0010001111111111"),
……
……
("0010001000000000"),
("0000000000000000"));
两种方案存储汉字信息,以及输出数据驱动LED点阵的原理和相差不大,第一种方案是利用了FPGA芯片中的嵌入式数组块,可以生成大容量的ROM来存储较多的汉字信息。
第二中方案生成的ROM容量受到了FPGA芯片内部逻辑单元数量的限制,但是它的操作性更好。
由于本系统只是验证可行性的一个设计,不需要建立大的字库所以采用第二种方案。
4分频电路
4.1解决毛刺
FPGA与单片机相比,一个非常明显的优势就在于它的高速性。
但是因为很多外围器件的驱动需要低频的时钟(若时钟频率太高,则键盘扫描容易出错,数码管会闪烁和不稳定等),所以需要用到分频电路。
该电路主要包含有一个计数器模块和一个译码输出模块,该电路是通过计数器模块实现分频的。
比如要从12MHz的全局时钟得到100Hz的时钟,必须进行120000倍分频。
但是这么大的分频需要仿真时间很久。
仿真是一般采用小的分频来替代,真正下载到电路上时,就需要采用120000分频了。
值的注意的是译码器的输入采用了寄存器锁存输出,这是为了消除毛刺。
多输入的组合逻辑电路中,默写输入信号在理想情况下应该同时发生变化,但由于延迟路径不同造成这些输入信号发生变化的时间有微小差别(门延迟时间量级),这是得到的是输出信号就会有毛刺,这些毛刺有可能会给下一级电路带来,使得整个系统运行不稳定。
因此,为保证系统的稳健性,一般情况下,都应该给输出信号去毛刺,使之变得干净。
在设计中,译码的输入是计数器的输出,计数器各级输出延迟是不一样的,因此译码器输出clk_scan信号波形就会有毛刺(如图4.1)。
4.1.1改变输入信号消除毛刺
为了消除毛刺带来的影响,可以设法使得组合逻辑电路的输入每一时刻只有一个发生变化。
对于本电路可以把计数器从二进制码计数器改为格雷码计数器。
格雷码计数器的特点是相邻的计数值只有一位不相同,即每次计数值改变时,只有一位信号会发生变化。
这一点就可以保证没有毛刺产生。
4.1.2通过D触发器消除毛刺
把有毛刺的信号通过时钟采样,即通过一个D触发器也可以消除毛刺。
本设计就是使用这种方法。
这种方法的缺点是信号通过一个D触发器后,就延迟了一个时钟周期。
对于本设计这种延迟是允许的,然而在有些电路中延迟是不允许的。
该电路的仿真结果如图4.2所示。
4.2关键部分VHDL程序
process(clk)--计数模块
begin
if(rising_edge(clk))t