基于-FPGA滚字屏显示设计

上传人:dc****87 文档编号:87399754 上传时间:2022-05-09 格式:DOC 页数:22 大小:549KB
返回 下载 相关 举报
基于-FPGA滚字屏显示设计_第1页
第1页 / 共22页
基于-FPGA滚字屏显示设计_第2页
第2页 / 共22页
基于-FPGA滚字屏显示设计_第3页
第3页 / 共22页
点击查看更多>>
资源描述
-基于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技术设计的灵活性,同时也大大提高了系统的集成度和稳定性。关键词:FPGALEDEDA 动态扫描第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-2021年中国LED显示屏市场规模2021年奥运会的召开将会直接推动体育场用屏幕数量的快速增加,同时,由于奥运会用屏对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外观及引脚图及其等效电路,只要其对应的*、Y轴顺向偏压,即可使LED发亮。例如如果想使左上角LED点亮,则Y0=1,*0=0即可。应用时限流电阻可以放在*轴或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)thent=31;elsif(rising_edge(clk_scan)thenif(t=thigh)thent=0;elset=t+1;end if;if(t =thigh-1)thenflag_scan=1;elseflag_scan=0;end if;end if;end process;process(reset_n,clk_scan,t)beginif(reset_n=0)thenscan scan scan scan scan scan = ZZZZZ;end case;end if;end process;-process(reset_n,clk_scan,t,*) -列数据的输出variable inde*:integer range 0 to L_SZ;beginif(reset_n=0)thendata=00000;elsif(rising_edge(clk_scan)theninde*:=(t+*) mod L_SZ);data=ledsj(inde*);end if;end process;3.4 滚动速度的控制将LED点阵看成一个滑窗。通过这个滑窗每次能看到32个存储单元2个汉字长度的信息。只读存储器ROM中链式的存放了假设干个汉字的点阵信息,滑窗在这假设干个汉字点阵信息上面滑动,我们通过滑窗看到的就是汉字的滚动显示。在用VHDL编程的时候,可以定义一个变量*作为滑窗在ROM上的起始地址,设计一个进程按一定的频率对*进展累加,再设计一个进程将以*为起始地址的长度为32的ROM中的区域动态显示在LED点阵中。显然*累加的速度决定了汉字的滚动速度。关键局部的VHDL程序:process(reset_n,clk_scan,flag_scan) -*的控制进程variablet*:integer range 0 to 50;beginif(reset_n=0)thent*:=0;*=0;elsif(rising_edge(clk_scan)thenif(flag_scan=1)thenif(t*=n8 ort*=t*high)then -通过n来控制t*的计数围t*:=0;elset*:=t*+1;end if;if(t*=n8)then -通过n来控制*的增加if(*=*high)then*=0;else*LPM_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 RADI*=HE*;以16进制表示DATA RADI* = HE*;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:=(00000),(11111),(00000),(00000);两种方案存储汉字信息,以及输出数据驱动LED点阵的原理和相差不大,第一种方案是利用了FPGA芯片中的嵌入式数组块,可以生成大容量的ROM来存储较多的汉字信息。第二中方案生成的ROM容量受到了FPGA芯片部逻辑单元数量的限制,但是它的操作性更好。由于本系统只是验证可行性的一个设计,不需要建立大的字库所以采用第二种方案。第4章 分频电路4.1 解决毛刺 FPGA与单片机相比,一个非常明显的优势就在于它的高速性。但是因为很多外围器件的驱动需要低频的时钟假设时钟频率太高,则键盘扫描容易出错,数码管会闪烁和不稳定等,所以需要用到分频电路。该电路主要包含有一个计数器模块和一个译码输出模块,该电路是通过计数器模块实现分频的。比方要从12MHz的全局时钟得到100Hz的时钟,必须进展120000倍分频。但是这么大的分频需要仿真时间很久。仿真是一般采用小的分频来替代,真正下载到电路上时,就需要采用120000分频了。值的注意的是译码器的输入采用了存放器锁存输出,这是为了消除毛刺。多输入的组合逻辑电路中,默写输入信号在理想情况下应该同时发生变化,但由于延迟路径不同造成这些输入信号发生变化的时间有微小差异门延迟时间量级,这是得到的是输出信号就会有毛刺,这些毛刺有可能会给下一级电路带来,使得整个系统运行不稳定。因此,为保证系统的稳健性,一般情况下,都应该给输出信号去毛刺,使之变得干净。在设计中,译码的输入是计数器的输出,计数器各级输出延迟是不一样的,因此译码器输出clk_scan信号波形就会有毛刺如图4.1。图4.1 没有消除毛刺的仿真结果改变输入信号消除毛刺为了消除毛刺带来的影响,可以设法使得组合逻辑电路的输入每一时刻只有一个发生变化。对于本电路可以把计数器从二进制码计数器改为格雷码计数器。格雷码计数器的特点是相邻的计数值只有一位不一样,即每次计数值改变时,只有一位信号会发生变化。这一点就可以保证没有毛刺产生。通过D触发器消除毛刺把有毛刺的信号通过时钟采样,即通过一个D触发器也可以消除毛刺。本设计就是使用这种方法。这种方法的缺点是信号通过一个D触发器后,就延迟了一个时钟周期。对于本设计这种延迟是允许的,然而在有些电路中延迟是不允许的。该电路的仿真结果如图4.2所示。图4.2 消除毛刺后的仿真结果4.2 关键局部VHDL程序process(clk) -计数模块 begin if(rising_edge(clk)then if(t*=480)then t*=0; else t*=thigh/2)then clk_scan=1; else clk_scan(t_scanhigh/2)thenclk_scan=1;elseclk_scan(t_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;signalt:integer range 0 to L_DZ; -和点阵屏的列一样大signal n:integer range 0 to 7;-控制速度signal flag_scan:std_logic;signal *: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:=(11111),(00000),(00000),(00000);beginprocess(reset_n,clk_scan) -t计数及flag_scan的产生beginif(reset_n=0)thent=31;elsif(rising_edge(clk_scan)thenif(t=thigh)thent=0;elset=t+1;end if;if(t =thigh-1)thenflag_scan=1;elseflag_scan=0;end if;end if;end process;process(reset_n,clk_scan,t) -扫描信号scan的产生beginif(reset_n=0)thenscan scan scan scan scan scan scan scan scan scan scan scan scan scan scan scan scan scan scan scan scan scan scan scan scan scan scan scan scan scan scan scan scan scan = ZZZZZ;end case;end if;end process;process(reset_n,clk_scan,flag_scan) -t*,*的控制variablet*:integer range 0 to 50;beginif(reset_n=0)thent*:=0;*=0;elsif(rising_edge(clk_scan)thenif(flag_scan=1)thenif(t*=n*8 ort*=t*high)thent*:=0;elset*:=t*+1;end if;if(t*=n*8)thenif(*=*high)then*=0;else*=*+1;end if;end if;end if;end if;end process;process(reset_n,clk_scan,t,*) -输出列数据datavariable inde*:integer range 0 to L_SZ;beginif(reset_n=0)thendata=00000;elsif(rising_edge(clk_scan)theninde*:=(t+*) mod L_SZ);data=ledsj(inde*);end if;end process;process(reset_n,clk_scan,key1,key2) -n的控制variable flag_key:std_logic;beginif(reset_n=0)thenn=nhigh)thenn=n;elsen=n+1;end if;end if;elsif(key2=0)thenif(flag_key=0)thenflag_key:=1;if(n=0)thenn=n;else n=n-1;end if;end if;elseflag_key:=0;end if;end if;end process; process(reset_n,n,clk_scan) begin if(reset_n=0)then dis_ndis_ndis_ndis_ndis_ndis_ndis_ndis_ndis_ndis_n=0000000; end case; 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 keyscan isport(clk_key:in std_logic;reset_n:in std_logic;key1_in,key2_in:in std_logic; -按下时为低电平key1_out,key2_out:out std_logic);end keyscan;architecture abc of keyscan isbegin-key1的产生消键抖动process(reset_n,clk_key,key1_in)v
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 图纸专区 > 幼儿教育


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!