当前位置:文档之家› 课程设计报告矩阵键盘控制

课程设计报告矩阵键盘控制

北华航天工业学院《EDA技术综合设计》课程设计报告报告题目:矩阵键盘控制接口设计作者所在系部:电子工程系作者所在专业:电子信息工程作者所在班级:作者姓名:作者学号:0指导教师姓名:完成时间:2009-12-18内容摘要本课程设计所用实验器材主要有计算机和北京精仪达盛科技有限公司的EL教学实验箱。

经编译、仿真,检查无误并且符合设计要求后,正确的将脉冲源、FLEX10K \ EPF10K10LC84-3芯片、5行×6列薄膜轻触按键键盘、数码管按设计要求连接好。

将程序下载到实验箱的FLEX10K \ EPF10K10LC84-3芯片中,则可观察到预期的实验效果,即当按下某一键时,在数码管上显示该键对应的键值。

本课程设计需设计键盘接口消抖动元件(底层文本)和矩阵键盘接口电路(顶层文本)。

在顶层文本中包含扫描信号发生模块、按键消抖动模块、按键译码模块、寄存器-选择器模块和数码管的译码模块。

关键词:VHDL语言 EDA技术按键消抖动电路键盘扫描电路键值译码电路按键码存储电路显示键值电路目录一概述 (5)二方案设计与论证 (5)三单元电路设计 (6)1.键盘接口消抖动元件 (6)2.时钟产生电路 (6)3.键盘扫描电路 (7)4.键盘译码电路 (7)5.寄存器_选择器模块电路 (7)6.译码模块电路 (7)四器件编程与下载 (8)五性能测试与分析 (16)六实验设备 (16)七心得体会 (16)八参考文献 (17)课程设计任务书一、概述本课程设计的基本原理是在时钟信号的控制下,使数码管上显示所按下的键值,并且能够保持直到下一个按键被按下。

首先,构思一个8×4的矩阵键盘控制顶层电路的模块划分图兼端口及内部信号定义图,再用VHDL语言编辑文本程序,需先录入底层文件(键盘接口消抖动元件DEBOUNCING的描述)再录入键盘接口电路主程序,保存编译并检查程序是否有语法错误,再仿真观察波形是否符合所预期的设计要求,当一切都满足要求后,即可将程序下载到实验箱的FLEX10K \ EPF10K10LC84-3芯片中。

正确的将脉冲源、FLEX10K \ EPF10K10LC84-3芯片、5行×6列薄膜轻触按键键盘、数码管按设计要求连接好。

再将程序下载到实验箱的FLEX10K \ EPF10K10LC84-3芯片中,则可观察到预期的实验效果,即当按下某一键时,在数码管上显示该键对应的键值。

如:当按下5时,数码管显示05。

二、方案设计与论证把该矩阵键盘控制器分为两部分进行设计,先设计键盘接口消抖动电路,再设计键盘接口电路的主程序。

在主程序中包含时序产生电路、键盘扫描电路、弹跳消除电路、键盘译码电路、按键码存储电路、显示电路模块并且分别进行分析来实现所需的功能。

实验仪器中4×8矩阵键盘的电路原理图如图所示图1. 4×8矩阵键盘的电路原理图图2.按键位置与数码关系三、单元电路设计1.键盘接口消抖动元件DEBOUCING.VHD该元件为一个通用的全功能的消抖动元件,内含有自由计数器模块、消抖动模块和微分模块。

其默认符号如图1所示。

各引脚说明如下:Key为按键输入信号,高电平有效,有抖动毛刺;clr是清零信号,低电平有效;clk是同步时钟信号,选择20MHZ;dly_out是消抖动输出;diff_out是消抖动微分输出。

在顶层文本key_test.vhd的debounuing:block模块中,U1,U2,U3,U4共4处用到了元件例化语句,用来消除按键抖动。

2.时钟产生电路counter:block本电路中利用一个自由计数器来产生多种频率的工作脉冲波形有机的构成系统工作时序。

它们分别是:系统时钟clk_4M、弹跳消除取样信号CLK、按键译码模块同步时钟CLK1、键值存储器同步时钟CLK2、键盘扫描信号SELOUT[2..0]和7段显示器扫描信号SELOUT(0)及NOTSELOUT_0。

该模块中的扫描信号就是取了计数器中的3个值,使用语句:SELTMP<=Q(7 DOWNTO 5);此处SELTMP要预先定义为3bit的宽度。

