EDA课程设计报告-16-16点阵显示_第1页
EDA课程设计报告-16-16点阵显示_第2页
EDA课程设计报告-16-16点阵显示_第3页
EDA课程设计报告-16-16点阵显示_第4页
EDA课程设计报告-16-16点阵显示_第5页
已阅读5页,还剩22页未读 继续免费阅读

下载本文档

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

文档简介

《EDA技术与应用》课程设计任务书一、设计目的全面熟悉、掌握VHDL语言基本知识,掌握利用VHDL语言进行常用的组合逻辑电路和时序逻辑电路编辑,把电路EDA设计和实际结合起来,熟悉编制和调试电路代码的技巧,掌握分析结果的若干有效方法,进一步提高上机动手能力,培养综合电路的设计能力,初步养成规范代码的习惯和撰写规范文档资料的习惯。二、设计要求1、设计正确,方案合理。2、程序精炼,结构清晰。3、设计报告5000字以上,含程序设计说明,用户使用说明,源程序清单及程序框图。4、上机演示。5、有详细的文档。文档中包括设计思路、设计仿真程序、仿真结果及相应的分析与结论。三、进度安排第十九周星期一:14:30-18:30课题讲解,查阅资料星期四:8:30-12:30总体设计,详细设计星期四: 14:30-18:30编程,上机调试、修改程序星期五:8:30-12:30上机调试、完善程序星期五:14:30-18:30答辩星期六-星期天:撰写课程设计报告目录一、16*16点阵显示的总体设计……………21.116*16点阵显示系统实现目标与要求………21.2基本设计思想…………………3二、16*16点阵显示的功能实现……………42.1系统的总体框图………………42.2系统各模块详细设计…………42.3系统各功能模块的实现………9三、电路调试与仿真…………123.1错误的修改与认识………123.2系统仿真…………………13四、总结与体会………………13五、评分表…………15一16*16点阵显示总体设计1.116*16点阵显系统实现目标与要求一、问题描述:本实验主要完成汉字字符在LED上的显示,16*16扫描LED点阵的工作原理与8位扫描数码管类似。下面就本实验系统的16*16点阵的工件原理做一些简单的说明。16*16点阵由256个LED亮点通过排列组合而形成16行*16列的一个矩阵式的LED阵列,俗称16*16点阵。单个的LED的电路如下图1所示:图1单个LED电路图由上图可知,对于单个LED的电路图当Rn输入一个高电平,同时Cn接入一个低电平时,电路形成一个回路,LED发光。也就是LED点阵对应的这个点被点亮。16*16点阵也就是由16行和16列的LED组成,其中每一行的所有16个LED的Rn端并联在一起,每一列的所有16个LED的Cn端并联在一起。通过给Rn输入一个高电平,也就相当于给这一列所有LED输入了一个高电平,这时只要某个LED的Cn端输入一个低电平时,对应的LED就会被点亮。具体的电路如图2所示:图216*16点阵电路原理图在点阵上显示一字符是根据其字符在点阵上的显示的点的亮灭来表示的,如下图11-3所示:图11-3字符在点阵上的显示在上图中,显示的是一个“汉”字,只要将被“汉”字所覆盖的区域的点点亮,则在点阵中就会显示一个“汉”字。根据前面我们所介绍的点阵显示的原理,当我们选中第一列后,根据要显示汉字的第一列中所需要被点亮的点对应的Rn置为高电平,则在第一列中需要被点亮的点就会被点亮。依此类推,显示第二列、第三列……第N列中需要被点亮的点。然后根据人眼的视觉原理,将每一列显示的点的间隔时间设为一定的值,那么我们就会感觉显示一个完整的不闪烁的汉字。同时也可以按照这个原理来显示其它的汉字。下图11-4是一个汉字显示所需要的时序图:图11-4显示时序图二、功能描述:本实验的示例程序依次显示五个自行设定的汉字,要求每隔一秒换下一个字显示,并反复循环显示。三、测试:1、完成时序仿真2、完成下载到机箱的仿真1.2基本设计思想通过Whencase语句来控制端口的高低电平来使LED灯灭与亮来显示文字。在通过If语句每秒扫描每一千行,通过人眼的视觉残留效应来显示文字。扫描语句如下: ifres='0'thenh<="0000";col<=(others=>'0');number<=0;--复位键 elsifclk'eventandclk='1'then ifh>"1111"thenh<="0000"; else h<=h+1;number<=number+1; endif; ifnumber>998thennumber<=0;c<=c+1;--每一千次,换下一个汉字 ifcount>"101"thencount<="001";endif; ifc>6thenc<=0;endif; endif; 二16*16点阵的功能实现2.1系统的总体框图2.2系统各模块详细设计主要程序部分: entityIDEIIis port(clk,res:inbit; site:outbit;--显示灯的位置 count:bufferstd_logic_vector(0to2);--标志第几个汉字 c1:bufferstd_logic_vector(0to7);--显示灯的数值 c:bufferintegerrange0to7;--用于延迟汉字显示的时间 row,col:outstd_logic_vector(0TO15));--汉字的行和列 endIDEII; architecturebehavorofIDEIIis signalh:std_logic_vector(0to3); --signalc:integerrange0to8; signalnumber:integerrange0to999;--用于每扫描一个字,扫描一千行 begin process(h) begin casehis when"0000"=>row<="1111111111111110"; when"0001"=>row<="1111111111111101"; when"0010"=>row<="1111111111111011"; when"0011"=>row<="1111111111110111"; when"0100"=>row<="1111111111101111"; when"0101"=>row<="1111111111011111"; when"0110"=>row<="1111111110111111"; when"0111"=>row<="1111111101111111"; when"1000"=>row<="1111111011111111"; when"1001"=>row<="1111110111111111"; when"1010"=>row<="1111101111111111"; when"1011"=>row<="1111011111111111"; when"1100"=>row<="1110111111111111"; when"1101"=>row<="1101111111111111"; when"1110"=>row<="1011111111111111"; when"1111"=>row<="0111111111111111"; endcase; endprocess; process(clk,res,count,number,c) begin ifres='0'thenh<="0000";col<=(others=>'0');number<=0;--复位键 elsifclk'eventandclk='1'then ifh>"1111"thenh<="0000"; else h<=h+1;number<=number+1; endif; ifnumber>998thennumber<=0;c<=c+1;--每一千次,换下一个汉字 ifcount>"101"thencount<="001";endif; ifc>6thenc<=0;endif; endif; ifnumber=0then--用于延迟换字第一个1s第二个2s第三个3s第四五个1s casecis when0=>count<="001"; when1=>count<="010"; when3=>count<="011"; when6=>count<="100"; when7=>count<="101"; whenothers=>count<=count; endcase; endif; ifnumber<998ANDnumber/=0then--用于计数八秒 casecis when0=>c1<="11111100"; when1=>c1<="01100000"; when2=>c1<="11011010"; when3=>c1<="11110010"; when4=>c1<="01100110"; when5=>c1<="10110110"; when6=>c1<="00111110"; when7=>c1<="11100000"; endcase; endif; site<='1';流程图:主要部分扫描一千次的程序流程图:

