您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 综合/其它 > 基于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;entitysaomiaoisport(en:outstd_logic;state:outstd_logic_vector(1downto0);clk:instd_logic;——装订线——kbrow:instd_logic_vector(3downto0);kbcol:outstd_logic_vector(3downto0));Endsaomiao;architectureoneofsaomiaoissignalcount:std_logic_vector(1downto0);beginprocess(clk,kbrow)beginen=not(kbrow(0)orkbrow(1)orkbrow(2)orkbrow(3));if(clk'eventandclk='1')thenifnot(kbrow(0)orkbrow(1)orkbrow(2)orkbrow(3))='1'thencount=count+1;endif;endif;endprocess;process(clk)beginifclk'eventandclk='1'thencasecountiswhen00=kbcol=0001;state=00;when01=kbcol=0010;state=01;when10=kbcol=0100;state=10;when11=kbcol=1000;state=11;whenothers=kbcol=1111;endcase;endif;endprocess;End;按键数值输出模块:libraryieee;useieee.std_logic_1164.all;useieee.std_logic_unsigned.all;entityshujuisport(at:outstd_logic_vector(3downto0);tate:instd_logic_vector(1downto0);clk:instd_logic;brow:instd_logic_vector(3downto0));Endshuju;architectureoneofshujuisBeginprocess(clk)beginifclk'eventandclk='1'thencasetateiswhen00=casebrowiswhen0001=at=1111;when0010=at=1110;when0100=at=1101;When1000=at=1100;whenothers=null;endcase;when01=casebrowiswhen0001=at=1011;when0010=at=1010;when0100=at=1001;When1000=at=1000;whenothers=null;endcase;when10=casebrowiswhen0001=at=0111;when0010=at=0110;when0100=at=0101;When1000=at=0100;whenothers=null;endcase;when11=CasebrowisWhen0001=at=0011;When0010=at=0010;When0100=at=0001;When1000=at=0000;whenothers=null;endcase;endcase;endif;endprocess;End;防抖模块:libraryieee;useieee.std_logic_1164.all;useieee.std_logic_unsigned.all;entitydizfenpisport(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;architectureoneofdizfenpissignaltemp:std_logic_vector(31downto0);Signalfnq:std_logic;Signalcnt8:std_logic_vector(2downto0);Signalkey:std_logic_vector(7downto0);beginprocess(clk)variablereg8:std_logic_vector(7downto0);beginif(clk'eventandclk='1')thenreg8:=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)beginifstart='0'thentemp=00000000000000000000000000000000;elsif(fnq'eventandfnq='1')thentemp=temp(27downto0)&da;endif;endprocess;process(clk,temp,cnt8)beginifclk'eventandclk='1'thencnt8=cnt8+1;endif;casecnt8iswhen000=scan=000;data=temp(3downto0);when001=scan=001;data=temp(7downto4);when010=scan=010;data=temp(11downto8);when011=scan=011;data=temp(15downto12);when100=scan=100;data=temp(19downto16);when101=scan=101;data=temp(23downto20);when110=scan=110;data=temp(27downto24);when111=scan=111;data=temp(31downto28);whenothers=null;endcase;endprocess;End;译码模块:libraryieee;useieee.std_logic_1164.all;useieee.std_logic_unsigned.all;entityyimaisport(data:instd_logic_vector(3downto0);seg7:outstd_logic_vector(7downto0));Endyima;architectureoneofyimaisbeginProcess(data)BeginCasedataisWhen0000=seg7=00111111;When0001=seg7=00000110;When0010=seg7=01011011;When0011=seg7=01001111;When0100=seg7=01100110;When0101=seg7=01101101;When0110=seg7=01111101;When0111=seg7=00000111;When1000=seg7=01111111;When1001=seg7=01101111;When1010=seg7=01110111;When1011=seg7=01111100;When1100=seg7=00111001;When1101=seg7=01011110;When1110=seg7=01111001;When1111=seg7=01110001;Endcase;Endprocess;End;整体电路程序:libraryieee;useieee.std_logic_1164.all;useieee.std_logic_unsigned.all;entitykeyboardisport(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;architectureoneofkeyboardisComponentsaomiaoport(en:outstd_logic;state:outstd_logic_vector(1downto0);clk:instd_logic;kbrow:instd_logic_vector(3downto0);kbc
本文标题:基于VHDL的键盘扫描及显示电路
链接地址:https://www.777doc.com/doc-5115090 .html