




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、课 程 设 计课程名称嵌入式系统课程设计课题名称 16X16的点阵显示设计专 业班 级学 号姓 名指导老师2016年12月20日电气信息学院课程设计任务书课题名称16×16的点阵显示设计姓 名专业班级 学号指导老师课程设计时间2016年12月18日-2016年12月30日(17、18周)教研室意见意见:同意 审核人:刘望军一、任务及要求CPLD为复杂可编程逻辑器件,通过EDA技术对其进行编程,可将一个较复杂的数字系统集成于一个芯片中,制成专用集成电路芯片,并可随时在系统修改其逻辑功能。并最终完成电路的编程调试。具体要求如下:用一个16×16的点阵使用逐列循环扫描的方式不间断
2、的显示你姓名的全部大写拼音字母。二、进度安排第一周:周一:集中布置课程设计相关事宜。周二周三:子模块程序设计,顶层电路程序设计。周四周日:子模块,顶层电路仿真。第二周:周一周三:编程下载,系统调试。周四周五:设计报告撰写。周五进行答辩和设计结果检查。三、参考资料1. 张 原编著,可编程逻辑器件设计及应用,机械工业出版社。2.荀殿栋,徐志军编著,数字电路设计实用手册,电子工业出版社。3. 刘洪喜,陆颖编著. VHDL电路设计实用教程 清华大学出版社。 目 录1.总体设计思路与功能设计11.1.基本原理11.2.总体设计框图21.3.顶层文件设计22.单元电路设计32.1列循环扫描模块32.2字符
3、样式设计模块32.3循环扫描及延时模块42.4整个程序53.系统调试与仿真93.1 开发环境介绍93.2.1 创建工程93.2.2 编译前设计93.2.3 全程编译113.2.4时序仿真124.下载调试135.心得体会146.参考文献141、 总体设计思路 1.1基本原理 LED 就是Light Emitting Diode(发光二极管)的缩写。在某些半导体材料的PN结中,注入的少数载流子与多数载流子复合时会把多余的能量以光的形式释放出来,从而把电能直接转换为光能。PN结加反向电压,少数载流子难以注入,故不发光。这种利用注入式电致发光原理制作的二极管叫发光二极管,
4、通称LED。LED显示屏是一种通过控制半导体发光二极管的显示方式,用来显示文字、图形、图像、动画、行情、视频、录像信号等各种信息的显示屏幕。 16×16扫描LED点阵的工作原理同8位扫描数码管类似。它有16个共阴极输出端口,每个共阴极对应有16个LED显示灯,所以其扫描译码地址需4位信号线(SEL0-SEL3),其汉字扫描码由16位段地址(0-15)输入。 通过时钟的每列扫描显示完整汉字。点阵LED一般采用扫描式显示,实际运用分为三种方式: (1)点扫描(2)行扫描(3)列扫描若使用第一种方式,其扫描频率必须大于16×64=1024Hz,周期小于1ms即可。若使用
5、第二和第三种方式,则频率必须大于16×8=128Hz,周期小于7.8ms即可符合视觉暂留要求。此外一次驱动一列或一行(8颗LED)时需外加驱动电路提高电流,否则LED亮度会不足。实验箱上为我们提供了16*16的点阵显示模块。通过观察,我们可以看到,此点阵显示屏即为16行、16列的LED显示灯。那么控制这些灯的亮暗分布,就能达到字符显示的目的。首先输出预定义“吕、苏、田、口”四个汉字,显示屏上的灯的亮暗情况具体应如何。如第一个汉字吕:00000000000000000000000000000000000000000111110000111111010001000010000101000
6、10000100001010001000010000101000100001000010100010000100001010001000010000101000100001111110100010000000000010001000000000001111100000000000000000000000000000000000000000000000000如果高电平1时表示灯是亮的,低电平0时灯是暗的,这样上面的灯呈现在我们眼前的就是吕字了。依次类推,我们就可以设计出所有要显示的汉字了。这样这些汉字就好象是被我们当作了固定模型了。但如何点亮这些灯呢,这就要求有一个脉冲循环扫描的电路,我们采用列
7、扫描,当扫描的和我们先设计好的汉字模型的高电平相匹配时,灯就相应的点亮。由于扫描的速度很快,我们人的眼睛并不会感到灯的闪烁,所以每扫描完16列就会显示在我们眼中一个汉字了。但要所有的汉字就可以依次的显示出来并不停的循环显示,就还要再有一个时序控制电路来控制。此时序控制电路象一个计数器,有自动清零的功能,这样就可以实现循环的效果了。1.2设计框图时序控制扫描控制显示控制译码输出 图1.2 总体设计框图1.3顶层文件设计 图1.3 顶层文件设计二、单元电路设计 2.1列循环扫描 通过对每一列的扫描来完成对字母的现实,只要扫描的频率足够快,就能给人以连续的感觉。因此要控制扫描的频率,不能太
8、低,否则,就会造成视觉上的不连续, 输入一个时钟信号,输出为4位二进制(用sel表示)列选信号,用来选中列,进行扫描,扫描程序如下:Library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;Entity dz_xs is Port(enable,clk:in std_logic; -端口定义 输入信号 Sel:out std_logic_vector(3 downto 0); -端口定义 输出信号End dz_xs;Architecture count of dz_xs is Signal lie:std_
9、logic_vector(3 downto 0);BeginProcess(clk,enable) -脉冲、使能信号beginIf clk'event and clk='1'thenIf enable='1' thenIf lie>"0000" then Lie<=lie-"0001"Else Lie<="1111"End if;End if;End if;Sel<=lie;End process;2.2字符样式设计 本环节是建立一个数据库,使之能在扫描的同时读
10、取所需要的信息,从而完成汉字的显示。本次设计“吕、苏、田、口”汉字样式设计程序如下: Library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;Entity dz_xs is Port(enable,clk:in std_logic; -端口定义 输入信号 h0,h8:out std_logic_vector(7 downto 0); -端口定义 输出信号(h0-列数据输出,h8-代表行数据输出)End dz_xs;Architecture count of dz_xs is Signal lie:std_
11、logic_vector(3 downto 0); -信号标志Signal past1:std_logic_vector(1 downto 0);BeginProcess(enable,clk) -脉冲、使能信号BeginIf clk'event and clk='1'thenIf enable='1' thenCase lie isWhen "00"=>Case lie is -“吕”字设计When "0011"=>h0<="00000000"h8<="011
12、11110"When "0100"=>h0<="01111110"h8<="01000010"When "0101"=>h0<="01000010"h8<="01000010"When "0110"=>h0<="01000010"h8<="01000010"When "0111"=>h0<="01000010&q
13、uot;h8<="01000010"When "1000"=>h0<="01000010"h8<="01000010"When "1001"=>h0<="01000010"h8<="01000010"When "1010"=>h0<="01000010"h8<="01000010"When "1011"=>h0&
14、lt;="01000010"h8<="01000010"When "1100"=>h0<="01111110"h8<="01000010"When "1101"=>h0<="00000000"h8<="01111110"When others=>h0<="00000000"h8<="00000000"End case;When "
15、;01"=>Case lie is -“苏”字设计When "0011"=>h0<="00100000"h8<="00000000"When "0100"=>h0<="00100000"h8<="00000000"When "0101"=>h0<="00100000"h8<="10001100"When "0110"=>h
16、0<="01110000"h8<="10000000"When "0111"=>h0<="00101000"h8<="10000000"When "1000"=>h0<="00100011"h8<="11111100"When "1001"=>h0<="00100000"h8<="10000000"When &q
17、uot;1010"=>h0<="00101000"h8<="10001100"When "1011"=>h0<="01110000"h8<="10000110"When "1100"=>h0<="00100000"h8<="11111110"When "1101"=>h0<="00100000"h8<="0
18、0001100"When others=>h0<="00000000"h8<="00000000"End case;When "10"=>Case lie is -“田”字设计 When"0100"=>h0<="00011111"h8<="11110000"When"0101"=>h0<="00010001"h8<="00010000"When&q
19、uot;0110"=>h0<="00010001"h8<="00010000"When"0111"=>h0<="00010001"h8<="00010000"When"1000"=>h0<="00011111"h8<="11110000"When"1001"=>h0<="00010001"h8<="0001
20、0000"When"1010"=>h0<="00010001"h8<="00010000"When"1011"=>h0<="00010001"h8<="00010000"When"1100"=>h0<="00011111"h8<="11110000"When others=>h0<="00000000"h8<=&qu
21、ot;00000000"End case;When "11"=>Case lie is -“口”字设计When"0101"=>h0<="00011111"h8<="11100000"When"0110"=>h0<="00010000"h8<="00100000"When"0111"=>h0<="00010000"h8<="00100000
22、"When"1000"=>h0<="00010000"h8<="00100000"When"1001"=>h0<="00010000"h8<="00100000"When"1010"=>h0<="00010000"h8<="00100000"When"1011"=>h0<="00011111"h8<
23、;="11100000"When others=>h0<="00000000"h8<="00000000" End case; End if; End if;End process;2.3循环扫描及期间的延时环节 为使汉字不断地循环显示,并且使每个汉字之间有停顿,就需要在中间加一定的延时和循环环节。在这一环节中,可以通过修改其数值来控制每个字母的显示时间,其程序如下:process(clk) variable int: integer range 0 to 10000;begin if clkevent and cl
24、k=1then if int<10000 then int:=int+1; elseint:=0; if next1=”11”thennext1<=”00”; elsenext1<= next1+1; end if; end if;end if;end process;2.4总程序library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity yz_ok is port(enable,clk:in std_logic; sel:out std_logic_vector(3 down
25、to 0);h0,h8:out std_logic_vector(7 downto 0);end yz_ok;architecture count of yz_ok is signal lie:std_logic_vector(3 downto 0); signal next1: std_logic_vector(1 downto 0);begina1:process(clk,enable)beginIf clk'event and clk='1'thenIf enable='1' thenIf lie>"0000" then
26、Lie<=lie-"0001"Else Lie<="1111"End if; End if;End if;Sel<=lie;End process;a2:process(enable,clk)beginIf clk'event and clk='1'thenIf enable='1' thenCase next1 isWhen "00"=>Case lie is When "0011"=>h0<="00000000"h8
27、<="01111110"When "0100"=>h0<="01111110"h8<="01000010"When "0101"=>h0<="01000010"h8<="01000010"When "0110"=>h0<="01000010"h8<="01000010"When "0111"=>h0<=&q
28、uot;01000010"h8<="01000010"When "1000"=>h0<="01000010"h8<="01000010"When "1001"=>h0<="01000010"h8<="01000010"When "1010"=>h0<="01000010"h8<="01000010"When "1011
29、"=>h0<="01000010"h8<="01000010"When "1100"=>h0<="01111110"h8<="01000010"When "1101"=>h0<="00000000"h8<="01111110"When others=>h0<="00000000"h8<="00000000"End c
30、ase;When "01"=>Case lie is When "0011"=>h0<="00100000"h8<="00000000"When "0100"=>h0<="00100000"h8<="00000000"When "0101"=>h0<="00100000"h8<="10001100"When "0110"
31、;=>h0<="01110000"h8<="10000000"When "0111"=>h0<="00101000"h8<="10000000"When "1000"=>h0<="00100011"h8<="11111100"When "1001"=>h0<="00100000"h8<="10000000"
32、When "1010"=>h0<="00101000"h8<="10001100"When "1011"=>h0<="01110000"h8<="10000110"When "1100"=>h0<="00100000"h8<="11111110"When "1101"=>h0<="00100000"h8<=
33、"00001100"When others=>h0<="00000000"h8<="00000000"End case;When "10"=>Case lie is When"0100"=>h0<="00011111"h8<="11110000"When"0101"=>h0<="00010001"h8<="00010000"When&qu
34、ot;0110"=>h0<="00010001"h8<="00010000"When"0111"=>h0<="00010001"h8<="00010000"When"1000"=>h0<="00011111"h8<="11110000"When"1001"=>h0<="00010001"h8<="00010
35、000"When"1010"=>h0<="00010001"h8<="00010000"When"1011"=>h0<="00010001"h8<="00010000"When"1100"=>h0<="00011111"h8<="11110000"When others=>h0<="00000000"h8<=&quo
36、t;00000000" End case;When "11"=>Case lie is When"0101"=>h0<="00011111"h8<="11100000"When"0110"=>h0<="00010000"h8<="00100000"When"0111"=>h0<="00010000"h8<="00100000"W
37、hen"1000"=>h0<="00010000"h8<="00100000"When"1001"=>h0<="00010000"h8<="00100000"When"1010"=>h0<="00010000"h8<="00100000"When"1011"=>h0<="00011111"h8<="
38、;11100000"When others=>h0<="00000000"h8<="00000000" End case;When others=>h0<="00000000"h8<="00000000" End case; End if; End if;End process;a3:process(clk) variable int: integer range 0 to 10000;begin if clk'event and clk='1'
39、then if int<10000 then int:=int+1; elseint:=0; if next1="11"thennext1<="00" elsenext1<= next1+'1' end if; end if;end if;end process;end count;第三章 系统调试与仿真3.1开发环境介绍Quartus II 是Altera公司的综合性PLD开发软件,支持原理图、VHDL、Veril-ogHDL以及AHDL(Altera Hardware Description Language)等多种
40、设计输入形式,内嵌自有的综合器以及仿真器,可以完成从设计输入到硬件配置的完整PLD设计流程。Quartus II支持Altera的IP核,包含了LPM/MegaFunction宏功能模块库,使用户可以充分利用成熟的模块,简化了设计的复杂性、加快了设计速度。对第三方EDA工具的良好支持也使用户可以在设计流程的各个阶段使用熟悉的第三方EDA工具。此外,Quartus II 通过和DSP Builder工具与Matlab/Simulink相结合,可以方便地实现各种DSP应用系统;支持Altera的片上可编程系统(SOPC)开发,集系统级设计、嵌入式软件开发、可编程逻辑设计于一体,是一种综合性的开发平
41、台。3.2调试与仿真3.2.1 创建工程在Quartus II 中新建一个VHDL File文件,将VHDL代码输入这个文件,并保存到工作目录,名为yz_ok.vhd。利用new preject wizard 工具创建一个工程,工程名为yz_ok,顶层文件实体名为 yz_ok,并将上面创建的yz_ok.vhd文件加入到工程中。3.2.2 编译前设置(1)选择目标芯片。用assignmemts-àsettings命令,弹出settings对话框,选择目标芯片为EP1C3T144C8。图3-1 选择目标器件(2)选择工作方式,编程方式,及闲置引脚状态单击上图中的device&a
42、mp;pin options按钮,弹出device&pin options窗口。 在General项中选中auto-restart configuration after error,使对FPGA的配置失败后能自动重新配置,并加入JTAG用户编码。 图3-2 选择配置器件工作方式在configuration项中,其下方的Generate compressed bitstreams处打勾,这样就能产生用于EPCS的POF压缩配置文件。在Configuration 选项页,选择配置器件为EPCS1,其配置模式选择为active serial。图3-3选择编程方式在Unused pins项,
43、将目标器件闲置引脚状态设置高阻态,即选择As input,tri-stated。图3-4 设置闲置引脚状态3.2.3 全程编译设置好前面的内容之后,就可以进行编译了。选择Processing菜单中start compilation,在窗口的下方processing栏中显示编译信息。图3-5 全程编译成功完成完成后在工程管理窗口左是角显示了工程yz_ok 的层次结构和其中结构模块耗用的逻辑宏单元数。此栏的右边是编译处理流程,包括数据网表建立、逻辑综合、适配、配置文件装配和时序分析等。3.2.4时序仿真(1)新建一个矢量波形文件,同时打开波形编辑器。设置仿真时间为50us,保存波形文件为yz_ok.vwf。(2)将工程yz_ok的端口信号名选入波形编辑器中,所选的端口有clk,enable及总线h0和h8。设置clk的时钟周期为2us,占空比为50%。图3-6 选择仿真控制仿真器参数设置。选择菜单Assignment中的Settings,在Settings窗口下选择Simulator,在右侧的simulation mode项下选择timing,即选择时序仿真,并选择仿真激励文件名yz_ok.vwf。选择simulation options栏,确认选定simulation coverag
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
评论
0/150
提交评论