键盘扫描及计算器VHDL仿真_第1页
键盘扫描及计算器VHDL仿真_第2页
键盘扫描及计算器VHDL仿真_第3页
已阅读5页,还剩47页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

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

2、FPG/实验板的原始时钟频率高达 33.8688MHz所以不能直接接入设计模块中使 用,就需要用到分频模块。将 33.8688MHz分频 到4KHz和10Hz来使用,一个用于行驱动扫描时 钟,一个用于防抖模块。所以,采用写一个可变 分频元件来调用。元件视图:elkclkout_kbclkout_LED主要代码如下(完整代码见附录,下同):architecture RTL of freq_divisio n iscomp onent frediv n isgen eric (n:positive);Port ( clki n:in STD_LOGIC;clkout:out STD_LOGIC);

3、end comp onent;begi nU1:fredivngen eric map(n=3)port map(clki n=clk,clkout=clkout_kb);end RTL;仿真结果如下图:达到预期的目的2. 行驱动模块(依次对行置零):键盘扫描的原理就是检测行列信号然后判断 出具体是按下了哪一个按键。所以,对行依次置 零,当置零频率较快时,按下某一个按键后,一 定能得到某一列的信号输出为零,如下图:keyin上拉电阻債i L 4LcDE89A4567屮012当行信号为1110时,若按下了 0键,就会得 到1110的列信号,立马就快可以译码出按键值, 若按下4键、8键、C键则都不

4、会有输出。主要代码如下:process(clk in)begi nif clr=1 the ncou nt=00;elsif rising_edge(clkin) thenif cou nt=11 the ncou nt=00;else coun t=co un t+1;end if;end if;end process;process(co unt) begi nif count=01 thenkeydrv=1110;elsif count=10 thenkeydrv=1101;elsif count=11 thenkeydrv=1011;elsif count=00 thenkeydrv=

5、0111;end if;end process;仿真结果如下图:达到预期的目的3. 键值编码模块依据行驱动模块,当按下某一个按键后,立马 可以根据行列和并位信号得到唯一的键盘编码 值,用5位矢量来保存结果,当没有按键按下时, 编码值一直保持着11111 不变,并在后端的 模块中不对其做任何处理。以下列出部分编码表(完整编码表见附录):十进制 数行&列HEX七段码HEX011101110EE11111107E411011110DE011001133511011101DD10110115B主要代码如下:process(clk)begi nif clr=0 thenif risin g_edge(c

6、lk) the nif temp仁11101110 then keyvalue1=00000;-0elsif temp1=11101101 then keyvalue1=00001;-1elsif temp1=11101011 then keyvalue1=00010;-2elsif temp1=11100111 then keyvalue1=00011;-3elsif temp1=11011110 then keyvalue1=00100;-4elsif temp1=11011101 then keyvalue1=00101;-5elsif temp1=11011011 then keyva

7、lue1=00110;-6elsif temp1=11010111 then keyvalue1=00111;-7elsif temp1=10111110 then keyvalue1=01000;-8elsif temp1=10111101 then keyvalue1=01001;-9elsif temp1=10111011 then keyvalue1=01010;-10elsif temp1=10110111 then keyvalue1=01011;-11elsif temp1=01111110 then keyvalue1=01100;-12elsif temp1=01111101

8、 then keyvalue1=01101;-13elsif temp1=01111011 then keyvalue1=01110;-14elsif temp1=01110111 then keyvalue1 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

9、 and test6=test10 and test7=test11 and test8=test12 and test9=test13 and test10=test14 and test11=test15 and test12=test16 and test1 /= UUUUUUUU then 仿真波形如下:从图中可以看出最终 temp1 从临时信号 temp 得到最终输出,达到防抖:5. 运算模块 当前段的模块经过防抖处理以后得到稳定的 按键信号,比如 1+2=3, 转化为编码值就是 11101101 10111011 01111101 11100111 = EDBB EB 7D E7(

10、 具体编码表见附录 )主要代码如下:if ysfh=0 then result=first+second;elsif ysfh=1 thenresult=first-second;elsif ysfh=2 thenresult=first*second;end if; n=n+1;elsif n=100 thenn=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_l

11、ogic_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 位二进制, 两位十进制来表示, 所 以就

12、必须通过显示模块来分离出十位和个位。分离出十位和个位以后, 就必须要利用动态扫 描使两个数都能显示出来。 因为 8 个七段数码管 的 abcdefg 位是连在一起的, 只有利用分时间隔 来显示,一次使能一个数码管,显示一位数,当 频率较高时,就可以得到两位数的显示效果。数码管显示模块主要代码如下:if num=0 then ten:=0;one:=10;elsif num0then ten:=0;one:=num;elsif num9 then ten:=1;one:=num-10;elsif num19 then ten:=2;one:=num-20;elsif num29 then ten

