课 程 设 计
| 课程名称 | 嵌入式系统课程设计 |
| 课题名称 | 16X16的点阵显示设计 |
| 专 业 | |
| 班 级 | |
| 学 号 | |
| 姓 名 | |
| 指导老师 |
电气信息学院
课程设计任务书
| 课题名称 | 16×16的点阵显示设计 | |||||||
| 姓 名 | 专业 | 班级 | 学号 | |||||
| 指导老师 | ||||||||
| 课程设计时间 | 2016年12月18日-2016年12月30日(17、18周) | |||||||
| 教研室意见 | 意见:同意 审核人:刘望军 | |||||||
CPLD为复杂可编程逻辑器件,通过EDA技术对其进行编程,可将一个较复杂的数字系统集成于一个芯片中,制成专用集成电路芯片,并可随时在系统修改其逻辑功能。并最终完成电路的编程调试。具体要求如下:
用一个16×16的点阵使用逐列循环扫描的方式不间断的显示你姓名的全部大写拼音字母。
二、进度安排
第一周:
周一:集中布置课程设计相关事宜。
周二~周三:子模块程序设计,顶层电路程序设计。
周四~周日:子模块,顶层电路仿真。
第二周:
周一~周三:编程下载,系统调试。
周四~周五:设计报告撰写。周五进行答辩和设计结果检查。
三、参考资料
1. 张 原编著,可编程逻辑器件设计及应用,机械工业出版社。
2.荀殿栋,徐志军编著,数字电路设计实用手册,电子工业出版社。
3. 刘洪喜,陆颖编著. VHDL电路设计实用教程 清华大学出版社。
1.3.顶层文件设计 2
一、总体设计思路
1.1基本原理
LED 就是Light Emitting Diode(发光二极管)的缩写。在某些半导体材料的PN结中,注入的少数载流子与多数载流子复合时会把多余的能量以光的形式释放出来,从而把电能直接转换为光能。PN结加反向电压,少数载流子难以注入,故不发光。这种利用注入式电致发光原理制作的二极管叫发光二极管,通称LED。LED显示屏是一种通过控制半导体发光二极管的显示方式,用来显示文字、图形、图像、动画、行情、视频、录像信号等各种信息的显示屏幕。
16×16扫描LED点阵的工作原理同8位扫描数码管类似。它有16个共阴极输出端口,每个共阴极对应有16个LED显示灯,所以其扫描译码地址需4位信号线(SEL0-SEL3),其汉字扫描码由16位段地址(0-15)输入。 通过时钟的每列扫描显示完整汉字。
点阵LED一般采用扫描式显示,实际运用分为三种方式:
(1)点扫描
(2)行扫描
(3)列扫描
若使用第一种方式,其扫描频率必须大于16×=1024Hz,周期小于1ms即可。若使用第二和第三种方式,则频率必须大于16×8=128Hz,周期小于7.8ms即可符合视觉暂留要求。此外一次驱动一列或一行(8颗LED)时需外加驱动电路提高电流,否则LED亮度会不足。
实验箱上为我们提供了16*16的点阵显示模块。通过观察,我们可以看到,此点阵显示屏即为16行、16列的LED显示灯。那么控制这些灯的亮暗分布,就能达到字符显示的目的。首先输出预定义“吕、苏、田、口”四个汉字,显示屏上的灯的亮暗情况具体应如何。
如第一个汉字吕:
0000000000000000
0000000000000000
0000000001111100
0011111101000100
0010000101000100
0010000101000100
0010000101000100
0010000101000100
0010000101000100
0010000101000100
0011111101000100
0000000001000100
0000000001111100
0000000000000000
0000000000000000
0000000000000000
如果高电平‘1’时表示灯是亮的,低电平‘0’时灯是暗的,这样上面的灯呈现在我们眼前的就是吕字了。依次类推,我们就可以设计出所有要显示的汉字了。这样这些汉字就好象是被我们当作了固定模型了。但如何点亮这些灯呢,这就要求有一个脉冲循环扫描的电路,我们采用列扫描,当扫描的和我们先设计好的汉字模型的高电平相匹配时,灯就相应的点亮。由于扫描的速度很快,我们人的眼睛并不会感到灯的闪烁,所以每扫描完16列就会显示在我们眼中一个汉字了。但要所有的汉字就可以依次的显示出来并不停的循环显示,就还要再有一个时序控制电路来控制。此时序控制电路象一个计数器,有自动清零的功能,这样就可以实现循环的效果了。
1.2设计框图
图1.2 总体设计框图
1.3顶层文件设计
图1.3 顶层文件设计
二、单元电路设计
2.1列循环扫描
通过对每一列的扫描来完成对字母的现实,只要扫描的频率足够快,就能给人以连续的感觉。因此要控制扫描的频率,不能太低,否则,就会造成视觉上的不连续, 输入一个时钟信号,输出为4位二进制(用sel表示)列选信号,用来选中列,进行扫描,扫描程序如下:
Library ieee;
use ieee.std_logic_11.all;
use ieee.std_logic_unsigned.all;
Entity dz_xs is
Port(enable,clk:in std_logic; --端口定义 输入信号
端口定义 输出信号
End dz_xs;
Architecture count of dz_xs is
Signal lie:std_logic_vector(3 downto 0);
Begin
P脉冲、使能信号
begin
If clk'event and clk='1'then
If enable='1' then
If lie>"0000" then
Lie<=lie-"0001";
Else
Lie<="1111";
End if; End if;
End if;
Sel<=lie;
End process;
2.2字符样式设计
本环节是建立一个数据库,使之能在扫描的同时读取所需要的信息,从而完成汉字的显示。本次设计“吕、苏、田、口”汉字样式设计程序如下:
Library ieee;
use ieee.std_logic_11.all;
use ieee.std_logic_unsigned.all;
Entity dz_xs is
端口定义 输入信号
端口定义 输出信号(h0-列数据输出,h8-代表行数据输出)
End dz_xs;
Architecture count of dz_xs is
Signal lie:std_logic_vector(3 downto 0); --信号标志
Signal past1:std_logic_vector(1 downto 0);
Begin
P脉冲、使能信号
Begin
If clk'event and clk='1'then
If enable='1' then
Case lie is
When "00"=>
C“吕”字设计
When "0011"=>h0<="00000000";h8<="01111110";
When "0100"=>h0<="01111110";h8<="01000010";
When "0101"=>h0<="01000010";h8<="01000010";
When "0110"=>h0<="01000010";h8<="01000010";
When "0111"=>h0<="01000010";h8<="01000010";
When "1000"=>h0<="01000010";h8<="01000010";
When "1001"=>h0<="01000010";h8<="01000010";
When "1010"=>h0<="01000010";h8<="01000010";
When "1011"=>h0<="01000010";h8<="01000010";
When "1100"=>h0<="01111110";h8<="01000010";
When "1101"=>h0<="00000000";h8<="01111110";
When others=>h0<="00000000";h8<="00000000";
End case;
When "01"=>
C“苏”字设计
When "0011"=>h0<="00100000";h8<="00000000";
When "0100"=>h0<="00100000";h8<="00000000";
When "0101"=>h0<="00100000";h8<="10001100";
When "0110"=>h0<="01110000";h8<="10000000";
When "0111"=>h0<="00101000";h8<="10000000";
When "1000"=>h0<="00100011";h8<="11111100";
When "1001"=>h0<="00100000";h8<="10000000";
When "1010"=>h0<="00101000";h8<="10001100";
When "1011"=>h0<="01110000";h8<="10000110";
When "1100"=>h0<="00100000";h8<="11111110";
When "1101"=>h0<="00100000";h8<="00001100";
When others=>h0<="00000000";h8<="00000000";
End case;
When "10"=>
C“田”字设计
When"0100"=>h0<="00011111";h8<="11110000";
When"0101"=>h0<="00010001";h8<="00010000";
When"0110"=>h0<="00010001";h8<="00010000";
When"0111"=>h0<="00010001";h8<="00010000";
When"1000"=>h0<="00011111";h8<="11110000";
When"1001"=>h0<="00010001";h8<="00010000";
When"1010"=>h0<="00010001";h8<="00010000";
When"1011"=>h0<="00010001";h8<="00010000";
When"1100"=>h0<="00011111";h8<="11110000";
When others=>h0<="00000000";h8<="00000000";
End case;
When "11"=>
C“口”字设计
When"0101"=>h0<="00011111";h8<="11100000";
When"0110"=>h0<="00010000";h8<="00100000";
When"0111"=>h0<="00010000";h8<="00100000";
When"1000"=>h0<="00010000";h8<="00100000";
When"1001"=>h0<="00010000";h8<="00100000";
When"1010"=>h0<="00010000";h8<="00100000";
When"1011"=>h0<="00011111";h8<="11100000";
When others=>h0<="00000000";h8<="00000000";
End process;
2.3循环扫描及期间的延时环节
为使汉字不断地循环显示,并且使每个汉字之间有停顿,就需要在中间加一定的延时和循环环节。在这一环节中,可以通过修改其数值来控制每个字母的显示时间,其程序如下:
process(clk)
variable int: integer range 0 to 10000;
begin
if clk’event and clk=’1’then
int:=0;
”11”then
”00”;
else
’1’;
end if;
end if;
end process;
2.4总程序
library ieee;
use ieee.std_logic_11.all;
use ieee.std_logic_unsigned.all;
entity yz_ok is
h0,h8:out std_logic_vector(7 downto 0));
end yz_ok;
architecture count of yz_ok is
begin
a1:process(clk,enable)
begin
If clk'event and clk='1'then
If enable='1' then
If lie>"0000" then
Lie<=lie-"0001";
Else
Lie<="1111";
End if;
End if;
End if;
Sel<=lie;
End process;
a2:process(enable,clk)
begin
If clk'event and clk='1'then
If enable='1' then
Case next1 is
When "00"=>
When "0011"=>h0<="00000000";h8<="01111110";
When "0100"=>h0<="01111110";h8<="01000010";
When "0101"=>h0<="01000010";h8<="01000010";
When "0110"=>h0<="01000010";h8<="01000010";
When "0111"=>h0<="01000010";h8<="01000010";
When "1000"=>h0<="01000010";h8<="01000010";
When "1001"=>h0<="01000010";h8<="01000010";
When "1010"=>h0<="01000010";h8<="01000010";
When "1011"=>h0<="01000010";h8<="01000010";
When "1100"=>h0<="01111110";h8<="01000010";
When "1101"=>h0<="00000000";h8<="01111110";
When others=>h0<="00000000";h8<="00000000";
End case;
When "01"=>
When "0011"=>h0<="00100000";h8<="00000000";
When "0100"=>h0<="00100000";h8<="00000000";
When "0101"=>h0<="00100000";h8<="10001100";
When "0110"=>h0<="01110000";h8<="10000000";
When "0111"=>h0<="00101000";h8<="10000000";
When "1000"=>h0<="00100011";h8<="11111100";
When "1001"=>h0<="00100000";h8<="10000000";
When "1010"=>h0<="00101000";h8<="10001100";
When "1011"=>h0<="01110000";h8<="10000110";
When "1100"=>h0<="00100000";h8<="11111110";
When "1101"=>h0<="00100000";h8<="00001100";
When others=>h0<="00000000";h8<="00000000";
End case;
When "10"=>
When"0100"=>h0<="00011111";h8<="11110000";
When"0101"=>h0<="00010001";h8<="00010000";
When"0110"=>h0<="00010001";h8<="00010000";
When"0111"=>h0<="00010001";h8<="00010000";
When"1000"=>h0<="00011111";h8<="11110000";
When"1001"=>h0<="00010001";h8<="00010000";
When"1010"=>h0<="00010001";h8<="00010000";
When"1011"=>h0<="00010001";h8<="00010000";
When"1100"=>h0<="00011111";h8<="11110000";
When others=>h0<="00000000";h8<="00000000";
When "11"=>
When"0101"=>h0<="00011111";h8<="11100000";
When"0110"=>h0<="00010000";h8<="00100000";
When"0111"=>h0<="00010000";h8<="00100000";
When"1000"=>h0<="00010000";h8<="00100000";
When"1001"=>h0<="00010000";h8<="00100000";
When"1010"=>h0<="00010000";h8<="00100000";
When"1011"=>h0<="00011111";h8<="11100000";
When others=>h0<="00000000";h8<="00000000";
When others=>h0<="00000000";h8<="00000000";
End process;
a3:process(clk)
variable int: integer range 0 to 10000;
begin
if clk'event and clk='1'then
int:=0;
if next1="11"then
next1<="00";
else
next1<= next1+'1';
end if;
end if;
end process;
end count;
第三章 系统调试与仿真
3.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 Builder工具与Matlab/Simulink相结合,可以方便地实现各种DSP应用系统;支持Altera的片上可编程系统(SOPC)开发,集系统级设计、嵌入式软件开发、可编程逻辑设计于一体,是一种综合性的开发平台。
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&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项,将目标器件闲置引脚状态设置高阻态,即选择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 coverage reporting; 毛刺检测Glitch detection 为1ns 宽度;选中Run simulation until all vector stimuli 全程仿真。
现在所有设置进行完毕,在菜单processing项下选择start simulation,直到出现simulation was successful,仿真结束 。仿真文件simulation report 通常会自动弹出,否则选择processing simulation report 。
图3-7 仿真波形输出
四、下载调试
选择tools菜单中programmer,点击左上角的Hardware Setup,选择USB,点击start即可连接硬件,进行调试 。连接成功后,即可在实验箱中LED屏循环显示字母。
如下图汉字的显示:
图4-1 调试结果图
图4-2 调试结果图
五、心得体会
为期两周的嵌入式课程设计完成了。整过设计过程虽然不是很顺利。不过我认真对待老师给我们的课题,中间虽然也有不少挫折,但不经历挫折怎么见风雨,在我四处查看资料,请教同学下终于完成。
经过这两周的课程设计,我加深了对PLD的认识,学到了很多以前不知道的东西,也明白也PLD在现实生活中的重要应用和它的发展趋势。以前在书本上学到的东西总是不能够很好地运用到现实当中去,现在终于得到了改善,这让我感到非常的高兴。从这次实习中,我体会到,如果将我们在大学里所学的知识与更多的实践结合在一起,用实践来检验真理,使一个本科生具备较强的处理基本实务的能力与比较系统的专业知识,这才是我们学习与实习的真正目的。让我们不再是一个沉睡的孩子,让我们的无知渐渐远去,把我们所学的知识运用到实际中去,为社会出上我们的一份力。
感谢老师给的这次让我们自行设计的机会,通过这次设计通过这次课程设计使我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正为社会服务,从而提高自己的实际动手能力和思考的能力。在设计的过程中遇到问题,可以说得是困难重重,这毕竟第一次做的,难免会遇到过各种各样的问题,同时在设计的过程中发现了自己的不足之处,对以前所学过的知识理解得不够深刻,掌握得不够牢固。
总的来说,这次设计的16×16点阵显示控制还是比较成功的,在设计中遇到了很多问题,最后在老师的辛勤的指导下,终于游逆而解,有点小小的成就感,终于觉得平时所学的知识有了实用的价值,达到了理论与实际相结合的目的,不仅学到了不少知识,而且锻炼了自己的能力,使自己对以后的路有了更加清楚的认识,同时,对未来有了更多的信心。最后,对给过我帮助的所有同学和指导老师再次表示忠心的感谢。
六、参考文献
1. 张原编著,可编程逻辑器件设计及应用,机械工业出版社。
2.荀殿栋,徐志军编著,数字电路设计实用手册,电子工业出版社。
3. 刘洪喜,陆颖编著. VHDL电路设计实用教程 ,清华大学出版社。
电气信息学院课程设计评分标准
| 环节 | 项目 | 评价 | ||||
| 优 | 良 | 中 | 及格 | 不及格 | ||
| 实践环节(70%) | 1、设计方案合理性与创造性 2、编程完成情况 3、电路模块仿真调试结果 4、硬件测试过程及结果 5、解决问题能力及答辩情况 6、纪律和出勤情况 | |||||
| 设计报告(30%) | 1 设计报告内容完整、规范 2 设计步骤规范、正确 3 仿真调试结果正确、波形清楚 4 硬件测试过程规范、结果正确 | |||||
| 综合评价 | 课程设计成绩评定为: □优 □良 □中 □及格 □不及格 指导老师签名:________________ 日 期:________________ | |||||