矩阵键盘显示,六位数码管滚动显示_第1页
矩阵键盘显示,六位数码管滚动显示_第2页
矩阵键盘显示,六位数码管滚动显示_第3页
矩阵键盘显示,六位数码管滚动显示_第4页
矩阵键盘显示,六位数码管滚动显示_第5页
已阅读5页,还剩18页未读, 继续免费阅读

下载本文档

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

文档简介

南京邮电大学课程设计报告设计类别:EDA-VHDL专业名称:通信工程班级学号:B09010504学生姓名:张嫣艳基此题:矩阵键盘按键的数码管显示综合题:数码管学号滚动显示同小组成员:学号:B09010502姓名:沈沁芳指导教师:王奇、梅中辉、周晓燕、孔凡坤日期:2021年3月5日—3月30日目录一矩阵键盘按键的数码管显示1.实验目的---------------------------------------------------------------------32.实验所用仪器及元器件----------------------------------------------------33.实验任务要求----------------------------------------------------------------34.设计思路-----------------------------------------------------------------------35.模块分析-----------------------------------------------------------------------36.逻辑仿真图及功能分析-----------------------------------------------------47.调试过程与问题--------------------------------------------------------------88.实验总结-----------------------------------------------------------------------89.附录〔VHDL源程序〕-----------------------------------------------------8二数码管学号滚动显示1.实验目的----------------------------------------------------------------------122.实验所用仪器及元器件----------------------------------------------------123.实验任务要求----------------------------------------------------------------134.设计思路----------------------------------------------------------------------135.模块分析----------------------------------------------------------------------136.逻辑仿真图及功能分析----------------------------------------------------167.调试过程与问题-------------------------------------------------------------188.实验总结----------------------------------------------------------------------189.附录〔VHDL源程序〕----------------------------------------------------18一矩阵键盘按键的数码管显示1.实验目的〔1〕.使学生全面了解如何应用该硬件描述语言进行高速集成电路设计;〔2〕.通过软件设计环节与仿真环节使学生熟悉QuartusII设计与仿真环境;〔3〕.通过对基此题、综合题的设计实践,使学生掌握硬件系统设计方法〔自底向上或自顶向下〕,熟悉VHDL语言三种设计风格,熟悉其芯片硬件实现的过程。2.实验所用仪器及元器件(1)PC机(2)ALteraCPLD硬件实验开发系统(3)设计软件〔QuartusII〕3.实验任务要求要求学生设计出4*4矩阵键盘对某一按键按下就在数码管显示一个数字。按键从左上角到右下角依次为1,2,…,16。4.设计思路首先一个4*4矩阵键盘中有四行四列,先假设键盘自上至下的第一行的四个键分别代表01,02,03,04;第二行四个键分别代表05,06,07,08;第三行四个键分别代表09,10,11,12;第四行分别代表13,14,15,16。题目的意思是任意按下一个键,输出端会输出相应的数字,而每个键被选中的条件是它的行数和列数被选中,也就是在仿真中可以假设选中的行数和列数是0电平,而其他的行数和列数都是1电平。所以输入端应是行数与列数,而输出端是两个数码管的显示。5.模块分析〔1〕输入输出解释输入:clk------时钟信号rst------清零row------行线column------列线输出:dataout1------数码管显示数据,个位dataout2------数码管显示数据,十位en------数码管显示使能〔2〕模块解释PROCESS(clk,rst)BEGINIF(NOTrst='1')THENkey_code<="0000";ELSIF(clk'EVENTANDclk='1')THEN--上升沿有效CASErowIS--检测何处有键按下WHEN"1110"=>CASEcolumnISWHEN"1110"=>key_code<="0000";WHEN"1101"=>key_code<="0001";WHEN"1011"=>key_code<="0010";WHEN"0111"=>key_code<="0011";WHENOTHERS=>NULL;ENDCASE;〔……中间省略相同步骤……〕WHENOTHERS=>key_code<="1111";ENDCASE;ENDIF;ENDPROCESS;〔这局部用key_code这个四位存放器来代表16个键〕PROCESS(key_code)BEGINCASEkey_codeISWHEN"0000"=>dataout_tmp1<="10011111";dataout_tmp2<="00000011";WHEN"0001"=>dataout_tmp1<="00100101";dataout_tmp2<="00000011";〔……中间省略相同局部……〕ENDCASE;ENDPROCESS;〔这局部中,对于相应的key_code值输出相应的数值〕6.逻辑仿真图及功能分析中选中第一行第一列时,输出端的两个数码管显示是01〔0000001110011111〕中选中第一行第二列时,输出端的两个数码管显示是02〔0000001100100101〕中选中第一行第三列时,输出端的两个数码管显示是03〔0000001100001101〕中选中第一行第四列时,输出端的两个数码管显示是04〔0000001110011001〕中选中第二行第一列时,输出端的两个数码管显示是05〔0000001101001001〕中选中第二行第二列时,输出端的两个数码管显示是06〔0000001101000001〕中选中第二行第三列时,输出端的两个数码管显示是07〔0000001100011111〕中选中第二行第四列时,输出端的两个数码管显示是08〔0000001100000001〕中选中第三行第一列时,输出端的两个数码管显示是09〔0000001100001001〕中选中第三行第二列时,输出端的两个数码管显示是10〔0000001100000011〕中选中第三行第三列时,输出端的两个数码管显示是11〔0000001100000011〕中选中第三行第四列时,输出端的两个数码管显示是12〔0000001100100101〕中选中第四行第一列时,输出端的两个数码管显示是13〔0000001100001101〕中选中第四行第二列时,输出端的两个数码管显示是14〔0000001110011001〕中选中第四行第三列时,输出端的两个数码管显示是15〔0000001101001001〕中选中第四行第四列时,输出端的两个数码管显示是16〔0000001101000001〕7.调试过程与问题〔1〕操作问题:由于我是第一次接触这个软件,在操作时会忘了一些必要的步骤,从而导致系统出现error,不能运行下去,但是多操作几次以后这种问题就可以被解决了。〔2〕设计问题:联系实际,矩阵键盘中的row一般设计成输出,然后采用扫描的方法进行数码管的输出。但在功能仿真的时候出现了只能扫描出1,2,3,4的情况,仔细分析问题后发现,在确定column了以后,扫描都会从第一列开始,所以采用这种方法就只能出现1,2,3,4四个数字,为了使其他的数字也可以在功能仿真的出现,所以我在仿真的时候将row设计成了输入,以确保每一个数字都有出现的时机。〔3〕时延问题:在功能仿真的时候,在除了01这个数字的显示外,每个数字的显示都会出现一小段的时延。一开始我留意到这个问题时我没有理解,后来我去查看了源代码,然后发现在键盘上的按键按下之前,两个数码管分别默认输出数字是01,如果是按下的是别的键,那么输出的时候会有一定的时延,而它们在真正跳变之前,第一个数码管会显示0,第二个数码管会显示1。8.实验总结通过这个设计实验,我学习到了很多知识。在做这个矩阵键盘的实验设计的过程中,我通过查阅资料和搜集有关的文献,培养了自学能力。并且由原先的被动的接受知识转化为主动的寻求知识,这可以说是学习方法上的一个很大的突破。虽然我之前从来没有用过这个软件,也没有接触过VHDL语言,但是我依然可以通过自学,查阅资料和与同学之间讨论交流来做出这个课题,我想将来不管遇到什么样的题目,只要我采用同样的方法和态度,总会可以找到解决的方案的。9.附录〔VHDL源程序〕------矩阵键盘按键的数码管显示libraryIEEE;useIEEE.STD_LOGIC_1164.ALL;useIEEE.STD_LOGIC_ARITH.ALL;useIEEE.STD_LOGIC_UNSIGNED.ALL;ENTITYKEYSCANISPORT(clk:INstd_logic;rst:INstd_logic;row:INstd_logic_vector(3DOWNTO0);--行线column:INstd_logic_vector(3DOWNTO0);--列线dataout1:OUTstd_logic_vector(7DOWNTO0);--数码管显示数据,个位dataout2:OUTstd_logic_vector(7DOWNTO0);--数码管显示数据,十位en:OUTstd_logic);--数码管显示使能ENDKEYSCAN;ARCHITECTUREarchOFKEYSCANISSIGNALkey_code:std_logic_vector(3DOWNTO0);SIGNALdataout_tmp1:std_logic_vector(7DOWNTO0);SIGNALdataout_tmp2:std_logic_vector(7DOWNTO0);BEGINdataout1<=dataout_tmp1;dataout2<=dataout_tmp2;en<='0';PROCESS(clk,rst)BEGINIF(NOTrst='1')THENkey_code<="0000";ELSIF(clk'EVENTANDclk='1')THEN--上升沿有效CASErowIS--检测何处有键按下WHEN"1110"=>CASEcolumnISWHEN"1110"=>key_code<="0000";WHEN"1101"=>key_code<="0001";WHEN"1011"=>key_code<="0010";WHEN"0111"=>key_code<="0011";WHENOTHERS=>NULL;ENDCASE;WHEN"1101"=>CASEcolumnISWHEN"1110"=>key_code<="0100";WHEN"1101"=>key_code<="0101";WHEN"1011"=>key_code<="0110";WHEN"0111"=>key_code<="0111";WHENOTHERS=>NULL;ENDCASE;WHEN"1011"=>CASEcolumnISWHEN"1110"=>key_code<="1000";WHEN"1101"=>key_code<="1001";WHEN"1011"=>key_code<="1010";WHEN"0111"=>key_code<="1011";WHENOTHERS=>NULL;ENDCASE;WHEN"0111"=>CASEcolumnISWHEN"1110"=>key_code<="1100";WHEN"1101"=>key_code<="1101";WHEN"1011"=>key_code<="1110";WHEN"0111"=>key_code<="1111";WHENOTHERS=>NULL;ENDCASE;WHENOTHERS=>key_code<="1111";ENDCASE;ENDIF;ENDPROCESS;-----显示键值-----0000001110011111001001010000110110011001010010010100000100011111-----01234567-----0000000100001001-----89PROCESS(key_code)BEGINCASEkey_codeISWHEN"0000"=>dataout_tmp1<="10011111";dataout_tmp2<="00000011";WHEN"0001"=>dataout_tmp1<="00100101";dataout_tmp2<="00000011";WHEN"0010"=>dataout_tmp1<="00001101";dataout_tmp2<="00000011";WHEN"0011"=>dataout_tmp1<="10011001";dataout_tmp2<="00000011";WHEN"0100"=>dataout_tmp1<="01001001";dataout_tmp2<="00000011";WHEN"0101"=>dataout_tmp1<="01000001";dataout_tmp2<="00000011";WHEN"0110"=>dataout_tmp1<="00011111";dataout_tmp2<="00000011";WHEN"0111"=>dataout_tmp1<="00000001";dataout_tmp2<="00000011";WHEN"1000"=>dataout_tmp1<="00001001";dataout_tmp2<="00000011";WHEN"1001"=>dataout_tmp1<="00000011";dataout_tmp2<="10011111";WHEN"1010"=>dataout_tmp1<="10011111";dataout_tmp2<="10011111";WHEN"1011"=>dataout_tmp1<="00100101";dataout_tmp2<="10011111";WHEN"1100"=>dataout_tmp1<="00001101";dataout_tmp2<="10011111";WHEN"1101"=>dataout_tmp1<="10011001";dataout_tmp2<="10011111";WHEN"1110"=>dataout_tmp1<="01001001";dataout_tmp2<="10011111";WHEN"1111"=>dataout_tmp1<="01000001";dataout_tmp2<="10011111";WHENOTHERS=>NULL;ENDCASE;ENDPROCESS;ENDarch;二数码管学号滚动显示1.实验目的〔1〕.使学生全面了解如何应用该硬件描述语言进行高速集成电路设计;〔2〕.通过软件设计环节与仿真环节使学生熟悉QuartusII设计与仿真环境;〔3〕.通过对基此题、综合题的设计实践,使学生掌握硬件系统设计方法〔自底向上或自顶向下〕,熟悉VHDL语言三种设计风格,熟悉其芯片硬件实现的过程。2.实验所用仪器及元器件(1)PC机(2)ALteraCPLD硬件实验开发系统(3)设计软件〔QuartusII〕3.实验任务要求要求学生在六个数码管滚动显示自己的学号〔六位〕,每隔一定时间循环移位一次,学号为奇数那么左移,学号为偶数那么右移。间隔时间可由开关选择1秒,2秒,3秒和4秒。设计思路首先需要有六个数码管用于六位的学号的显示,而实现的时候可以在每个脉冲来临的时候使我的学号中六个数字010504依次在六个数码管上输出,而在六个脉冲之后,010504还是依次输出,但是显示的数码管不同,0在第二个数码管显示,1在第三个数码管显示,0在第四个数码管显示,5在第五个数码管显示,0在第六个数码管显示,4在第一个数码管显示。又一组六个脉冲过去以后,输出的位置会再改变一次,0在第三个数码管显示,1在第四个数码管显示,0在第五个数码管显示,5在第六个数码管显示,0在第一个数码管显示,4在第二个数码管显示。依次类推,就到达了学号的右移效果。而间隔时间的改变可以由程序内部的某一步运行时的长短次数来实现。模块分析〔1〕输入输出解释输入:clk------时钟信号column------行列式键盘的4列 输出:led_out------数码管8段显示,可显示0~9,A~Fled_sel------选择6个数码管,‘1’表示点亮对应数码管output------分频后的时钟Interval------随学号移动而数值改变的存放器模块解释A.模块一PROCESS(clk)--12分频电路VARIABLEcounter:std_logic_vector(2downto0);--计数存放器,12分频输入时钟为1Hz BEGIN IF(clk'EVENTANDclk='0')THEN--下降沿有效 counter:=counter+1; IF(counter=6)THEN clk_temp<=NOTclk_temp;--分频后的时钟变化 counter:="000"; ENDIF; ENDIF; ENDPROCESS; PROCESS(clk)--读取行列式键盘的键值〔这段程序是对时钟clock进行分频,进而得到新的时钟clk_temp,并赋值给输出output〕B.模块二BEGIN IF(clk'EVENTANDclk='0')THENCASEcolumnIS WHEN"1110"=> key_code<="00";WHEN"1101"=> key_code<="01";WHEN"1011"=> key_code<="10";WHEN"0111"=> key_code<="11"; WHENOTHERS=> key_code<="00"; ENDCASE;ENDIF;ENDPROCESS;process(clk_temp) VARIABLEtime_count:std_logic_vector(1DOWNTO0);begin if(clk_temp'eventandclk_temp='0')then--下降沿有效 time_count:=time_count+1; CASEkey_codeISWHEN"00"=> shift<=shift-1; --数据右移1位 if(shift="000")then shift<="110"; endif; WHEN"01"=>if(time_count="10")then time_count:="00";shift<=shift-1; --数据右移1位 if(shift="000")then shift<="110"; endif; endif;WHEN"10"=>if(time_count="11")then time_count:="00";shift<=shift-1; --数据右移1位 if(shift="000")then shift<="110"; endif; endif;WHEN"11"=>if(time_count="00")thenshift<=shift-1; --数据右移1位 if(shift="000")then shift<="110"; endif; endif;WHENOTHERS=>shift<=shift-1; --数据右移1位 if(shift="000")then shift<="110"; endif; ENDCASE; endif;endprocess;〔这模块利用key_code的四个数值来控制四个case,由于time_count初始值是00,在进入运算时是01,根据case的不同,运行次数不同,分别是一次,两次,三次和四次,根据这个来控制移动的间隔时间。并且每次运行时shift的值会减小1,这与数据的右移有关。〕C.模块三process(clk)--显示学号010504VARIABLEled_sel_llb:std_logic_vector(3DOWNTO0);--信号量,6个数码管显示的选择beginif(clk'eventandclk='0')then --时钟下降沿有效if(led_sel_count="0000")then --轮询6个数码管led_sel_count<="0101";else led_sel_count<=led_sel_count-"0001";endif;--0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff--0,1,2,3,4,5,6,7,8,9,空caseled_sel_countis--选择要要显示的值when"0000"=>led_out<=X"99";--位置6,内容4when"0001"=>led_out<=X"c0";--位置5,内容0when"0010"=>led_out<=X"92";--位置4,内容5when"0011"=>led_out<=X"c0";--位置3,内容0when"0100"=>led_out<=X"f9";--位置2,内容1when"0101"=>led_out<=X"c0";--位置1,内容0whenothers=>led_out<=X"92";--其他情况下,位置6,内容5endcase; led_sel_llb:=led_sel_count+shift; if(led_sel_llb>="0110")then led_sel_llb:=led_sel_llb-"0110"; endif;caseled_sel_llbis--选择要被点亮的数码管when"0000"=>led_sel<="000001";--位置6when"0001"=>led_sel<="000010";--位置5when"0010"=>led_sel<="000100";--位置4when"0011"=>led_sel<="001000";--位置3when"0100"=>led_sel<="010000";--位置2when"0101"=>led_sel<="100000";--位置1whenothers=>led_sel<="000001";--其他情况下,位置6,内容5endcase;endif;endprocess;〔这模块中,led_sel用来表示选中的数码管,led_out表示输出的数值。每一个clock过来,都会输出一个数,依次是0-1-0-5-0-4,而数字输出在哪个数码管是由相同时刻的led_sel决定的。由于时钟的跳动很快,虽然每个时钟来临时只有一个数码管被点亮,但是人眼是无法分辨的,所以在视觉上还是每个数码管都被点亮了,就是亮度没有静态显示的时候亮。这样动态的运用对于节约电能也是有所奉献的。〕6.逻辑仿真图及功能分析〔1〕右移功能的展示:

