基于FPGA的滚字屏的显示设计.doc_第1页
基于FPGA的滚字屏的显示设计.doc_第2页
基于FPGA的滚字屏的显示设计.doc_第3页
基于FPGA的滚字屏的显示设计.doc_第4页
基于FPGA的滚字屏的显示设计.doc_第5页
已阅读5页,还剩29页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

基于FPGA的滚字屏显示设计 李涵三明学院2006级电子科学与技术专业 福建三明 365004摘要: 本文对基于FPGA控制的LED汉字滚动显示器的设计方法进行了探讨。提出了两个实现方案。并对其中一个方案作了详细说明。文中首先介绍了LED发光二极管点阵的控制原理;然后研究了在LED发光二极管点阵上滚动显示汉字的方法;最后,用VHDL语言程序设计了一个完整的LED汉字滚动显示器。本系统由扫描控制模块、只读存储器ROM和FPGA外面的LED点阵显示模块、一个反相器和两个4-16译码器构成。其中:扫描控制模块和只读存储器ROM集成在FPGA芯片内部。两个4-16译码器(74LS154)和一个反相器配合FPGA中的列扫描控制模块共同完成了两块1616点阵显示模块的32列的扫描控制。FPGA定义的只读存储器ROM中保存了要显示的汉字的数据,并以16位的数据宽度输出到LED阵显示模块的行端,配合列扫描控制共同完成汉字的滚动显示。本系统利用数字系统设计自动化(EDA)技术实现了全硬件方式的LED点阵显示。利用FPGA内部的物理资源,将只读存储器ROM和主要功能模块设计在FPGA内部。充分显示了EDA技术设计的灵活性,同时也大大提高了系统的集成度和稳定性。关键词:FPGA LED EDA 动态扫描第1章 绪 论1.1 本设计的研究背景和研究目的受到体育场馆用LED显示屏需求快速增长的带动,近年来,中国 LED显示屏应用逐步增多。目前,LED已经广泛应用在银行、火车站、广告、体育场馆之中。而随着奥运会、世博会的临近,LED显示屏将广泛的应用在体育场馆以及道路交通指示中,LED显示屏在体育广场中的应用将出现快速增长。2007年,中国LED显示屏市场需求额为49.5亿元,比2006年增长22.2%,这其中全彩显示屏需求额达到21.1亿元,占整体市场的42.6%,双色显示屏的需求额位于第二位,需求额为18.3亿元,占整体市场的40%,单色显示屏需求额为10.1亿元。图1.1 2006-2010年中国LED显示屏市场规模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章 设计方案本文系统的LED点阵模块,共由1632=512个LED发光二极管组成。如何在该点阵模块上显示汉字是本文设计的关键技术。本文系统设计是采用一种32路动态分时扫描技术来实现的。具体方法是,将8个88数组的显示模块组合成两个16行16列的扫描结构并将其串联(如图2.1所示)。其行输入端与FPGA内的只读存储器ROM的16位数据输出端口相连;32个列控制端与两个4-16译码器A、B的输出相连;而译码器A、B的输入端和片选信号又与FPGA内的列扫描控制模块的输出端口scan4-scan0相连。图2.1为方案的结构框图。图2.1 系统的结构框图第3章 扫描控制模块3.1 LED点阵原理以下为88点阵LED外观及引脚图及其等效电路,只要其对应的X、Y轴顺向偏压,即可使LED发亮。例如如果想使左上角LED点亮,则Y0=1,X0=0即可。应用时限流电阻可以放在X轴或Y轴。图3.1 88点阵LED外观图图3.2 88点阵LED等效图点阵LED扫描法介绍点阵LED一般采用扫描式显示,实际运用分为三种方式: (1)点扫描(2)行扫描(3)列扫描若使用第一种方式,其扫描频率必须大于1664=1024Hz,周期小于1ms即可。若使用第二和第三种方式,则频率必须大于168=128Hz,周期小于7.8ms即可符合视觉暂留要求。此外一次驱动一列或一行(8颗LED)时需外加驱动电路提高电流,否则LED亮度会不足。3.2 汉字的存储用动态分时扫描技术使LED点阵模块显示图像,需要进行两步工作。第一步是获得数据并保存,即在存贮器中建立汉字数据库。第二步是在扫描模块的控制下,配合行扫描的次序正确地输出这些数据。获得图像数据的步骤是,先将要显示的每一幅图像画在一个如图3.3所示的被分成1616共256个小方格的矩形框中,再在有笔划下落处的小方格里填上“1”,无笔划处填上“0”,这样就形成了与这个汉字所对应的二进制数据在该矩形框上的分布,再将此分布关系以3216的数据结构组成64个字节的数据,并保存在只读存贮器ROM中。以这种方式将若干个汉字的数据贮存在存贮器内,就完成了图像数据库的建立工作。图3.3 1616LED点阵模块然后,依次对多汉字抽取像素信息,并按序排队存放起来,便可得到一个待显示数据序列。将这个序列存到ROM中进一步通过寻址的方法来控制该数据序列的释放过程,就可实现在LED 发光二极管点阵上滚动显示多汉字信息的目的。由图3.4可知,某一时刻能在显示数据序列中定位待显示数据的地址指针可用下式计算: addr=n+m (式3.1)图3.4 滚动显示多汉字信息的原理示意图3.3 汉字的显示第二步工作的步骤是:先在扫描模块的控制下,由地址线确定每次由ROM送出某一列的16个LED所要显示的汉字的控制字节数据,同时由扫描模块输出的5位扫描码经两个4-16译码器解码后决定相应的某一列可以被点亮,而另外31列都不能被点亮。该状态持续约0.4毫秒后,就接着进行下一行的扫描。当完成了一次32行的扫描后,也就完成了一帧画面的显示。重复上述过程不断修改ROM的地址区间的起始地址,转向下一幅画面的数据传送和显示。如此进行,就可以在LED点阵模块上滚动显示ROM中存储的汉字。关键部分VHDL程序:process(reset_n,clk_scan) -扫描信号的输出beginif(reset_n=0)thencnt=31;elsif(rising_edge(clk_scan)thenif(cnt=cnthigh)thencnt=0;elsecnt=cnt+1;end if;if(cnt =cnthigh-1)thenflag_scan=1;elseflag_scan=0;end if;end if;end process;process(reset_n,clk_scan,cnt)beginif(reset_n=0)thenscan scan scan scan scan scan = ZZZZZ;end case;end if;end process;-process(reset_n,clk_scan,cnt,x) -列数据的输出variable index:integer range 0 to L_SZ;beginif(reset_n=0)thendata=0000000000000000;elsif(rising_edge(clk_scan)thenindex:=(cnt+x) mod L_SZ);data=ledsj(index);end if;end process;3.4 滚动速度的控制将LED点阵看成一个滑窗。通过这个“滑窗”每次能“看到”32个存储单元(2个汉字长度)的信息。只读存储器ROM中链式的存放了若干个汉字的点阵信息,“滑窗”在这若干个汉字点阵信息上面滑动,我们通过“滑窗”看到的就是汉字的滚动显示。在用VHDL编程的时候,可以定义一个变量x作为“滑窗”在ROM上的起始地址,设计一个进程按一定的频率对x进行累加,再设计一个进程将以x为起始地址的长度为32的ROM中的区域动态显示在LED点阵中。显然x累加的速度决定了汉字的滚动速度。关键部分的VHDL程序:process(reset_n,clk_scan,flag_scan) -x的控制进程variable cntx:integer range 0 to 50;beginif(reset_n=0)thencntx:=0;x=0;elsif(rising_edge(clk_scan)thenif(flag_scan=1)thenif(cntx=n8 or cntx=cntxhigh)then -通过n来控制cntx的计数范围cntx:=0;elsecntx:=cntx+1;end if;if(cntx=n8)then -通过n来控制x的增加if(x=xhigh)thenx=0;elsexLPM_ROM,就会出现如图3.6所示的“Mega Wizard Plug-InManager-LMP ROM” 系列对话框。在该系列对话框中设置输出数据线宽度为11,存储单元的数量为2048。并完成相应的配置环节就获得了要求的256字节的只读存储器ROM。只读存储器ROM中的初始化数据就是本系统的汉字数据库数据。图3.6 “MegaWizard Plugl-in Manager_LMP ROM”对话框该初始化数据的建立是在上述的LMP_ROM设计过程中通过指定一个后缀名为.mif的初始化文件来实现的。该文件是设计者事先在文本编辑器中建立的,其VHDL格式和关键代码示意如下:WIDTH=16;数据线的宽度为16位DEPTH=2048;有2048个字节存储单元,对应11根地址线宽度ADDRESS RADIX=HEX;以16进制表示DATA RADIX = HEX;CONTENTBEGIN00 : 2f;以16进制表示的ROM内的各字节单元的地址和保存的数据01 : 6c;02 : f8;fd : ee;fe : 72;ff : 00;END;3.5.2 用FPGA内部的逻辑单元设计一个ROM本系统也可以定义一个常数数组来存储汉字信息。数组的下标对映ROM的地址。下面是一个容量为L_SZ16的ROM内存的例子,常数L_SZ决定了ROM的地址空间, ROM的每一个数据单元存储16位数据,可以很方便的驱动1616的LED点阵。定义这个ROM的时侯必须初始化全部存储单元。type array_2 is array(0 to L_SZ)of std_logic_vector(15 downto 0);constant ledsj: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 没有消除毛刺的仿真结果4.1.1改变输入信号消除毛刺为了消除毛刺带来的影响,可以设法使得组合逻辑电路的输入每一时刻只有一个发生变化。对于本电路可以把计数器从二进制码计数器改为格雷码计数器。格雷码计数器的特点是相邻的计数值只有一位不相同,即每次计数值改变时,只有一位信号会发生变化。这一点就可以保证没有毛刺产生。4.1.2通过D触发器消除毛刺把有毛刺的信号通过时钟采样,即通过一个D触发器也可以消除毛刺。本设计就是使用这种方法。这种方法的缺点是信号通过一个D触发器后,就延迟了一个时钟周期。对于本设计这种延迟是允许的,然而在有些电路中延迟是不允许的。该电路的仿真结果如图4.2所示。图4.2 消除毛刺后的仿真结果 4.2 关键部分VHDL程序process(clk) -计数模块 begin if(rising_edge(clk)then if(cntx=480)then cntx=0; else cntx=cnthigh/2)then clk_scan=1; else clk_scan(cnt_scanhigh/2)thenclk_scan=1;elseclk_scan(cnt_keyhigh/2)thenclk_key=1;elseclk_key=0;end if;end if;end process;end abc;扫描模块程序:library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_arith.all;use ieee.std_logic_unsigned.all;entity mnscan isport(clk_scan:in std_logic;scan:out std_logic_vector(4 downto 0);data:out std_logic_vector(15 downto 0); dis_n:out std_logic_vector(6 downto 0); -不需要小数点(7位)key1,key2:in std_logic;reset_n:in std_logic);end mnscan;architecture abc of mnscan isconstant L_SZ:integer:=223;constant L_DZ:integer:=31;signal cnt:integer range 0 to L_DZ; -和点阵屏的列一样大signal n:integer range 0 to 7;-控制速度signal flag_scan:std_logic;signal x:integer range 0 to L_SZ;-创建一个可以存储2唯数据的数据类型 array_2type array_2 is array(0 to L_SZ)of std_logic_vector(15 downto 0);constant ledsj:array_2:=(1111111111111111),(0000001000000000),(0000011000000000),(0010001000000000);beginprocess(reset_n,clk_scan) -cnt计数及flag_scan的产生beginif(reset_n=0)thencnt=31;elsif(rising_edge(clk_scan)thenif(cnt=cnthigh)thencnt=0;elsecnt=cnt+1;end if;if(cnt =cnthigh-1)thenflag_scan=1;elseflag_scan=0;end if;end if;end process;process(reset_n,clk_scan,cnt) -扫描信号scan的产生beginif(reset_n=0)thenscan scan scan scan scan scan scan scan scan scan s

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论