利用按键开关控制点阵进行字母显示说明书完美通过.docx

上传人:b****6 文档编号:14206992 上传时间:2023-06-21 格式:DOCX 页数:35 大小:284.43KB
下载 相关 举报
利用按键开关控制点阵进行字母显示说明书完美通过.docx_第1页
第1页 / 共35页
利用按键开关控制点阵进行字母显示说明书完美通过.docx_第2页
第2页 / 共35页
利用按键开关控制点阵进行字母显示说明书完美通过.docx_第3页
第3页 / 共35页
利用按键开关控制点阵进行字母显示说明书完美通过.docx_第4页
第4页 / 共35页
利用按键开关控制点阵进行字母显示说明书完美通过.docx_第5页
第5页 / 共35页
利用按键开关控制点阵进行字母显示说明书完美通过.docx_第6页
第6页 / 共35页
利用按键开关控制点阵进行字母显示说明书完美通过.docx_第7页
第7页 / 共35页
利用按键开关控制点阵进行字母显示说明书完美通过.docx_第8页
第8页 / 共35页
利用按键开关控制点阵进行字母显示说明书完美通过.docx_第9页
第9页 / 共35页
利用按键开关控制点阵进行字母显示说明书完美通过.docx_第10页
第10页 / 共35页
利用按键开关控制点阵进行字母显示说明书完美通过.docx_第11页
第11页 / 共35页
利用按键开关控制点阵进行字母显示说明书完美通过.docx_第12页
第12页 / 共35页
利用按键开关控制点阵进行字母显示说明书完美通过.docx_第13页
第13页 / 共35页
利用按键开关控制点阵进行字母显示说明书完美通过.docx_第14页
第14页 / 共35页
利用按键开关控制点阵进行字母显示说明书完美通过.docx_第15页
第15页 / 共35页
利用按键开关控制点阵进行字母显示说明书完美通过.docx_第16页
第16页 / 共35页
利用按键开关控制点阵进行字母显示说明书完美通过.docx_第17页
第17页 / 共35页
利用按键开关控制点阵进行字母显示说明书完美通过.docx_第18页
第18页 / 共35页
利用按键开关控制点阵进行字母显示说明书完美通过.docx_第19页
第19页 / 共35页
利用按键开关控制点阵进行字母显示说明书完美通过.docx_第20页
第20页 / 共35页
亲,该文档总共35页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

利用按键开关控制点阵进行字母显示说明书完美通过.docx

《利用按键开关控制点阵进行字母显示说明书完美通过.docx》由会员分享,可在线阅读,更多相关《利用按键开关控制点阵进行字母显示说明书完美通过.docx(35页珍藏版)》请在冰点文库上搜索。

利用按键开关控制点阵进行字母显示说明书完美通过.docx

利用按键开关控制点阵进行字母显示说明书完美通过

中北大学

课程设计说明书

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";

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 经管营销 > 企业管理

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2