〔led-sel表示选中点亮的数码管,100000表示点亮左侧第一个,010000表示点亮左侧第二个,一次类推;led-out表示选中数码管显示的数字,11000000表示0,11111001表示1,10010010表示5,10011001表示4〕一开始六个数码管从左至右分别为0-1-0-5-0-4第一个时钟output的下降沿来临时时,显示右移一位4-0-1-0-5-0没有时钟output下降沿,显示不变4-0-1-0-5-0第二个时钟output下降沿来临,显示右移一位0-4-0-1-0-5没有output下降沿,显示不改变0-4-0-1-0-5第三个时钟output下降沿来临,显示右移一位5-0-4-0-1-0四个不同循环间隔功能的展示:〔每次数码管显示的数字有改变时,interval的数值都会减小一位,即只要比拟interval的数值变化快慢就可以知道移动一位的时间间隔了,令时钟output的一个周期为T。选择间隔是由column来决定的,1110表示循环间隔为1秒,1101表示循环间隔为2秒,1011表示循环间隔为3秒,0111表示循环间隔为4秒〕Column为1110,interval=TColumn为1101,interval=2TColumn为1011,interval=3TColumn为0111,interval=4T7.调试过程与问题〔1〕操作问题:由于我是第一次接触这个软件,在操作时会忘了一些必要的步骤,从而导致系统出现error,不能运行下去,但是多操作几次以后这种问题就可以被解决了。〔2〕设计问题:题目要求是间隔时间可由开关选择1秒,2秒,3秒和4秒,虽然我可以做到间隔时间可由开关选择T,2T,3T,4T,但对于如何使T=1秒,我还是没有知道应该如何实现。〔3〕截图问题:根据实验报告的要求,要把仿真的图截下来,而数码管显示的变化要能够看出来,图片就需要很长,实际上无法截下来,所以,我在完成后增加了一个存放器interval,每当学号移动时,interval的数值会减小一位,这样,只要将时钟周期变小,压缩图片,观察每个interval所占的周期长短就可以了。8.实验总结通过这个设计实验,我学习到了很多知识。在做这个数码管学号滚动显示的实验设计的过程中,我通过查阅资料和搜集有关的文献,培养了自学能力。并且由原先的被动的接受知识转化为主动的寻求知识,这可以说是学习方法上的一个很大的突破。虽然我之前从来没有用过这个软件,也没有接触过VHDL语言,但是我依然可以通过自学,查阅资料和与同学之间讨论交流来做出这个课题,我想将来不管遇到什么样的题目,只要我采用同样的方法和态度,总会可以找到解决的方案的。并且通过这次实验我充分体会到了集思广益的好处。很多时候,并不是只有请教会的人才可以得到答案,往往在大家都不会的时候,讨论着讨论着,就会有灵感出现,而灵感出现的时候一定要去尝试,并且不断的改良。通过这次实验,我对VHDL语言有了进一步的理解,也进一步理解了课堂上关于时序逻辑电路的内容,对于计数器,译码器的应用油了更深层次的理解。通过这次实验,我稳固了再数字电路与逻辑设计课上学习到的理论知识,加深了对理论知识的理解。9.附录〔VHDL源程序〕------数码管学号滚动显示LIBRARYieee;USEieee.std_logic_1164.all;USEieee.std_logic_unsigned.all;--显示模块ENTITYllbISPORT(clk :INSTD_LOGIC;led_out:OUTSTD_LOGIC_VECTOR(7DOWNTO0);--数码管8段显示,可显示0~9,A~Fled_sel:BUFFERSTD_LOGIC_VECTOR(5DOWNTO0);--选择6个数码管,‘1’表示点亮对应数码管 output:OUTSTD_LOGIC; interval:OUTSTD_LOGIC_VECTOR(2downto0);column:INSTD_LOGIC_VECTOR(3downto0)--行列式键盘的4列 );ENDllb;ARCHITECTUREBehaviorOFllbIS signalclk_temp:std_logic:='1';--用作分频后的电路时钟signalled_sel_count:std_logic_vector(3DOWNTO0);--信号量,6个数码管显示的选择signaldiv_cnt:std_logic_vector(1downto0);--行扫描驱动 signalscan_key:std_logic_vector(3DOWNTO0);--扫描码存放器 signalkey_code:std_logic_vector(1DOWNTO0);--存储键值 signalshift:std_logic_vector(2DOWNTO0):="110";--控制数码管显示的数据右移 begin output<=clk_temp; interval<=shift; PROCESS(clk)--12分频电路 VARIABLEcounter:std_logic_vector(2downto0);--计数存放器,12分频输入时钟为1Hz BEGIN IF(clk'EVENTANDclk='0')THEN--下降沿有效 counter:=counter+1; IF(counter=6)THEN clk_temp<=NOTclk_temp;--分频后的时钟变化 counter:="000"; ENDIF; ENDIF; ENDPROCESS; PROCESS(clk)--读取行列式键盘的键值 BEGIN IF(clk'EVENTANDclk='0')THENCASEcolumnIS WHEN"1110"=> key_code<="00";WHEN"1101"=> key_code<="01";WHEN"1011"=> key_code<="10";WHEN"0111"=> key_code<="11"; WHENOTHERS=> key_code<="00"; ENDCASE;ENDIF;ENDPROCESS;process(clk_temp) VARIABLEtime_count:std_logic_vector(1DOWNTO0);begin if(clk_temp'eventandclk_temp='0')then--下降沿有效 time_count:=time_count+1; CASEkey_codeISWHEN"00"=> shift<=shift-1; --数据右移1位 if(shift="000")then shift<="110"; endif; WHEN"01"=>if(time_count="10")then time_count:="00";shift<=shift-1; --数据右移1位 if(shift="000")then shift<="110"; endif; endif;WHEN"10"=>if(time_count="11")then time_count:="00";shift<=shift-1; --数据右移1位 if(shift="000")then shift<="110"; endif; endif;WHEN"11"=>if(time_count="00")thenshift<=shift-1; --数据右移1位 if(shift="000")then shift<="110"; endif; endif;WHENOTHERS=>shift<=shift-1; --数据右移1位 if(shift="000")then shift<="11

温馨提示

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

评论

0/150

提交评论