课程设计课程名称嵌入式系统课程设计课题名称16X16的点阵显示设计专业班级学号姓名指导老师2016年12月20日电气信息学院课程设计任务书课题名称16×16的点阵显示设计姓名专业班级学号指导老师课程设计时间2016年12月18日-2016年12月30日(17、18周)教研室意见意见:同意审核人:刘望军一、任务及要求CPLD为复杂可编程逻辑器件,通过EDA技术对其进行编程,可将一个较复杂的数字系统集成于一个芯片中,制成专用集成电路芯片,并可随时在系统修改其逻辑功能。并最终完成电路的编程调试。具体要求如下:用一个16×16的点阵使用逐列循环扫描的方式不间断的显示你姓名的全部大写拼音字母。二、进度安排第一周:周一:集中布置课程设计相关事宜。周二~周三:子模块程序设计,顶层电路程序设计。周四~周日:子模块,顶层电路仿真。第二周:周一~周三:编程下载,系统调试。周四~周五:设计报告撰写。周五进行答辩和设计结果检查。三、参考资料1.张原编著,可编程逻辑器件设计及应用,机械工业出版社。2.荀殿栋,徐志军编著,数字电路设计实用手册,电子工业出版社。3.刘洪喜,陆颖编著.VHDL电路设计实用教程清华大学出版社。目录1.总体设计思路与功能设计.............................11.1.基本原理......................................11.2.总体设计框图..................................21.3.顶层文件设计..................................22.单元电路设计......................................32.1列循环扫描模块................................32.2字符样式设计模块..............................32.3循环扫描及延时模块............................42.4整个程序......................................53.系统调试与仿真.....................................93.1开发环境介绍..................................93.2.1创建工程....................................93.2.2编译前设计..................................93.2.3全程编译...................................113.2.4时序仿真...................................124.下载调试.........................................135.心得体会.........................................146.参考文献.........................................14一、总体设计思路1.1基本原理LED就是LightEmittingDiode(发光二极管)的缩写。在某些半导体材料的PN结中,注入的少数载流子与多数载流子复合时会把多余的能量以光的形式释放出来,从而把电能直接转换为光能。PN结加反向电压,少数载流子难以注入,故不发光。这种利用注入式电致发光原理制作的二极管叫发光二极管,通称LED。LED显示屏是一种通过控制半导体发光二极管的显示方式,用来显示文字、图形、图像、动画、行情、视频、录像信号等各种信息的显示屏幕。16×16扫描LED点阵的工作原理同8位扫描数码管类似。它有16个共阴极输出端口,每个共阴极对应有16个LED显示灯,所以其扫描译码地址需4位信号线(SEL0-SEL3),其汉字扫描码由16位段地址(0-15)输入。通过时钟的每列扫描显示完整汉字。点阵LED一般采用扫描式显示,实际运用分为三种方式:(1)点扫描(2)行扫描(3)列扫描若使用第一种方式,其扫描频率必须大于16×64=1024Hz,周期小于1ms即可。若使用第二和第三种方式,则频率必须大于16×8=128Hz,周期小于7.8ms即可符合视觉暂留要求。此外一次驱动一列或一行(8颗LED)时需外加驱动电路提高电流,否则LED亮度会不足。实验箱上为我们提供了16*16的点阵显示模块。通过观察,我们可以看到,此点阵显示屏即为16行、16列的LED显示灯。那么控制这些灯的亮暗分布,就能达到字符显示的目的。首先输出预定义“吕、苏、田、口”四个汉字,显示屏上的灯的亮暗情况具体应如何。如第一个汉字吕:0000000000000000000000000000000000000000011111000011111101000100001000010100010000100001010001000010000101000100001000010100010000100001010001000010000101000100001111110100010000000000010001000000000001111100000000000000000000000000000000000000000000000000如果高电平‘1’时表示灯是亮的,低电平‘0’时灯是暗的,这样上面的灯呈现在我们眼前的就是吕字了。依次类推,我们就可以设计出所有要显示的汉字了。这样这些汉字就好象是被我们当作了固定模型了。但如何点亮这些灯呢,这就要求有一个脉冲循环扫描的电路,我们采用列扫描,当扫描的和我们先设计好的汉字模型的高电平相匹配时,灯就相应的点亮。由于扫描的速度很快,我们人的眼睛并不会感到灯的闪烁,所以每扫描完16列就会显示在我们眼中一个汉字了。但要所有的汉字就可以依次的显示出来并不停的循环显示,就还要再有一个时序控制电路来控制。此时序控制电路象一个计数器,有自动清零的功能,这样就可以实现循环的效果了。1.2设计框图图1.2总体设计框图1.3顶层文件设计图1.3顶层文件设计时序控制扫描控制显示控制译码输出二、单元电路设计2.1列循环扫描通过对每一列的扫描来完成对字母的现实,只要扫描的频率足够快,就能给人以连续的感觉。因此要控制扫描的频率,不能太低,否则,就会造成视觉上的不连续,输入一个时钟信号,输出为4位二进制(用sel表示)列选信号,用来选中列,进行扫描,扫描程序如下:Libraryieee;useieee.std_logic_1164.all;useieee.std_logic_unsigned.all;Entitydz_xsisPort(enable,clk:instd_logic;--端口定义输入信号Sel:outstd_logic_vector(3downto0));--端口定义输出信号Enddz_xs;Architecturecountofdz_xsisSignallie:std_logic_vector(3downto0);BeginProcess(clk,enable)--脉冲、使能信号beginIfclk'eventandclk='1'thenIfenable='1'thenIflie0000thenLie=lie-0001;ElseLie=1111;Endif;Endif;Endif;Sel=lie;Endprocess;2.2字符样式设计本环节是建立一个数据库,使之能在扫描的同时读取所需要的信息,从而完成汉字的显示。本次设计“吕、苏、田、口”汉字样式设计程序如下:Libraryieee;useieee.std_logic_1164.all;useieee.std_logic_unsigned.all;Entitydz_xsisPort(enable,clk:instd_logic;--端口定义输入信号h0,h8:outstd_logic_vector(7downto0));--端口定义输出信号(h0-列数据输出,h8-代表行数据输出)Enddz_xs;Architecturecountofdz_xsisSignallie:std_logic_vector(3downto0);--信号标志Signalpast1:std_logic_vector(1downto0);BeginProcess(enable,clk)--脉冲、使能信号BeginIfclk'eventandclk='1'thenIfenable='1'thenCaselieisWhen00=Caselieis--“吕”字设计When0011=h0=00000000;h8=01111110;When0100=h0=01111110;h8=01000010;When0101=h0=01000010;h8=01000010;When0110=h0=01000010;h8=01000010;When0111=h0=01000010;h8=01000010;When1000=h0=01000010;h8=01000010;When1001=h0=01000010;h8=01000010;When1010=h0=01000010;h8=01000010;When1011=h0=01000010;h8=01000010;When1100=h0=01111110;h8=01000010;When1101=h0=00000000;h8=01111110;Whenothers=h0=00000000;h8=00000000;Endcase;When01=Caselieis--“苏”字设计When0011=h0=00100000;h8=00000000;When0100=h0=00100000;h8=00000000;When0101=h0=00100000;h8=10001100;When0110=h0=01110000;h8=10000000;When0111=h0=00101000;h8=10000000;When1000=h0=00100011;h8=11111100;When1001=h0=00100000;h8=10000000;When1010=h0=00101000;h8=10001100;When1011=h0=01110000;h8=10000110;When1100=h0=00100000;h8=11111110;When1101=h0=00100000;h8=00001100;Whenothers=h0=00000000;h8=00000000;Endcase;When10=Caselieis--“田”字设计When0100=h0=00011111;h8=11110000;When0101=h0=00010001;h8=00010000;When0110=h0=00010001;h8=00010000;When0111=h0=00010001;h8=00010000;When1000=h0=00011111;h8=11110000;When1001=h0=00010001;h8=00010000;When1010=h0=00010001;h8=00010000;When1011=h0=00010001;h8=00010000;When1100=h0=00011111;h8=11110000;Whenothers=h0=00000000;h8=00000000;Endcase;When11=Caselieis--“口”字设计When0101=h0=00011111;h8=11100000;When0110=h0=00010000;h8