基于VHDL的键盘扫描及显示电路.docx
《基于VHDL的键盘扫描及显示电路.docx》由会员分享,可在线阅读,更多相关《基于VHDL的键盘扫描及显示电路.docx(12页珍藏版)》请在冰豆网上搜索。
![基于VHDL的键盘扫描及显示电路.docx](https://file1.bdocx.com/fileroot1/2023-1/10/a31ce607-7010-4950-a7d0-43ec009ed7d6/a31ce607-7010-4950-a7d0-43ec009ed7d61.gif)
基于VHDL的键盘扫描及显示电路
广西工学院
课程设计
说明书
——装订线——
设计题目
系别
专业班级
学生姓名
学号
指导教师
日期
基于VHDL的键盘扫描及显示电路
摘要
运VHDL硬件描述语言和图形设计综合方法,实现了4×4键盘扫描电路的程序设计,通过运用QuartusⅡ软件平台生成电路符号,建立波形文件,设置输入端口,实现模拟仿真,得到仿真波形图。
关键字:
VHDLQuartusⅡ数码管
1题目分析
本次课程设计题目为4×4键盘扫描电路的设计。
要求通过查阅相关书籍资料,熟悉和初步掌握VHDL语言的语法及其功能,根据要求首先进行理论上的分析,深入分析4×4键盘扫描电路的原理,然后根据分析结果设计程序,进行上机的调试,通过Quartus4.1以上软件进行仿真,并记录仿真的结果。
——装订线——
2矩阵键盘及显示电路设计思路
矩阵键盘及显示电路能够将机械式4×4矩阵键盘的按键值依次显示到8个7段数码管上,每次新的按键值显示在最右端的第O号数码管上,原有第0~6号数码管显示的数值整体左移到第1~7号数码管上显示,见图1。
总体而言,矩阵键盘及显示电路的设计可分为4个部分:
(1)矩阵键盘的行及列的扫描控制和译码。
该设计所使用的键盘是通过将列扫描信号作为输入信号,控制行扫描信号输出,然后根据行及列的扫描结果进行译码。
(2)机械式按键的防抖设计。
由于机械式按键在按下和弹起的过程中均有5~10ms的信号抖动时间,在信号抖动时间内无法有效判断按键值,因此按键的防抖设计是非常关键的,也是该设计的一个重点。
(3)按键数值的移位寄存。
由于该设计需要在8个数码管上依次显示前后共8次按键的数值,因此对已有数据的存储和调用也是该设计的重点所在。
(4)数码管的扫描和译码显示。
由于该设计使用了8个数码管,因此需要对每个数码管进行扫描控制,并根据按键值对每个数码管进行7段数码管的译码显示。
2矩阵键盘及显示电路的实现
本文所设计的矩阵键盘及显示电路的电路符号如图2所示。
其中,clk为时钟信号输入端(频率可为1024~32768Hz);start为清零控制端;kbrow为列扫描信号输入端;kbeol为行扫描信号输出端;scan为数码管地址扫描信号输出端;seg7为数码管显示信号输出端。
3.矩阵键盘及显示电路的电路符号
4×4键盘扫描电路的电路符号如图2所示。
其中clk1为时钟信号输入
——装订线——
端,start1为开始信号输入端,kbcol1[3..0]为行扫描信号输出端,kbrow1[3..0]为列扫描信号输入端,seg71[7..0]为八段显示控制信号输出端,scan1[2..0]为数码管地址选择控制信号输出端。
4.程序设计
4×4键盘扫描电路用VHDL语言描述,全部代码由五个模块组成,其代码分别如下:
键盘扫描模块程序、原理图及仿真波形:
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
entitysaomiaois
port(en:
outstd_logic;
state:
outstd_logic_vector(1downto0);
clk:
instd_logic;
kbrow:
instd_logic_vector(3downto0);
kbcol:
outstd_logic_vector(3downto0)
);
Endsaomiao;
architectureoneofsaomiaois
signalcount:
std_logic_vector(1downto0);
begin
process(clk,kbrow)
begin
en<=not(kbrow(0)orkbrow
(1)orkbrow
(2)orkbrow(3));
if(clk'eventandclk='1')then
ifnot(kbrow(0)orkbrow
(1)orkbrow
(2)orkbrow(3))='1'thencount<=count+1;
endif;
endif;
endprocess;
process(clk)
begin
ifclk'eventandclk='1'then
casecountis
when"00"=>kbcol<="0001";state<="00";
when"01"=>kbcol<="0010";state<="01";
when"10"=>kbcol<="0100";state<="10";
when"11"=>kbcol<="1000";state<="11";
whenothers=>kbcol<="1111";
endcase;
endif;
endprocess;
End;
按键数值输出模块:
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
entityshujuis
port(at:
outstd_logic_vector(3downto0);
tate:
instd_logic_vector(1downto0);
clk:
instd_logic;
brow:
instd_logic_vector(3downto0)
);
Endshuju;
architectureoneofshujuis
Begin
process(clk)
begin
ifclk'eventandclk='1'then
casetateis
when"00"=>
casebrowis
when"0001"=>at<="1111";
when"0010"=>at<="1110";
when"0100"=>at<="1101";
When"1000"=>at<="1100";
whenothers=>null;
endcase;
when"01"=>
casebrowis
when"0001"=>at<="1011";
when"0010"=>at<="1010";
when"0100"=>at<="1001";
When"1000"=>at<="1000";
whenothers=>null;
endcase;
when"10"=>
casebrowis
when"0001"=>at<="0111";
when"0010"=>at<="0110";
when"0100"=>at<="0101";
When"1000"=>at<="0100";
whenothers=>null;
endcase;
when"11"=>
Casebrowis
When"0001"=>at<="0011";
When"0010"=>at<="0010";
When"0100"=>at<="0001";
When"1000"=>at<="0000";
whenothers=>null;
endcase;
endcase;
endif;
endprocess;
End;
防抖模块:
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
entitydizfenpis
port(n:
instd_logic;
da:
instd_logic_vector(3downto0);
data:
outstd_logic_vector(3downto0);
start:
instd_logic;
clk:
instd_logic;
scan:
outstd_logic_vector(2downto0)
);
Enddizfenp;
architectureoneofdizfenpis
signaltemp:
std_logic_vector(31downto0);
Signalfnq:
std_logic;
Signalcnt8:
std_logic_vector(2downto0);
Signalkey:
std_logic_vector(7downto0);
begin
process(clk)
variablereg8:
std_logic_vector(7downto0);
begin
if(clk'eventandclk='1')then
reg8:
=reg8(6downto0)&n;
endif;
key<=reg8;
endprocess;
fnq<=key(0)andkey
(1)andkey
(2)andkey(3)andkey(4)andkey(5)andkey(6)
andkey(7);
process(fnq,start)
begin
ifstart='0'then
temp<="00000000000000000000000000000000";
elsif(fnq'eventandfnq='1')then
temp<=temp(27downto0)&da;
endif;
endprocess;
process(clk,temp,cnt8)
begin
ifclk'eventandclk='1'thencnt8<=cnt8+1;
endif;
casecnt8is
when"000"=>scan<="000";data<=temp(3downto0);
when"001"=>scan<="001";data<=temp(7downto4);
when"010"=>scan<="010";data<=temp(11downto8);
when"011"=>scan<="011";data<=temp(15downto12);
when"100"=>scan<="100";data<=temp(19downto16);
when"101"=>scan<="101";data<=temp(23downto20);
when"110"=>scan<="110";data<=temp(27downto24);
when"111"=>scan<="111";data<=temp(31downto28);
whenothers=>null;
endcase;
endprocess;
End;
译码模块:
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
entityyimais
port(data:
instd_logic_vector(3downto0);
seg7:
outstd_logic_vector(7downto0)
);
Endyima;
architectureoneofyimais
begin
Process(data)
Begin
Casedatais
When"0000"=>seg7<="00111111";
When"0001"=>seg7<="00000110";
When"0010"=>seg7<="01011011";
When"0011"=>seg7<="01001111";
When"0100"=>seg7<="01100110";
When"0101"=>seg7<="01101101";
When"0110"=>seg7<="01111101";
When"0111"=>seg7<="00000111";
When"1000"=>seg7<="01111111";
When"1001"=>seg7<="01101111";
When"1010"=>seg7<="01110111";
When"1011"=>seg7<="01111100";
When"1100"=>seg7<="00111001";
When"1101"=>seg7<="01011110";
When"1110"=>seg7<="01111001";
When"1111"=>seg7<="01110001";
Endcase;
Endprocess;
End;
整体电路程序:
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
entitykeyboardis
port(
start1:
instd_logic;
Clk1:
instd_logic;
kbrow1:
instd_logic_vector(3downto0);
scan1:
outstd_logic_vector(2downto0);
kbcol1:
outstd_logic_vector(3downto0);
seg71:
outstd_logic_vector(7downto0)
);
Endkeyboard;
architectureoneofkeyboardis
Componentsaomiao
port(en:
outstd_logic;
state:
outstd_logic_vector(1downto0);
clk:
instd_logic;
kbrow:
instd_logic_vector(3downto0);
kbcol:
outstd_logic_vector(3downto0)
);
Endcomponent;
Componentshuju
port(at:
outstd_logic_vector(3downto0);
tate:
instd_logic_vector(1downto0);
clk:
instd_logic;
brow:
instd_logic_vector(3downto0)
);
Endcomponent;
Componentdizfenp
port(n:
instd_logic;
da:
instd_logic_vector(3downto0);
data:
outstd_logic_vector(3downto0);
start:
instd_logic;
clk:
instd_logic;
scan:
outstd_logic_vector(2downto0)
);
EndComponent;
Componentyima
port(data:
instd_logic_vector(3downto0);
seg7:
outstd_logic_vector(7downto0)
);
EndComponent;
Signala:
std_logic;
signalb:
std_logic_vector(1downto0);
signalc,d:
std_logic_vector(3downto0);
Begin
U1:
saomiaoportmap(clk=>clk1,kbrow=>kbrow1,kbcol=>kbcol1,en=>a,state=>b);
U2:
shujuportmap(clk=>clk1,brow=>kbrow1,at=>c,tate=>b);
U3:
dizfenpportmap(n=>a,da=>c,data=>d,start=>start1,clk=>clk1,scan=>scan1);
U4:
yimaportmap(data=>d,seg7=>seg71);
Endarchitectureone;
5.仿真及结果
用QuartusⅡ软件平台对设计进行模拟仿真,得到4×4键盘扫描电路功能仿真结果如图3所示,时序仿真结果如图4所示。
观察波形可知,列扫描信号kbrow1在时钟控制下循环扫描,当有键按下时,行扫描信号kbcol1读入相应的列信号来判断按键,seg71输出按键对应的数据,直到下一个按键被按下时才更新数据。
6.心得体会
本次主要做的是EDA方面的一些简单应用,通过对4×4键盘扫描电路的设计,初步了解的EDA方面的一些知识,加深了对硬件描述语言VHDL的了解。
在实际动手解决问题的过程中初步学习了VHDL语言的功能,同时真正体会到了其硬件描述语言的良好的可读性、可移植性和易理解等优点。
而且在设计的过程中运用QuartusⅡ软件平台模拟仿真,学习了这一实用性很高的软件,初步了解的QuartusⅡ的用法,丰富了我的知识储备。
虽然一开始对设计题目和要求满头雾水,对VHDL语言和QuartusⅡ软件平
——装订线——
台知之甚少,基本不会操作,但是通过查阅大量的书籍、报刊、杂志、专业网站、论坛的方式,找寻所需资料,反复比对研究有关资料,终于初步的了解了VHDL的编程和QuartusⅡ平台的用法,完成了设计。
所以不但加深了我对所学知识的理解,进一步升华了以前学过的电力电子技术、数电和模电、EDA等知识。
而且提高了我分析问题、解决问题的能力,进一步加强了我的综合素质,对我是一次很好的锻炼机会。
将在我今后的学习工作生活中起到积极的作用。