3.键盘扫描电路扫描电路的作用是用来提供键盘扫描信号,扫描信号变化的顺序依次为000-001-010-011-100-101-110-111,周而复始。

用语句:SELTMP<=Q(7 DOWNTO 5);SELOUT<=SELTMP;即可实现键盘扫描。

4.键盘译码电路key_decoder:block译码电路所要做的任务有:判别是否有键按下;将被按下键编码成对应的ZOUT[7..0]8位二进制编码,即用十进制数来显示按键值:KEY_CODE<=ZOUT;把KEY_CODE送到内部下一级电路,即按键码的寄存器_选择器模块。

5. 按键码的寄存器_选择器模块REG_MULTIPLEXER:block因为每次扫描会产生新的按键数据,可能会覆盖前面的数据,所以需要一个按键存储电路,将整个键盘扫描完毕后的按键值记录下来。

6.译码模块SEVEN_SEGMENT: bloc该模块把DB[3..0]的值译成17位的数码管所对应的0、1、2、3、4、5、6、7、8、9,使数码管正常显示按键值。

四、器件编程与下载1.底层文本:键盘接口消抖动元件DEBOUCING.VHDLIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY debouncing ISPORT(clk,key:IN STD_LOGIC;clr:IN STD_LOGIC;dly_out,dif_out:OUT STD_LOGIC);END debouncing;ARCHITECTURE a OF debouncing ISSIGNAL sample,dly,diff:STD_LOGIC;BEGINfree_counter:blockSIGNAL QQ:STD_LOGIC_VECTOR(4 DOWNTO 0);SIGNAL d0:STD_LOGIC;BEGINPROCESS(clr,clk)BEGINif clr='0'then d0<='0';QQ<=(OTHERS=>'0');elsif clk'event and clk='1'thend0<=QQ(4);QQ<=QQ+1;end if;end process;sample<=not(QQ(4) and (not d0));end block free_counter;debunce:blocksignal d0,d1,s,r:std_logic;beginprocess(clk,clr)beginif clr='0' thendly<='0';elsif rising_edge(clk) thenif sample='1' thend1<=d0;d0<=key;s<=d0 and d1;r<=not d0 and not d1;if s<='0' and r<='0' thendly<=dly;elsif s<='0' and r<='1' thendly<='0';elsif s<='1' and r<='0' thendly<='1';else dly<='0';end if;end if;end if;end process;dly_out<=dly;end block debunce;differential:blocksignal d1,d0:std_logic;beginprocess(clk,clr)beginif clr='0'thend0<='0';d1<='0';elsif rising_edge(clk)then d1<=d0;d0<=dly; end if;diff<=d0 and not d1;end process;dif_out<=diff;end block differential;END a;2.顶层文本:键盘接口电路主程序keys_test.vhd library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_arith.all;use ieee.std_logic_unsigned.all;entity keys_test isport(clk20,clr:in std_logic;selout:out std_logic_vector(2 downto 0);notselout_0:out std_logic;key:in std_logic_vector(3 downto 0);segout:out std_logic_vector(16 downto 0)); end keys_test;architecture a of keys_test iscomponent debouncingport(key:in std_logic;clk,clr:in std_logic;dly_out:out std_logic);end component;signal clk,clk1,clk2,clk4:std_logic;signal seltmp:std_logic_vector(2 downto 0);signal key_code:std_logic_vector(7 downto 0); signal c:std_logic_vector(3 downto 0);signal db,key_in:std_logic_vector(3 downto 0); signal seg:std_logic_vector(16 downto 0);beginsegout(16 downto 0)<=seg;selout<=seltmp;notselout_0<=not seltmp(0);key_in<=not key;fenpin:blocksignal m:integer range 0 to 10#5#;beginprocess(clk20)beginif clk20'event and clk20='1'thenif m=10#5# then m<=0;else m<=m+1;end if;end if;end process;process(m)beginif m=10#5# then clk4<='1';else clk4<='0';end if;end process;end block fenpin;counter:blocksignal q:std_logic_vector(10 downto 0);beginprocess(clk4,clr)beginif clr='0' then q<=(others=>'0');elsif clk4'event and clk4='1' then q<=q+1; end if;end process;clk<=q(0);clk1<=q(2);clk2<=q(4);seltmp<=q(7 downto 5);end block counter;debounuing:blockbeginu1:debouncing port map(key=>key_in(0),dly_out=>c(0),clr=>clr,clk=>clk);u2:debouncing port map(key=>key_in(1),dly_out=>c(1),clr=>clr,clk=>clk);u3:debouncing port map(key=>key_in(2),dly_out=>c(2),clr=>clr,clk=>clk);u4:debouncing port map(key=>key_in(3),dly_out=>c(3),clr=>clr,clk=>clk);end block debounuing;key_decoder:blocksignal z:std_logic_vector(6 downto 0);signal zout:std_logic_vector(7 downto 0); beginz<=(not c)&seltmp;key_code<=zout;process(clk1,clr)beginif clr='0' thenzout<=(others=>'0');elsif clk1'event and clk1='1' thencase z isWHEN"1110000"=>ZOUT<="00000000"; WHEN"1110001"=>ZOUT<="00000001"; WHEN"1110010"=>ZOUT<="00000010"; WHEN"1110011"=>ZOUT<="00000011"; WHEN"1110100"=>ZOUT<="00010000"; WHEN"1110101"=>ZOUT<="00010001"; WHEN"1110110"=>ZOUT<="00000100"; WHEN"1110111"=>ZOUT<="00000101"; WHEN"1101000"=>ZOUT<="00000110"; WHEN"1101001"=>ZOUT<="00000111";WHEN"1101010"=>ZOUT<="00010010"; WHEN"1101011"=>ZOUT<="00010011"; WHEN"1101100"=>ZOUT<="00001000"; WHEN"1101101"=>ZOUT<="00001001"; WHEN"1101110"=>ZOUT<="00001010"; WHEN"1101111"=>ZOUT<="00001011"; WHEN"1011000"=>ZOUT<="00010100"; WHEN"1011001"=>ZOUT<="00010101"; WHEN"1011010"=>ZOUT<="00001100"; WHEN"1011011"=>ZOUT<="00001101"; WHEN"1011100"=>ZOUT<="00001110"; WHEN"1011101"=>ZOUT<="00001111"; WHEN"1011110"=>ZOUT<="00010110"; WHEN"1011111"=>ZOUT<="00010111"; WHEN"0111000"=>ZOUT<="00011000"; WHEN"0111001"=>ZOUT<="00011010"; WHEN"0111010"=>ZOUT<="00011011"; WHEN"0111011"=>ZOUT<="00011100"; WHEN"0111100"=>ZOUT<="00011101"; WHEN"0111101"=>ZOUT<="00011001"; WHEN"0111110"=>ZOUT<="00011110"; WHEN"0111111"=>ZOUT<="00011111";WHEN OTHERS=>ZOUT<="11111111";end case;END IF;END PROCESS;END BLOCK key_decoder;REG_MULTIPLEXER:BLOCKSIGNAL KEY_CODE1:STD_LOGIC_VECTOR(7 DOWNTO 0); BEGINPROCESS(CLK2,clr)beginif clr='0' thenKEY_CODE1<=(others=>'0');ELSIF(CLK2'EVENT AND CLK2='1')THENif(key_code="11111111") thenKEY_CODE1<=KEY_CODE1;ELSE KEY_CODE1<=KEY_CODE;end if;END if;END PROCESS;DB<=KEY_CODE1(3 DOWNTO 0)WHEN(SELTMP(0)='0')ELSE KEY_CODE1(7 DOWNTO 4)WHEN(SELTMP(0)='1')ELSE"0000";End Block REG_MULTIPLEXER;seven_segment:blockbeginseg<="11111111000000000" when db="0000" else"00110000000000000" when db="0001" else"11101110100010000" when db="0010" else"11111100100010000" when db="0011" else"00110001100010000" when db="0100" else"11011101100010000" when db="0101" else"11011111100010000" when db="0110" else"11110000000000000" when db="0111" else"11111111100010000" when db="1000" else"11111101100010000" when db="1001" else"00110000000110100" when db="1010" else"11001111100101000" when db="1011" else"11001111000000000" when db="1100" else"11111100001000010" when db="1101" else"11001111100010000" when db="1110" else"11000011100010000" when db="1111" else"00000000000000000";end block seven_segment;end a;3.编译在软件平台的录入设计中,应当先录入底层DEBOUNCING.VHD设计文本,并把它设为当前的工程项目,经编译、仿真,通过后,退出DEBOUNCING.VHD文本;再录入顶层文本key_test.vhd,并把它设为当前的工程项目,经编译、仿真,通过后就可下载key_test.vhd设计文本到器件中。

相关主题