13、:=3;one:=num-30;elsif num39 then ten:=4;one:=num-40;elsif num49 then ten:=5;one:=num-50;elsif num59 then ten:=6;one:=num-60;elsif num69 then ten:=7;one:=num-70;elsif num79 then ten:=8;one:=num-80;elsif num89 then ten:=9;one:=num-90;end if;t=conv_std_logic_vector(ten,4); o=conv_std_logic_vector(one,4

14、); 动态扫描模块主要代码如下:if count=00 then showout=show1;en=00000010;elsif count=01 then showout=show2;en showout 0110000 3002 = showout 1101101 6D03 = showout 1111001 79由以上波形可以看出: 01 + 02 = 03 的计算 完成了。五、 总结本次EDA设计实践,完成了从VHDL弋码编写 到硬件实现的整个流程,掌握了一些FPGA勺相关概念以及 ISE 软件和 Active-HDL 软件的使用 方法。最重要的就是组员之间的合作, 因为 VHDL程序

15、是模块化编写的,所以不同模块是由不同人 来完成编译的,要达到各个模块之间能够良好的 衔接通信,就必须有一个很好的沟通交流, 把大 家的思路集中起来,一起讨论、编写、调试程序。【附录一】完整程序:分频:library IEEE;useIEEE.STD_L0GIC_116 4.ALL;use IEEE.STD_LOGIC_AR TH.ALL;use IEEE.STD_LOGIC_UN IGNED.ALL;en tityfrediv nisgen eric (n:i nte ger:=3);Portlibrary IEEE; useIEEE.STD_LOGIC_11( 54.ALL;useIEEE.

16、STD_LOGIC_AR ITH.ALL;use IEEE.STD_LOGIC_UN SGNED.ALL;en tity keysca nisPort(clr:in std_logic;clk in :(clki n:inin STD_LOGIC;STD_LOGIC;keydrv :outclkout:outSTD_LOGIC_VECTORSTD_LOGIC);dow nto 0);end frediv n;end keysca n;architecturearchitecturebehavioral ofBehavioralofkeysca n isfrediv n issig nal co

17、unt :sig nalstdo gic_vector(1clk1:stdogic:=0i.dow nto 0);Jsig nalbegi ncoun ter:i ntegerprocess(clk in)range 0 to n;beginbegi nif clr=1 thenprocess(clk in)cou nt=OO;begi nelsififrisin g_edge(clk in)risin g_edge(clk in)the nthe nif cou nt=11ifthe ncounter=(n -1)/2cou nt=OO;the nelsecoun t=co un t+1;c

18、lk1=not clkl;end if;end if;coun ter=0;end process; process(co unt)elsebegi nif cou nt=01coun ter=co un ter+1the nJkeydrv=1110end if;Jend if;elsifend process;count=10 thenclkout=clk1;keydrv=1101end Behavioral;Jelsifcount=11 then keydrv=1011Jelsifcount=00 then keydrvclk in ,keydsig nalrv=keydrv1,clr=c

19、lr)key6:std_logicJ_vector(4 downto 0);tempclk in ,tempdownto 0);=temp,sig naltemp1=temp1,clr=clrkey8:std_logic);_vector(4process(clk)downto 0);beginsig nalif clr=0 thenstart_1:stdoifgic;risin g_edge(clk) the nbegi nifprocess(cltemp仁11101110 thenk_f)beginkeyvalue1=00000;if clr=1elsifthe ntemp仁1110110

20、1 thenkey1=00000keyvalue1=00001;II.Jelsifkey2=00001temp1=11101011 the nII.Jkeyvalue1=00010;key3=00010ii.elsifJtemp1=11100111 the nkey4=00011ii.keyvalue1=00011;Jkey5=00100elsifII.Jtemp1=11011110 the nkey6=00101keyvalue1=00100;II.Jelsiftemp1=11011101 the nkey7=00110II.Jkeyvalue1=00101;key8=00111elsifI

21、I.Jtemp仁11011011 thencou nt1=000keyvalue1=00110;II.Jelsifstart_1=1temp1=11010111 the nJelsekeyvalue1=00111;ifrisin g_edge(clelsifk_f) thentemp1=10111110 the nifkeyvalue1=01000;cou nt1=111elsifthe ntemp1=10111101 the ncou nt1=000keyvalue1=01001;II.Jelseelsifcoun t1=co unt1temp仁10111011 then+1:end if;

22、keyvalue1=01010;end if;elsifend if;temp1=10110111 the ncase count1iskeyvalue1key1key2=kkeyvalue1key3=ktemp1=01111101 the neycode;whe nkeyvalue1key4key5=keycode;keyvalue1=01110;whe nelsiftemp仁01110111 thenkeyvalue1=01111;end if;end if;end if;end process;keycodekey6key7key8nu II;end case; if key仁 key2

23、 and key2=key3 and key3=key4 and key4=key5 and key5=key6 and key6=key7 and key7=key8 and key1/=UUUUUt henkeycode1=ke y1;start_1=0 after 5ns; end if; end process; start=sta rt_1; end fan gdou;运算:library IEEE;uselibrary IEEE;IEEE.STD_LOGIC_1164.A LL;useIEEE.STD LOGICuse1164.all;IEEE.STD LOGIC ARITH.us