2.3系统各功能模块的实现1汉字计数器,通过每秒扫描十六行共一千次。Clk时间设置为1khz所以每一秒显示一个汉字。程序如下:ifnumber>998thennumber<=0;c<=c+1;--每一千次,换下一个汉字 ifcount>"101"thencount<="001";endif; ifc>6thenc<=0;endif; endif; 2控制行与列的计数器,利用Whencase语句与If语句不断扫描每行与列来使汉字显示在LED灯上程序如下:casecountis when"001"=> casehis when"0000"=>col<="0000000000000000"; when"0001"=>col<="0000000000000000"; when"0010"=>col<="0000000000000000"; when"0011"=>col<="0000000000000000"; when"0100"=>col<="0000000000000000"; when"0101"=>col<="0000000000000000"; when"0110"=>col<="0000000000000000"; when"0111"=>col<="0000000000000000"; when"1000"=>col<="0111111111111110"; when"1001"=>col<="0000000000000000"; when"1010"=>col<="0000000000000000"; when"1011"=>col<="0000000000000000"; when"1100"=>col<="0000000000000000"; when"1101"=>col<="0000000000000000"; when"1110"=>col<="0000000000000000"; when"1111"=>col<="0000000000000000"; whenothers=>col<=null; endcase;3延迟功能。通过Whencase与分频器使不同秒数更换下一个汉字。程序如下: ifnumber=0then--用于延迟换字第一个1s第二个2s第三个3s第四五个1s casecis when0=>count<="001"; when1=>count<="010"; when3=>count<="011"; when6=>count<="100"; when7=>count<="101"; whenothers=>count<=count; endcase; endif;仿真图如下:4控制显示器显示八秒的计数,程序如下: ifnumber<998ANDnumber/=0then--用于计数八秒 casecis when0=>c1<="11111100"; when1=>c1<="01100000"; when2=>c1<="11011010"; when3=>c1<="11110010"; when4=>c1<="01100110"; when5=>c1<="10110110"; when6=>c1<="00111110"; when7=>c1<="11100000"; endcase; endif; site<='1';仿真图如下:八个信号控制八段字符译码器。5控制行与列程序段。因为需要显示汉字所以需要不断重复扫描每一行,每一列。所以写了一个whencase语句,是电频信号从1000000000000000到0000000000000001.三电路调试与仿真3.1错误的修改与认识1文件损坏因为U盘的原因使电脑在运行是发生错误,导致某些文件损坏以至于延迟了答辩时间,我不得不重新分配引脚,还要重写汉字所要的信号。2信号多次赋值因为在res复位的时候又一次向row赋值导致错误。导致从十一点到一点几个小时一直在找这个错误。十分痛心,认识到仔细的重要些。3.2系统仿真图1:设置的每个字延迟的仿真图图2:Row控制信号图3:Col控制信号四总结体会六月的天,午后的风。在这炎热的下午开始了我的首次EDA课程设计。在开始的时候,迷茫的我面对这陌生的课题手足无措。对于芯片引脚和VHDL程序变成实际的可以看到的LED显示汉字。深感有趣但又不知从何下手。于是和一起做同一个课题的同学一起讨论,分析历久传承的代码。虽然这些代码和自己思考的差不多,但还是不知道怎么样让程序点亮LED灯。在百思不得其解的时候,老师的一番演示犹如醍醐灌顶般让我有了初步了解。知道如何破解QuartusII7.2(32-Bit)。但是后面还是出现了很多问题。自己的QuartusII6.0使用时间到了,不能编译。然后到处找资源结果,病毒和绑定软件下满电脑。最后,有大佬帮助才安好QuartusII7.2(32-Bit)。然后,开始了本次课设。第一个下午结束后,回到宿舍开始考虑代码的主要构成。第一,端口要设置好,使LED灯能亮。第二,获取每个汉字的字模,第三,要在每一秒使十六行扫描一千次,才能利用视觉残留效应,使肉眼看到的汉字没有闪烁。第三,如何写一段程序使得每个字可以延时不同时间。第四,如何写一个计数程序。然后不断尝试,一步步完成,一遍遍调试,一次次改错,最后仿真。但出现了一个信号多次赋值的语法错误,一遍遍查找,一次次编译总是出错,从半夜到第二天,才发现是自己不小心将一个变量名弄错了。由此得出些许感悟,作为一个未来程序员,细心真的很重要啊。不然真的是几个小时为了一个变量名的错误的绝望。早起改代码。没看过凌晨四点的洛杉矶,但是看过凌晨四点的湖南工程学院!为了下午能早点去能用单片机实验。到了下午,代码下载的时候的欣喜,无法言语。但高兴不过两秒却发现跟本不亮。然后回去不断看代码才发现是res复原设置为了高电平由此一直没显示。后经过不断调试能显示了,但字确是反的,又得重新修改代码。最终,完成了本次实验的基本要求。为了添加计数的程序向同学请教和查看引脚分配文档。最终完成基本调试。也成功通过了答辩。通过本次课设实验首先感到写程序不易,其次对EDA知识有了更加深刻的了解,比如计数器等等。本次实践学习让我在课本知识上有了升华。在本次实验里不仅仅学到了关于EDA的一些课外知识更是加强了自己的实践能力。感谢老师们的付出使我们学有所获,深感快乐。五评分表计算机与通信学院课程设计评分表课题名称:项目评价设计方案的合理性与创造性设计与调试结果设计说明书的质量答辩陈述与回答问题情况课程设计周表现情况综合成绩教师签名:日期:附件:图纸:程序:libraryieee;useieee.std_logic_1164.all;useieee.std_logic_unsigned.all; entityIDEIIis port(clk,res:inbit; site:outbit;--显示灯的位置 count:bufferstd_logic_vector(0to2);--标志第几个汉字 c1:bufferstd_logic_vector(0to7);--显示灯的数值 c:bufferintegerrange0to7;--用于延迟汉字显示的时间 row,col:outstd_logic_vector(0TO15));--汉字的行和列 endIDEII; architecturebehavorofIDEIIis signalh:std_logic_vector(0to3); --signalc:integerrange0to8; signalnumber:integerrange0to999;--用于每扫描一个字,扫描一千行 begin process(h) begin casehis when"0000"=>row<="1111111111111110"; when"0001"=>row<="1111111111111101"; when"0010"=>row<="1111111111111011"; when"0011"=>row<="1111111111110111"; when"0100"=>row<="1111111111101111"; when"0101"=>row<="1111111111011111"; when"0110"=>row<="1111111110111111"; when"0111"=>row<="1111111101111111"; when"1000"=>row<="1111111011111111"; when"1001"=>row<="1111110111111111"; when"1010"=>row<="1111101111111111"; when"1011"=>row<="1111011111111111"; when"1100"=>row<="1110111111111111"; when"1101"=>row<="1101111111111111"; when"1110"=>row<="1011111111111111"; when"1111"=>row<="0111111111111111"; endcase; endprocess; process(clk,res,count,number,c) begin ifres='0'thenh<="0000";col<=(others=>'0');number<=0;--复位键 elsifclk'eventandclk='1'then ifh>"1111"thenh<="0000"; else h<=h+1;number<=number+1; endif; ifnumber>998thennumber<=0;c<=c+1;--每一千次,换下一个汉字 ifcount>"101"thencount<="001";endif; ifc>6thenc<=0;endif; endif; ifnumber=0then--用于延迟换字第一个1s第二个2s第三个3s第四五个1s casecis when0=>count<="001"; when1=>count<="010"; when3=>count<="011"; when6=>count<="100"; when7=>count<="101"; whenothers=>count<=count; endcase; endif; ifnumber<998ANDnumber/=0then--用于计数八秒 casecis when0=>c1<="11111100"; when1=>c1<="01100000"; when2=>c1<="11011010"; when3=>c1<="11110010"; when4=>c1<="01100110"; when5=>c1<="10110110"; when6=>c1<="00111110"; when7=>c1<="11100000"; endcase; endif; site<='1'; casecountis when"001"=> casehis when"0000"=>col<="0000000000000000"; when"0001"=>col<="0000000000000000"; when"0010"=>col<="0000000000000000"; when"0011"=>col<="0000000000000000"; when"0100"=>col<="0000000000000000"; when"0101"=>col<="0000000000000000"; when"0110"=>col<="0000000000000000"; when"0111"=>col<="0000000000000000"; when"1000"=>col<="0111111111111110"; when"1001"=>col<="0000000000000000"; when"1010"=>col<="0000000000000000"; when"1011"=>col<="0000000000000000"; when"1100"=>col<="0000000000000000"; when"1101"=>col<="0000000000000000"; when"1110"=>col<="0000000000000000"; when"1111"=>col<="0000000000000000"; whenothers=>col<=null; endcase; when"010"=> casehis when"0000"=>col<="0000000000000000"; when"0001"=>col<="0000000000000000"; when"0010"=>col<="0111111111111110"; when"0011"=>col<="0000000000000000"; when"0100"=>col<="0000000000000000"; when"0101"=>col<="0000000000000000"; when"0110"=>col<="0000000000000000"; when"0111"=>col<="0000000000000000"; when"1000"=>col<="0000000000000000"; when"1001"=>col<="0000000000000000"; when"1010"=>col<="0000000000000000"; when"1011"=>col<="0000000000000000"; when"1100"=>col<="0011111111111000"; when"1101"=>col<="0000000000000000"; when"1110"=>col<="0000000000000000"; when"1111"=>col<="0000000000000000"; whenothers=>col<=null; endcase; when"011"=> casehis when"0000"=>col<="0000000000000000"; when"0001"=>col<="0000000000000000"; when"0010"=>col<="0111111111111100"; when"0011"=>col<="0000000000000000"; when"0100"=>col<="0000000000000000"; when"0101"=>col<="0000000000000000"; when"0110"=>col<="0000000000000000"; when"0111"=>col<="0011111111111100"; when"1000"=>col<="0000000000000000"; when"1001"=>col<="0000000000000000"; when"1010"=>col<="0000000000000000"; when"1011"=>col<="0000000000000000"; when"1100"=>col<="0000000000000000"; when"1101"=>col<="0111111111111110"; when"1110"=>col<="0000000000000000"; when"1111"=>col<="0000000000000000"; endcase; when"100"=> casehis when"0000"=>col<="0000000000000000"; when"0001"=>col<="0100000000000100"; when"0010"=>col<="0111111111111100"; when"0011"=>col<="0100000000000100"; when"0100"=>col<="0110000000000100";

温馨提示

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

评论

0/150

提交评论