《基于FPGA的16×16点阵汉字显示设计(共17页).doc》由会员分享,可在线阅读,更多相关《基于FPGA的16×16点阵汉字显示设计(共17页).doc(17页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、精选优质文档-倾情为你奉上EDA课程设计题 目: 16*16点阵显示器的设计 班 级: 08电子信息工程(应电方向)院 系: 应用技术学院 姓 名: 学号: 实验地点: 应用技术学院 综合实验室 指导老师: 王悦善 职称: 讲师 成 绩: ( 2011年6月2日 )目录1. 前言1.1 本设计的研究背景和研究目的随着我国经济的高速发展,对公共场合发布信息的需求日益增长,利用LED点阵滚动显示汉字的出现正好适应了这一市场需求,已经成为信息传播的一种重要手段。采用传统方法设计的汉字滚动显示器,通常需要使用单片机、存储器和制约逻辑电路来进行PCB板级的系统集成。尽管这种方案有单片机软件的支持较为灵活
2、,但是由于受硬件资源的限制,未来对设计的变更和升级,总是难以避免要付出较多研发经费和较长投放市场周期的代价。随着电子设计自动化(EDA)技术的进展,基于可编程FPGA器件进行系统芯片集成的新设计方法,也正在快速地到代基于PCB板的传统设计方式。因此,本设计的研究是很有必要的,之所以基于FPGA设计是因为现场可编程门阵列(FPGA)设计周期小,灵活度高,适合用于小批量系统,提高系统的可靠性和集成度。并且采用编写灵活的VHDL语言编写主程序。1.2 LED点阵显示特点(1)可以显示各种数字、文字、图表、曲线、图形;(2)采用纯红、高绿作双基色发光器件,发光亮度高,色彩鲜艳、丰富;(3)显示效果清晰
3、、稳定、功耗低、寿命长;(4)优质铝合金结构,磨沙、银镜或钛金不锈钢包边。尺寸和规格可根据需要灵活组合;(5)支持各种计算机网络,编辑软件丰富、易用;(6)适用于室内、外所有信息发布及广告宣传场所。如:银行、证券交易所、商场、市场、宾馆、洒楼、电信、邮政、医院、车站、机场等。1.3 FPGA设计的特点FPGA 通常被认为是ASIC 实现的一种替代手段. 一般ASIC 包括三种, 既全定制、半定制(含标准单元和门阵列) 以及可编程器件。对于前两种, 需要支付不可重复使用的工程费用NRE (Non recurring Engineering) , 主要用于芯片的流片、中测、分析的工程开销, 一次费
4、用一般在1 万至数万美元以上。如果一次不成功、返工、甚至多次返工,NRE 费用将要上升。成本高、风险大, 而通常对每个ASIC 品种的需求量往往不大,NRE 费用分摊到每个产品上价太高, 用户无法接受。而对于可编程器件PLD (Programmable Logic Device) 正是可以解决上述问题的新型ASIC, PLD 以其操作灵活、使用方便、开发迅速、投资风险小等突出优点, 特别适合于产品开发初期、科研样品研制或小批量的产品. FPGA 是一种新型的PLD, 其除了具有PLD 的优点外, 其规模比一般的PLD 的规模大。目前,Xilinx 推出的XC4025 可以达到25000 门的规
5、模,Altera 公司的FLEX10K100 系列芯片可达到十万门的规模,完全可以满足用户的一般设计需要。 FPGA 的主要特点是: 寄存器数目多, 采用查找表计数,适合时序逻辑设计。 但是互连复杂, 由于互连采用开关矩阵,因而使得延时估计往往不十分准确。FPGA 也有其自身的局限性, 其一就是器件规模的限制,其二就是单元延迟比较大。 所以, 在设计者选定某一FPGA器件后, 要求设计者对器件的结构、性能作深入的了解, 在体系结构设计时, 就必须考虑到器件本身的结构及性能, 尽可能使设计的结构满足器件本身的要求. 这样就增加了设计的难度。 离开对FPGA 结构的详细了解, 设计人员就不可能优化
6、设计。因而设计人员必须了解FPGA 器件的特性和限制, 熟悉FPGA 的结构。在了解FPGA 结构特点的基础上, 就可以利用VHDL 语言描写出高效的电路描述实现性能优化的电路。2 系统设计2.1.1设计任务与要求(1) 使用FPGA设计一个1616的点阵显示的控制器,使点阵显示器循环多个显示汉字;(2) 运用Quartus II 软件对程序进行编译和仿真;(3) 每人撰写一份课程设计报告,要求不少于两千字;(4) 课程设计最后一节课交报个并对自己做的设计简单介绍及答辩。2.1.2 设计要求(1) 输出预定义多个汉字(不少于4个);(2)输出汉字以1s循环显示;(3)操作方便、可维护性高;(4
7、)程序简捷,便于修改。2.2 设计原理方案一:每次显示一个汉字,一秒钟后刷新显示第二汉字,一秒钟后刷新显示第三汉字,依次刷新显示“张英黄娜”,循环显示四汉字。方案二:使用滚屏2.3扫描控制模块1616扫描LED点阵的工作原理同8位扫描数码管类似。它有16个共阴极输出端口,每个共阴极对应有16个LED显示灯,所以其扫描译码地址需4位信号线(SEL0-SEL3),其汉字扫描码由16位段地址(0-15)输入。 通过时钟的每列扫描显示完整汉字。 图2-2 LED灯红绿信号 图2-3 1616点阵LED等效电路点阵LED一般采用扫描式显示,实际运用分为三种方式: (1)点扫描(2)行扫描(3)列扫描若使
8、用第一种方式,其扫描频率必须大于1664=1024Hz,周期小于1ms即可。若使用第二和第三种方式,则频率必须大于168=128Hz,周期小于7.8ms即可符合视觉暂留要求。此外一次驱动一列或一行(16颗LED)时需外加驱动电路提高电流,否则LED亮度会不足。2.4方案选择2.4.1 方案一:1616扫描LED点阵只要其对应的X、Y轴顺向偏压,即可使LED发亮。例如如果想使左上角LED点亮,则Y0=1,X0=0即可。应用时限流电阻可以放在X轴或Y轴。它有16个共阴极输出端口,每个共阴极对应有16个LED显示灯。通过CPLD芯片产生读时序,将字形从寄存器中读出,然后产生写时序,写入1616的点阵
9、,使其扫描显示输出。为了显示整个汉字,首先分布好汉字的排列,以行给出汉字信息(从16个X轴线输入字模信息);然后以128HZ的时序逐个点亮每一行(行扫描),即每行逐一加高电平,根据人眼的视觉残留特性,使之形成整个汉字的显示。LED点阵每个点都有一个红色的发光二极管。点阵内的二极管间的连接都是行共阳,列共阴(要点亮的二极管给出低电平字模信息)。如果采用共阴,当二极管的共阳极为高电平,共阴极为低电平时,所接点发光;反之处于截止状态,不放光。如果采取行扫描方式,用列给文字信息,利用周期为1s的脉冲来控制所显示的字。2.4.2方案二 汉字的存储用动态分时扫描技术使LED点阵模块显示图像,需要进行两步工
10、作。第一步是获得数据并保存,即在存贮器中建立汉字数据库。第二步是在扫描模块的控制下,配合行扫描的次序正确地输出这些数据。获得图像数据的步骤是,先将要显示的每一幅图像画在一个如图3.3所示的被分成1616共256个小方格的矩形框中,再在有笔划下落处的小方格里填上“1”,无笔划处填上“0”,这样就形成了与这个汉字所对应的二进制数据在该矩形框上的分布,再将此分布关系以3216的数据结构组成64个字节的数据,并保存在只读存贮器ROM中。以这种方式将若干个汉字的数据贮存在存贮器内,就完成了图像数据库的建立工作。 图3.3 16*16点阵显示模块经综合考虑,方案一控制和方案二比较起来比较难,而且方案一程序
11、较复杂,对于我们学生来说设计经验不足,不容易把握,因此选择方案二。2.5实现汉字显示使用的是1616的点阵,EDA实验箱上有其接口电路,列选信号为addrs0,addrs1,addrs2,addrs3)经4线16线译码器输出16列,从左起为第一列,列选信号是由一个4位向量SEL3.0控制;行选信号为data150,是由16个行信号组成的,每一行由一个单独的位来控制,高电平有效。例如“0000”表示第0列,“00001”表示第一行的点亮。由于列是由一个向量决定,而每一时刻的值只能有一个固定的值,因而只能使某一列的若干个点亮,因此就决定了只能用逐列扫描的方法。例如要使第一列的2,4,6,8,行亮,
12、则列为“0001”、行为“01010”就可以实现了。2.5.1列循环扫描列循环扫描,通过对每一列的扫描来完成对字母的现实,只要扫描的频率足够快,就能给人以连续的感觉。因此要控制扫描的频率,不能太低,否则,就会造成视觉上的不连续,本设计的扫描频率不得低于50Hz,扫描程序如下:process(clk)-送16位地址程序variable js:integer:=0;variable cnt:std_logic_vector(3 downto 0); beginif clkevent and clk=1 then-当时钟clk上升沿到来时,产生一个4位的2进制计数器cntif js10000 the
13、njs:=js+1;elsejs:=0;if cnt=1111 thencnt:=0000;else cnt:=cnt+1;end if;end if;end if;ad case ad is when 0000=datadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatanull; end case; when 01= case ad is when 0000=datadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatanull; end case; whe
14、n 10= case ad iswhen 0000=datadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatanull;end case; when 11=case ad iswhen 0000=datadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatanull;end case; when others=null; end case;end process;为使汉字不断地循环显示,并且使每个汉字之间有停顿,就需要在中间加一定的延时和循环环节。在这一环节中
15、,可以通过修改其数值来控制每个字母的显示时间。其程序如下:process(clk)-产生一个1s的fenpin信号模块 variable cnt:integer:=0; variable tmp:std_logic_vector(1 downto 0); begin if clkevent and clk=1 then if cnt50000 then cnt:=cnt+1; else cnt:=0; if tmp=11 then tmp:=00; else tmp:=tmp+1;end if; end if;end if;fenpin=tmp;end process;3. 系统调试与仿真3.
16、1开发环境介绍Quartus II 是Altera公司的综合性PLD开发软件,支持原理图、VHDL、Veril-ogHDL以及AHDL(Altera Hardware Description Language)等多种设计输入形式,内嵌自有的综合器以及仿真器,可以完成从设计输入到硬件配置的完整PLD设计流程。Quartus II支持Altera的IP核,包含了LPM/MegaFunction宏功能模块库,使用户可以充分利用成熟的模块,简化了设计的复杂性、加快了设计速度。对第三方EDA工具的良好支持也使用户可以在设计流程的各个阶段使用熟悉的第三方EDA工具。此外,Quartus II 通过和DSP
17、 Builder工具与Matlab/Simulink相结合,可以方便地实现各种DSP应用系统;支持Altera的片上可编程系统(SOPC)开发,集系统级设计、嵌入式软件开发、可编程逻辑设计于一体,是一种综合性的开发平台。3.2调试与仿真3.2.1 创建工程在Quartus II 中新建一个VHDL File文件,将VHDL代码输入这个文件,并保存到工作目录,名为zhangying.vhd。利用new preject wizard 工具创建一个工程,工程名为zhangying,顶层文件实体名为zhangying,并将上面创建的zhangying.vhd文件加入到工程中。3.2.2 编译前设置(1
18、)选择目标芯片。用assignmemts-settings命令,弹出settings对话框,选择目标芯片为EP2C5Q208C8。图3-1 选择目标器件(2)选择工作方式,编程方式,及闲置引脚状态单击上图中的device&pin options按钮,弹出device&pin options窗口。 在General项中选中auto-restart configuration after error,使对FPGA的配置失败后能自动重新配置,并加入JTAG用户编码。图3-2 选择配置器件工作方式在configuration项中,其下方的Generate compressed bitstreams处打
19、勾,这样就能产生用于EPCS的POF压缩配置文件。在Configuration 选项页,选择配置器件为EPCS1,其配置模式选择为active serial。图3-3选择编程方式在Unused pins项,将目标器件闲置引脚状态设置高阻态,即选择As input,tri-stated。图3-4 设置闲置引脚状态3.2.3 全程编译设置好前面的内容之后,就可以进行编译了。选择Processing菜单中start compilation,在窗口的下方processing栏中显示编译信息。图3-5 全程编译成功完成完成后在工程管理窗口左是角显示了工程yz_ok 的层次结构和其中结构模块耗用的逻辑宏单
20、元数。此栏的右边是编译处理流程,包括数据网表建立、逻辑综合、适配、配置文件装配和时序分析等。3.2.4功能仿真(1)新建一个矢量波形文件,同时打开波形编辑器。设置仿真时间为50us,保存波形文件为zhangying.vwf。(2)将工程zhangying的端口信号名选入波形编辑器中,所选的端口有clk,address,data。设置clk的时钟周期为2us,占空比为50%。图3-6 选择仿真控制仿真器参数设置。选择菜单Assignment中的Settings,在Settings窗口下选择Simulator,在右侧的simulation mode项下选择timing,即选择时序仿真,并选择仿真激
21、励文件名yz_ok.vwf。选择simulation options栏,确认选定simulation coverage reporting; 毛刺检测Glitch detection 为1ns 宽度;选中Run simulation until all vector stimuli 全程仿真。现在所有设置进行完毕,在菜单processing项下选择start simulation,直到出现simulation was successful,仿真结束 。仿真文件simulation report 通常会自动弹出,否则选择processingsimulation report 。图3-7 仿真波形
22、输出专心-专注-专业4 结束语经过为期三周的课程设计,我对VHDL语言有了更加深刻的认识。VHDL是超高速集成电路的硬件描述语言,它能够描述硬件的结构、行为与功能。另外,VHDL具有并发性,采用自上而下的结构式设计方法,适合大型设计工程的分工合作。在编写程序的时候,我才发现能看懂程序和能自己写程序是两个完全不同的概念,自己一开始写程序时,即便是一个很简单的功能模块,在编译时也可能产生很多错误,在不断的改错过程中,自己对VHDL语言的语法结构有了深刻的理解,对编译过程中常见的错误也有了全面的认识。通过这十三周的课程设计,我在熟悉了基于FPGA设计的同时,也学到了很多在学习课本知识时所体会不到的东
23、西。完成此次设计后,我不仅能对MAX+plus II开发仿真软件熟练操作,能达到学以致用,同时还掌握了矩阵键盘和1616点阵的工作原理。经过这一过程,我发现平常的学习在注重理论知识的掌握同时,要加强实验环节,只有通过不断地实践,我们才能把知识掌握的更牢固,理解的更透彻。通过这次课程设计使我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正为社会服务,从而提高自己的实际动手能力和独立思考的能力。在设计的过程中遇到问题,可以说得是困难重重,这毕竟第一次做的,难免会遇到过各种各样的问题,同时在设计的过程中发现了自己的不足之处,
24、对以前所学过的知识理解得不够深刻,掌握得不够牢固答谢辞:感谢老师给的这次让我们自行设计的机会,通过这次设计通过这次课程设计使我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正为社会服务,从而提高自己的实际动手能力和独立思考的能力。在设计的过程中遇到问题,可以说得是困难重重,这毕竟第一次做的,难免会遇到过各种各样的问题,同时在设计的过程中发现了自己的不足之处,对以前所学过的知识理解得不够深刻,掌握得不够牢固。总的来说,这次设计的1616点阵显示控制还是比较成功的,在设计中遇到了很多问题,最后在老师的辛勤的指导下,终于游逆
25、而解,有点小小的成就感,终于觉得平时所学的知识有了实用的价值,达到了理论与实际相结合的目的,不仅学到了不少知识,而且锻炼了自己的能力,使自己对以后的路有了更加清楚的认识,同时,对未来有了更多的信心。最后,对给过我帮助的所有同学和指导老师再次表示忠心的感谢5 参考文献1潘松,黄继业.EDA技术实用教程.-3版.-北京:科学出版社,2006综合电子设计与实践,王振红,清华大学出版社,2008年9月第2版;2曾繁泰,陈美金.VHDL程序设计.北京:清华大学出版社,2000;3褚振勇,翁木云.FPGA设计及应用.西安:西安电子科技大学出版社,20026 附录:程序-本程序适用于共阴极点阵模块显示,时钟
26、频率为50MHzlibrary ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity zhangying is port(clk: in std_logic; data: out std_logic_vector(15 downto 0); addrs: out std_logic_vector(3 downto 0);end zhangying;architecture chw_arc of zhangying issignal fenpin:std_logic_vector(1 downto 0);s
27、ignal ad:std_logic_vector(3 downto 0);begin process(clk)-产生一个1s的fenpin信号模块 variable cnt:integer:=0; variable tmp:std_logic_vector(1 downto 0); begin if clkevent and clk=1 then if cnt50000 then cnt:=cnt+1; else cnt:=0; if tmp=11 then tmp:=00; else tmp:=tmp+1;end if; end if;end if;fenpin=tmp;end proce
28、ss;process(clk)-送16位地址程序variable js:integer:=0;variable cnt:std_logic_vector(3 downto 0); beginif clkevent and clk=1 then-当时?clk上升沿到来时,产生一个4位的2进制计数器cntif js10000 thenjs:=js+1;elsejs:=0;if cnt=1111 thencnt:=0000;else cnt:=cnt+1;end if;end if;end if;ad case ad is when 0000=datadatadatadatadatadatadata
29、datadatadatadatadatadatadatadatadatanull; end case; when 01= case ad is when 0000=datadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatanull; end case; when 10= case ad iswhen 0000=datadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatanull;end case; when 11=case ad iswhen 0000=datadatadatadatadatadatadatadatadatadatadatadatadatadatadatadatanull;end case; when others=null; end case;end process;addrs=ad;end chw_arc;