24、eieee.std_logic_ arith.all;IEEE.STD LOGIC UNSIGN useALL;useED.ALL;useieee.std_logic_ un sig ned.all;数码管显示:ieee .n umeric_std.all; en tity yun sua n is port(start: in std_logic;keycode1:i n std_logic_vector(4 dow nto 0);keyvalue in :out std_logic_vector(7 dow nto 0);end yun sua n; architecture Behavi

25、oral of yun sua n issig nal first,sec on d,result,y sfh: integer range 0 to 99;sig naln:stdo gic_vector(2 dow nto 0);en tity shumagua nxia nsh i isport(keyval uei n:in stdo gic_vecto r(7 dow nto 0);clk:in std_logic;show1,show2 :out stdo gic_vecto r(6 downto 0);end shumagua nxia nsh i ;architecture s

26、humagua nxia nsh i of shumaguanxianshbegi nprocess(sta戊keycode1)begini f start=1 then n=000;else if n=000 the ni f keycode1=00001then first=1;elsif keycode1=00010then first=2;elsif keycode1=00011then first=3;elsif keycode1=00100then first=4; i issig nal t:std_logic_vec tor(3 dow nto 0);sig nal o:std

27、o gic_vec tor(3 dow nto 0); begi n process(clk) variable n um:i nteger range 0 to 99; variable ten,one: in teger range 0 to 15;begi nif risin g_edge(clk )the nnu m:=c onv intelsif keycode1=00101thenfirst=5;eger(keyvalue inelsif);keycode仁00110the nif n um=0first=6;the nelsiften :=0 ;one:keycode仁00111

28、the n=10;first=7;elsifelsifn um0keycode仁01000the nthe nfirst=8;ten :=0 ;on e:=numelsifJkeycode仁01001the nelsiffirst=9;n um9elsifthe nkeycode仁00000 thenten :=1; on e:=numfirst=0;-10;end if;elsifn=n+1:n um19the nthe niften :=2; on e:=numkeycode仁01010then-20;ysfh=0;elsifelsifn um29ysfh=1;the nelsiften

29、:=3; on e:=numkeycode仁01100the n-30;ysfh=2;elsifend if;n um50 andn39elsif n=010the nthe nten :=4 ;on e:=numif-40;keycode仁00001the nelsifsecond=1;n um49keycode仁OOO1Othe nthe nsec on d=2;ten :=5; on e:=numelsif-50;keycode仁OOO11the nelsifsec on d=3;n um59keycode仁OO1OOthe nthe nsec on d=4;ten :=6; on e:

30、=numelsif-60;keycode仁OO1O1the nelsifsec on d=5;n um69keycode仁OO11Othe nthe nsec on d=6;ten :=7; on e:=numelsif-70;keycode仁OO111the nelsifsec on d=7;n um79keycode仁O1OOOthe nthe nsec on d=8;ten :=8; on e:=numelsif-80;keycode仁O1OO1the nelsifsec on d=9;num89keycode仁OOOOOthe nthe nsec on d=0;ten :=9; on

31、e:=numend if;-90;n=n+1:end if;elsif n=011 a ndt=c on v stdogkeycode仁01101thenic_vector(te n,4if ysfh=0 the n);result=first+sec ond;o=c on v_std_logelsif ysfh=1 the nic_vector( on e,4result=first-sec ond;);elsif ysfh=2 the ncase t isresult=first*sec ond;whe nend if; nshow1=elsif n=100 then0000000;nsh

32、ow1show1=begi n1101101;if n=001thenwhe nkeyvalue inshow1show1=keyvalue inshow1=keyvalue inshow1show1show1show1show1show2show2show2show2show2show2show2show2show2show2show2= 0000000;end case;end if;end process;endshumagua nxia nsh动态显示:library IEEE;usei ;键盘:library IEEE;useIEEE.STD_LC)useuseuseIEEE.STD

33、 LOGICIEEE.STD_LC)LL;GIC_UNSIGNEentity keyboard isD.ALL;Port ( clr: inuse ieee .n umeri c_std.all;en tity shaomiaoxia nshi isport(cl k,clr:in std_logic;show1:i n std_logic_v ector(6 dow nto 0);show2:i nstd_logic_v ector(6std_logic;clk : in STD_LOGIC;keyi n : inSTD_LOGIC_VECT侔 dow nto0);keydrv1:out s

34、td_logic_vector(3 dow nto 0);keyvalue :out STD_LOGIC_VECTOR(4 0);start:out std_logic);end keyboard; architecture RTL ofkeyboard iscomp onent keysca ndow nto 0);Port ( clk in ,clr: inshowoutSTD_LOGIC;:outkeydrv : outstd_logic_vSTD_LOGIC_VECTOR(3 dow nector(60);dow nto 0);end comp onent;en :outcomp on

35、ent keydecoderstd_logic_vPortector(7(clki n,clk,clr:indow nto 0);std_logic;endkeyi n : inshaomiaoxiaSTD_LOGIC_VECTOR dow nton shi;0);architekeycode : outctureSTD_LOGIC_VECTOR dow ntoshaomiaoxia0);nshi ofend comp onent;shaomiaoxiacomp onent fan gdounshi isport(keycode:i nsig nalstd_logic_vector(4 dow ntocoun t:std_l0);ogic vector

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论