键盘扫描与计算器VHDL仿真设计

上传人:xmg****18 文档编号:121249954 上传时间:2020-02-19 格式:DOC 页数:36 大小:162.81KB
返回 下载 相关 举报
键盘扫描与计算器VHDL仿真设计_第1页
第1页 / 共36页
键盘扫描与计算器VHDL仿真设计_第2页
第2页 / 共36页
键盘扫描与计算器VHDL仿真设计_第3页
第3页 / 共36页
键盘扫描与计算器VHDL仿真设计_第4页
第4页 / 共36页
键盘扫描与计算器VHDL仿真设计_第5页
第5页 / 共36页
点击查看更多>>
资源描述

《键盘扫描与计算器VHDL仿真设计》由会员分享,可在线阅读,更多相关《键盘扫描与计算器VHDL仿真设计(36页珍藏版)》请在金锄头文库上搜索。

1、.专业整理.简易计算器设计 EDA实验报告 一、 实验内容实验要求:完成个位数的加减乘运算,输入用矩阵键盘,输出用数码管显示,每输入一次数据要显示在数码管上。矩阵键盘共16个按键,用其中10个做个位数的输入,用3个分别做加减乘运算,用其中1个做等于操作,各位数的运算结果最多两位,用动态扫描数码管显示运算结果。二、 小组成员三、 实现方法系统组成及连接原理如图所示,主要由由七个功能模块组成:分频模块(为键盘扫描模块和防抖模块提供时钟)、键盘扫描驱动模块(依次置零)、键盘按键值编码模块、键盘编码值防抖模块、运算模块,数码管显示驱动模块、动态扫描驱动模块。分频键值编码防抖键盘矩阵行驱动时钟数码管显示

2、运算数码管动态显示1.分频模块由于FPGA实验板的原始时钟频率高达33.8688MHz,所以不能直接接入设计模块中使用,就需要用到分频模块。将33.8688MHz分频到4KHz和10Hz来使用,一个用于行驱动扫描时钟,一个用于防抖模块。所以,采用写一个可变分频元件来调用。元件视图:主要代码如下(完整代码见附录,下同):architecture RTL of freq_division iscomponent fredivn isgeneric(n:positive); Port ( clkin:in STD_LOGIC; clkout:out STD_LOGIC);end component;

3、beginU1:fredivngeneric map(n=3)port map(clkin=clk,clkout=clkout_kb);end RTL;仿真结果如下图:达到预期的目的2.行驱动模块(依次对行置零):键盘扫描的原理就是检测行列信号然后判断出具体是按下了哪一个按键。所以,对行依次置零,当置零频率较快时,按下某一个按键后,一定能得到某一列的信号输出为零,如下图:当行信号为1110时,若按下了0键,就会得到1110的列信号,立马就快可以译码出按键值,若按下4键、8键、C键则都不会有输出。主要代码如下:process(clkin)beginif clr=1 thencount=00; e

4、lsif rising_edge(clkin) thenif count=11 thencount=00;elsecount=count+1;end if;end if;end process;process(count)beginif count=01 thenkeydrv=1110;elsif count=10 thenkeydrv=1101;elsif count=11 then keydrv=1011; elsif count=00 thenkeydrv=0111;end if;end process;仿真结果如下图:达到预期的目的3.键值编码模块依据行驱动模块,当按下某一个按键后,立

5、马可以根据行列和并位信号得到唯一的键盘编码值,用5位矢量来保存结果,当没有按键按下时,编码值一直保持着11111不变,并在后端的模块中不对其做任何处理。以下列出部分编码表(完整编码表见附录):十进制数行&列HEX七段码HEX011101110EE11111107E411011110DE011001133511011101DD10110115B主要代码如下:process(clk)beginif clr=0 thenif rising_edge(clk) thenif temp1=11101110 thenkeyvalue1=00000; -0elsif temp1=11101101 thenk

6、eyvalue1=00001; -1elsif temp1=11101011 thenkeyvalue1=00010; -2elsif temp1=11100111 thenkeyvalue1=00011; -3elsif temp1=11011110 thenkeyvalue1=00100; -4elsif temp1=11011101 thenkeyvalue1=00101; -5elsif temp1=11011011 thenkeyvalue1=00110; -6elsif temp1=11010111 thenkeyvalue1=00111; -7elsif temp1=101111

7、10 thenkeyvalue1=01000; -8elsif temp1=10111101 thenkeyvalue1=01001; -9elsif temp1=10111011 thenkeyvalue1=01010; -10elsif temp1=10110111 thenkeyvalue1=01011; -11elsif temp1=01111110 thenkeyvalue1=01100; -12elsif temp1=01111101 thenkeyvalue1=01101; -13elsif temp1=01111011 thenkeyvalue1=01110; -14elsif

8、 temp1=01110111 thenkeyvalue1 test1 test2 test3 test4 test5 test6 test7 test8 test9 test10 test11 test12 test13 test14 test15 test16null;end case;if test1=test5 and test2=test6 and test3=test7 and test4=test8 and test5=test9 and test6=test10 and test7=test11 and test8=test12 and test9=test13 and tes

9、t10=test14 and test11=test15 and test12=test16 and test1 /= UUUUUUUU then仿真波形如下:从图中可以看出最终temp1从临时信号temp得到最终输出,达到防抖:5.运算模块当前段的模块经过防抖处理以后得到稳定的按键信号,比如1+2=3,转化为编码值就是11101101 10111011 01111101 11100111 = ED BB EB 7D E7(具体编码表见附录)主要代码如下:if ysfh=0 then result=first+second; elsif ysfh=1 then result=first-sec

10、ond; elsif ysfh=2 then result=first*second; end if; n=n+1;elsif n=100 then n=000;end if;end if; end process; process (n) begin if n=001then keyvaluein=conv_std_logic_vector(first,8); elsif n=011then keyvaluein=conv_std_logic_vector(second,8); elsif n=100then keyvaluein=conv_std_logic_vector(result,8); end if; end process;仿真波形如下:以1+3=4 和 5x6=30为例:编码:01 + 03 =04 05 X 06 =1E6.数码管显示模块以及动态扫描模块由于次两个模块是密切相关的,所以统一到一起验证。经过运算得到最终的显示结果后,要在七段数码管中显示,就必须有每一个数的七段码,同时,由于前面的运算模块的结果最大可以达到81,也就是需要8位二进制,两位十进制来表示,所以就必须通过显示模块来分离出十位和个位。分离出十位和个位以

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 办公文档 > 教学/培训

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号