利用按键开关控制点阵进行字母显示说明书完美通过.docx
- 文档编号:26686992
- 上传时间:2023-06-21
- 格式:DOCX
- 页数:35
- 大小:284.43KB
利用按键开关控制点阵进行字母显示说明书完美通过.docx
《利用按键开关控制点阵进行字母显示说明书完美通过.docx》由会员分享,可在线阅读,更多相关《利用按键开关控制点阵进行字母显示说明书完美通过.docx(35页珍藏版)》请在冰豆网上搜索。
利用按键开关控制点阵进行字母显示说明书完美通过
中北大学
课程设计说明书
2013/2014学年第二学期
学院:
专业:
学生姓名:
学号:
课程设计题目:
利用按键开关控制点阵进行字母显示
起迄日期:
课程设计地点:
指导教师:
专业负责人:
下达任务书日期:
2014年6月10日
目录
1、课程设计目的················································································1
2、课程设计内容和要求·······································································1
2.1、设计内容··········································································1
2.2、设计要求··········································································1
3、设计方案及实现情况·······································································1
3.1、设计思路·············································································1
3.2、工作原理及框图····································································1
3.3、各模块功能描述····································································3
3.4、仿真结果·············································································4
3.5、实物结果图··········································································6
4、课程设计总结················································································6
5、参考文献······················································································7
6、附录程序清单···············································································8
1、课程设计目的
(1)学习操作数字电路设计实验开发系统,掌握点阵显示模块的工作原理及应用。
(2)掌握组合逻辑电路、时序逻辑电路的设计方法。
(3)学习掌握可编程器件设计的全过程。
2、课程设计内容和要求
2.1、设计内容
利用按键开关控制点阵进行字母显示
2.2、设计要求
(1)学习掌握按键开关控制模块、点阵显示模块的工作原理及应用;
(2)熟练掌握VHDL编程语言,编写按键开关控制模块的控制逻辑;
(3)仿真所编写的程序,模拟验证所编写的模块功能;
(4)下载程序到芯片中,硬件验证所设置的功能,能够实现字母显示;
(5)整理设计内容,编写设计说明书。
3、设计方案及实现情况
3.1、设计思路
根据题目设计要求,本系统拟采用自顶向下设计方法,顶层采用原理图设计方法,将整个系统分为分频(FENPIN)、消抖(XIAODOU)、按键开关控制(BUTTON)、16×16点阵显示(LENDISP)四个模块,通过对各模块编写程序实现模块功能,最终将模块进行综合实现整个系统的功能,通过按键开关控制点阵进行二十六个字母的显示。
3.2、工作原理及框图
(1)工作原理
系统的输入信号有:
系统时钟信号CLK,按键信号(ADD、SUB)。
系统的输出信号有:
点阵行驱动输出信号(LEDOUT[0..15]),点阵列选和按键开关扫描公用信号(SEL[3..0])。
系统工作过程为:
按键开关按下一次,扫描信号扫描到按键按下时,在点阵上显示对应的字母。
如按键开关按下一次时,点阵显示字母“A”;按下两次时,点阵显示字母“B”……
如此,按键开关按下26次就分别对应了26个字母。
16×16LED点阵由四块8×8LED点阵组成,共256个LED灯,只需要让对应的LED灯点亮,如表1.
表1.列选通功能表
SEL3
SEL2
SEL1
SEL0
点亮列号
1
1
1
1
第1列
1
1
1
0
第2列
1
1
0
1
第3列
1
1
0
0
第4列
1
0
1
1
第5列
1
0
1
0
第6列
1
0
0
1
第7列
1
0
0
0
第8列
0
1
1
1
第9列
0
1
1
0
第10列
0
1
0
1
第11列
0
1
0
0
第12列
0
0
1
1
第13列
0
0
1
0
第14列
0
0
0
1
第15列
0
0
0
0
第16列
(2)系统连接图,输入1MHz的时钟,分频为1K,消抖6ms
图1系统整体工作原理图
3.3、各模块功能描述
(1)分频模块(FENPIN)
输入时钟频率为1MHz,满足按键控制以及显示,对时钟进行1000分频,以满足抖动模块中延时时间。
通过检测产生电平的持续时间,判断是否为按键产生,若为按键产生电平则正常输出;若为毛刺,则去除。
图2分频模块
(2)消抖模块(XIAODOU)
在按键过程中,由于按键机械结构,会产生不被期望的毛刺电平,从而影响到电路的功能。
因此,假如消抖程序把毛刺去除。
图3消抖模块
(3)按键控制模块(BUTTON)
按键控制模块的功能是:
通过按键的按下与释放产生计数,进行二十六进制计数,以控制二十六个字母的生成。
该模块中,clk为系统时钟,add为加法计数,sub为减法计数,reset为复位。
selout[4..0]为按键扫描后的对应的译码输出。
图4按键控制模块
(4)16×16点阵显示模块(LENDISP)
16×16点阵显示模块引脚功能如下图。
其中clk为系统时钟,selin为键盘扫描后的对应的译码输出,和图3中的selout[4..0]对接。
selout[3..0]为点阵列选择信号,ledout[15..0]为点阵行显示。
图5点阵显示模块
3.4、仿真结果
(1)分频
在此处仿真用10分频,便于观察。
在此处观察到,当输入时钟变化5个周期时,输出跳变一次,因此输出时钟周期为输入时钟周的十倍。
图6十分频仿真波形仿真图
(2)消抖
从图5我们看到只要有键按下,那么就会在时钟上升沿检测这个信号的电平,如果保持一段时间仍为低,那么就会延时输出这个信号,只要对检测次数进行设定,就能达到合理消抖。
图7按键消抖仿真图形
(3)按键(BUTTON)
按键分为加一按键和减一按键。
每次按键都会产生一个数字作为对应字母的编号。
由观察可得知,每次加一按键输出数字加一,每次减一按键,使输出数字减一。
图8按键仿真图形
(4)点阵显示(LENDISP)
根据按键模块输出控制字符,通过WHILE-CASE语句找出相应字母对应的二进制库,然后在列选通控制下输出相应的字母。
图9点阵显示图形
(5)整体系统模块:
把前面四个模块进行整合后得到,加一和减一按键出发后,经过消抖,编码,显示,输出字母。
图10利用按键开关控制点阵进行字母显示仿真图
3.5、实物结果图
图中为试验箱连线后得出的部分实验结果。
输入为加一和减一按键,为上升沿触发;还有复位按键,为高电平复位。
图11部分实物结果图
4、课程设计总结
经过为期三周的课程设计,我对VHDL语言有了更加深刻的认识。
VHDL是超高速集成电路的硬件描述语言,它能够描述硬件的结构、行为与功能。
另外,VHDL具有并发性,采用自上而下的结构式设计方法,适合大型设计工程的分工合作。
在编写程序的时候,我才发现能看懂程序和能自己写程序是两个完全不同的概念,自己一开始写程序时,即便是一个很简单的功能模块,在编译时也可能产生很多错误,在不断的改错过程中,自己对VHDL语言的语法结构有了深刻的理解,对编译过程中常见的错误也有了全面的认识。
通过这三周的课程设计,我在熟悉了EDA-V实验箱的操作同时,也学到了很多在学习课本知识时所体会不到的东西。
最初拿到课程设计任务书时,感觉每个模块都在做实验时用过,心想只要把各个模块组合到一起就可以实现系统功能了,但结果其实不然;在用VHDL语言进行系统设计的过程中,时序问题需要我们特别关注,否则在实验箱上进行验证时不会输出正确的结果。
完成此次设计后,我不仅能对QUATUSII开发仿真软件熟练操作,能达到学以致用,同时还掌握了按键和16×16点阵的工作原理。
经过这一过程,我发现平常的学习在注重理论知识的掌握同时,要加强实验环节,只有通过不断地实践,我们才能把知识掌握的更牢固,理解的更透彻。
5、参考文献
[1]任勇峰,庄新敏.VHDL与硬件实现速成.北京:
国防工业出版社,2005
[2]周润景,图雅,张丽敏.基于QuartusII的FPGA/CPLD数字系统设计实例.北京:
电子工业出版社,2007
[3]求是科技.CPLD/FPGA应用开发技术与工程实践.北京:
人民邮电出版社,2005
[4]罗苑棠.CPLD/FPGA常用模块与综合系统设计实例精讲.北京:
电子工业出版社,2007
[5]侯伯亨,顾新.VHDL硬件描述语言与数字逻辑电路设计.西安:
西安电子科技大学出版社,1999
附录程序清单
6.1分频程序
libraryieee;
Useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
entityfenpinis
port(clk:
instd_logic;
clk_out:
outstd_logic);
endfenpin;
architecturefenpin_1offenpinis
signalcnt:
integerrange0to999:
=0;
begin
process(clk)
begin
ifclk'eventandclk='1'then--上升沿有效
ifcnt=999then--从0到999为一千
cnt<=0;
else
cnt<=cnt+1;
endif;
endif;
endprocess;
process(cnt)
begin
ifcnt<500thenclk_out<='0';--0到499为低电平
elseclk_out<='1';
endif;
endprocess;
endfenpin_1;
6.2消抖程序
libraryIEEE;
useIEEE.STD_LOGIC_1164.ALL;
useIEEE.STD_LOGIC_ARITH.ALL;
useIEEE.STD_LOGIC_UNSIGNED.ALL;
entityxiaodouis
port(
clk:
instd_logic;
rst:
instd_logic;
out_click:
outstd_logic;
in_click:
instd_logic
);
endxiaodou;
architecturer1ofxiaodouis
signalcount:
integerrange0to10;
signalcount1:
std_logic_vector(2downto0);
signaldout1:
std_logic;
begin
process(clk,rst)
begin
ifrst='1'then
dout1<='1';
count1<="000";
elsifclk'eventandclk='1'then
if(in_click='0')and(count1
(2)='0')and(dout1='1')then
dout1<='1';
count1<=count1+1;
elsif(in_click='0')and(count1
(2)='1')and(dout1='1')then
dout1<='0';
count1<="000";
elsif(in_click='1')and(count1
(2)='0')and(dout1='0')then
dout1<='0';
count1<=count1+1;
elsif(in_click='1')and(count1
(2)='1')and(dout1='0')then
dout1<='1';
count1<="000";
else
out_click<=dout1;
count1<="000";
endif;
endif;
endprocess;
endr1;
3.控制程序
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
entitybuttonis
port(add,sub:
instd_logic;
clk,reset:
instd_logic;
selout:
outstd_logic_vector(4downto0));
endentitybutton;
architecturert1ofbuttonis
signalseloutn:
std_logic_vector(4downto0);
signaladdn:
std_logic;
signalsubn:
std_logic;
signalresetn:
std_logic;
begin
process(clk)
begin
if(clk'eventandclk='1')then--将按键和进(借)位的值在CLK上升沿来时赋给一个新的信号中。
addn<=add;
subn<=sub;
resetn<=reset;
endif;
endprocess;
process(clk,add,addn,sub,subn)--个位计数
begin
if(reset='1'andresetn='0')then
seloutn<="00000";
elsif(clk'eventandclk='1')then
if(add='1'andaddn='0')then--按键上升沿跳变,下同
if(seloutn="11001")then
seloutn<="00000";
else
seloutn<=seloutn+1;
endif;
elsif(sub='1'andsubn='0')then
if(seloutn="00000")then--按键上升沿跳变,下同
seloutn<="11001";
else
seloutn<=seloutn-1;
endif;
endif;
endif;
endprocess;
selout<=seloutn;
endarchitecturert1;
4.显示程序
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_arith.all;
useieee.std_logic_unsigned.all;
entitylendispis
port(clk:
instd_logic;
--clkin:
instd_logic_vector(3downto0);
selin:
instd_logic_vector(4downto0);
selout:
outstd_logic_vector(3downto0);
ledout:
outstd_logic_vector(15downto0));
endlendisp;
architecturectloflendispis
signaltemp:
std_logic_vector(15downto0);
signalclkin:
std_logic_vector(3downto0);
begin
process(clk,clkin,selin)
begin
if(clk'eventandclk='1')then
ifclkin="1111"then
clkin<="0000";
else
clkin<=clkin+1;
endif;
endif;
selout<=clkin;
caseselinis
when"00000"=>
caseclkinis
when"0000"=>temp<="0000000000000100";
when"0001"=>temp<="0000000000000100";
when"0010"=>temp<="0000000000001100";
when"0011"=>temp<="0000000001111100";
when"0100"=>temp<="0000000111111100";
when"0101"=>temp<="0000011111100100";
when"0110"=>temp<="0001111111000000";
when"0111"=>temp<="0001110001000000";
when"1000"=>temp<="0001100001000000";
when"1001"=>temp<="0000111001000000";
when"1010"=>temp<="0000001111000100";
when"1011"=>temp<="0000000111100100";
when"1100"=>temp<="0000000000111100";
when"1101"=>temp<="0000000000001100";
when"1110"=>temp<="0000000000000100";
when"1111"=>temp<="0000000000000100";
whenothers=>temp<="0000000000000000";
endcase;
when"00001"=>
caseclkinis
when"0000"=>temp<="0000000000000000";
when"0001"=>temp<="0000010001111000";
when"0010"=>temp<="0000111011111000";
when"0011"=>temp<="0001111111111100";
when"0100"=>temp<="0001111110001100";
when"0101"=>temp<="0001000110000100";
when"0110"=>temp<="0001000110000100";
when"0111"=>temp<="0001000110000100";
when"1000"=>temp<="0001000110000100";
when"1001"=>temp<="0001000110000100";
when"1010"=>temp<="0001000110000100";
when"1011"=>temp<="0001000110000100";
when"1100"=>temp<="0001111111111100";
when"1101"=>temp<="0001111111111100";
when"1110"=>temp<="0001000000000100";
when"1111"=>temp<="0001000000000100";
whenothers=>temp<="0000000000000100";
endcase;
when"00010"=>
caseclkinis
when"0000"=>temp<="0000000000000000";
when"0001"=>temp<="0001110000110000";
when"0010"=>temp<="0001100000001000";
when"0011"=>temp<="0001000000001100";
when"0100"=>temp<="0001000000000100";
when"0101"=>temp<="0001000000000100";
when"0110"=>temp<="0001000000000100";
when"0111"=>temp<="0001000000000100";
when"1000"=>temp<="0001000000000100";
when"1001"=>temp<="0001000000000100";
when"1010"=>temp<="0001100000001100";
when"1011"=>temp<="0000110000011000";
when"1100"=>temp<="0000111111111000";
when"1101"=>temp<="0000011111110000";
when"1110"=>temp<="0000001111100000";
when"1111"=>temp<="0000000000000000";
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 利用 按键 开关 控制 点阵 进行 字母 显示 说明书 完美 通过