基于VHDL的键盘扫描及显示电路.docx

上传人:b****5 文档编号:6852672 上传时间:2023-01-11 格式:DOCX 页数:12 大小:171.83KB
下载 相关 举报
基于VHDL的键盘扫描及显示电路.docx_第1页
第1页 / 共12页
基于VHDL的键盘扫描及显示电路.docx_第2页
第2页 / 共12页
基于VHDL的键盘扫描及显示电路.docx_第3页
第3页 / 共12页
基于VHDL的键盘扫描及显示电路.docx_第4页
第4页 / 共12页
基于VHDL的键盘扫描及显示电路.docx_第5页
第5页 / 共12页
点击查看更多>>
下载资源
资源描述

基于VHDL的键盘扫描及显示电路.docx

《基于VHDL的键盘扫描及显示电路.docx》由会员分享,可在线阅读,更多相关《基于VHDL的键盘扫描及显示电路.docx(12页珍藏版)》请在冰豆网上搜索。

基于VHDL的键盘扫描及显示电路.docx

基于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等知识。

而且提高了我分析问题、解决问题的能力,进一步加强了我的综合素质,对我是一次很好的锻炼机会。

将在我今后的学习工作生活中起到积极的作用。

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

当前位置:首页 > 自然科学 > 数学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1