微电子课程设计利用键盘控制数码管进行十进制数字显示(基于fpga的数码管十进制显示)_第1页
微电子课程设计利用键盘控制数码管进行十进制数字显示(基于fpga的数码管十进制显示)_第2页
微电子课程设计利用键盘控制数码管进行十进制数字显示(基于fpga的数码管十进制显示)_第3页
微电子课程设计利用键盘控制数码管进行十进制数字显示(基于fpga的数码管十进制显示)_第4页
微电子课程设计利用键盘控制数码管进行十进制数字显示(基于fpga的数码管十进制显示)_第5页
已阅读5页,还剩8页未读 继续免费阅读

下载本文档

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

文档简介

目 录1、课程设计的目的12、课程设计内容和要求12.1、设计内容12.2、设计要求13、设计方案及实现情况13.1、设计思路13.2、工作原理及框图13.3、各模块功能描述33.4、仿真结果93.5、试验箱验证情况104、课程设计总结115、参考文献12- 2 -1、课程设计的目的1)、学习操作数字电路设计实验开发系统,掌握数码管显示模块的工作原理及应用。 2)、掌握组合逻辑电路、时序逻辑电路的设计方法。 3)、学习掌握可编程器件设计的全过程。2、课程设计内容和要求2.1、设计内容1)、学习掌握键盘控制模块、数码管显示模块的工作原理及应用; 2)、熟练掌握VHDL编程语言,编写键盘控制模块的控制逻辑。2.2、设计要求1)、仿真所编写的程序,模拟验证所编写的模块功能; 2)、下载程序到芯片中,硬件验证所设置的功能,能够实现十进制数的显示; 3)、整理设计内容,编写设计说明书。3、设计方案及实现情况3.1、设计思路1)、键盘不断扫描,有按键按下则输出相应信号,并且发出使能信号给处理模块。2)、处理模块对收到的信号进行判断,决定执行什么操作,对数据进行运算。3)、对于数字键需要移位显示,功能键要考虑优先级判断,进行倒计时操作时要能对时钟信号分频自减。4)、专门的程序段用来不断将当前数据各位求出,译码成显示内容输给数据选择模块。5)、数据选择模块根据扫描电路选择信号将各位数字显示出来。3.2、工作原理及框图1、键盘原理 键盘电路网络很像一台微缩的计算机,它拥有自己的处理器和在该处理器之间传输数据的电路,这个电路的很大一部分组成了键矩阵。键矩阵是位于键下方的一种电路网格。在所有的键盘(中,每个电路在每个按键所处的位置点下均处于断开状态。当您按下某个键时,此按键将按下了开关,从而闭合电路,使得少量电流可以通过。开关的机械作用会导致某种振动(称作回弹),处理器可以过滤掉这种振动。如果您按下某键并保持住,则处理器认为您是在反复按下该键。试验箱上的键盘可以看做是8*4的矩阵键盘(虽然外部不是),8行由38译码器选择,所以有外部sel0-2三根线控制扫描。2、键盘中按键的判断 对于键盘中有无键按下的判断是很重要的,具体判断如下:将全部行线置低电平,然后检测列线的状态。只要有一列的电平为低,则表示键盘中有键被按下,而且闭合的键位于低电平线与行线相交叉的按键之中。若所有列线均为高电平,则键盘中无键按下。在确认有键按下后,即可进入确定具体闭合键的过程。其方法是:依次将行线置为低电平,即在置某根行线为低电平时,其它线为高电平。在确定某根行线位置为低电平后,再逐行检测各列线的电平状态。若某列为低,则该列线与低电平的行线交叉处的按键就是闭合的按键。键盘扫描模块在时钟下不断将行置零,扫描列的状态,判断按键。3、键盘按键对应的编码Sel2-0Kin3-0对应按键0001110000111101010111020111110311011104111111050001101600111017Sel2-0Kin3-0对应按键10011018101110191101011NEXT0001011LAST1111011ENTER1011110ESC1101101A(+)1111101B(-)4、数据处理键盘扫描模块检测到按键按下后,给下级发出使能脉冲,同时将按键信息给数据处理模块。根据按键不同进行不同处理。数字键按下时,要进行移位操作;加减键按下时要进行寄存操作;自加减键按下是要进行加减1操作;清零键按下时要进行全部清零;确认键按下时要进行计算操作或者倒计时操作。这就需要设立一些标志位来判断。计算采用一位BCD形式计算,进借位标志位辅助,这样比用实数计算后转BCD形式的电路简单高效。处于倒计时模式时,引入外部时钟,内部分频后自减一操作。5、多路选择显示四个需要显示的数码管的值始终输入,通过片选决定某一时刻那个值输出。选择信号即为扫描输出信号,因为数码管和键盘是共用一个扫描端。所以当扫描信号选中相应数码管时让对应值输出即可。6、整体电路结构框图图1.原理图框架3.3、各模块功能描述扫描模块:LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_ARITH.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY scan ISPORT(clk:IN STD_LOGIC;-输入时钟en:OUT STD_LOGIC;-有键按下时输出使能data:OUT STD_LOGIC_VECTOR(3 DOWNTO 0);-输出按键信息slk:OUT STD_LOGIC_VECTOR(2 DOWNTO 0);-数码管选择端口kin:IN STD_LOGIC_VECTOR(3 DOWNTO 0);-键盘响应输入端口END scan;ARCHITECTURE behave OF scan ISBEGINPROCESS(clk)VARIABLE pslk:STD_LOGIC_VECTOR(2 DOWNTO 0);-扫描变量VARIABLE p:STD_LOGIC_VECTOR(6 DOWNTO 0);-按键信息变量VARIABLE i:INTEGER RANGE 0 TO 7;-扫描循环变量VARIABLE rel:INTEGER RANGE 0 TO 300;-重复按键延时变量VARIABLE int:STD_LOGIC;-按键中断变量BEGINIF(clkEVENT AND clk=1)THEN-500HZ的时钟信号上升沿触发IF(rel=300)THEN-两次按键产生有效的最短时间,延时避免重复触发rel:=rel;ELSErel:=rel+1;END IF;IF(i=7)THEN-扫描信号为000111,8次循环扫描slkdatadatadatadatadatadatadatadatadatadatadatadatadatadatadatadataNULL;END CASE;en=1;-产生脉冲信号END IF;ELSEenbit0bit0bit0bit0bit0bit0bit0bit0bit0bit0bit09)THEN-大于10进位c2:=1;zz:=zz-10;ELSEc2:=0;END IF;z:=zz;END PROCEDURE add;PROCEDURE sub-子程序(十进制一位减法)(a:IN INTEGER;-被减数b:IN INTEGER;-减数c1:IN INTEGER RANGE 0 TO 2;-上级借位z:OUT INTEGER;-差c2:OUT INTEGER RANGE 0 TO 2)IS-下级借位VARIABLE zz:INTEGER;BEGINzz:=a-b-c1;-被减数-减数-借位IF(zz-按键为“enter”键,执行求结果,倒计时启动暂停功能n:=0;-解除加减法待操作状态IF(a=1)THEN-有加法则进行加法运算a:=0;-加法标志位清零add(q1,p1,0,q1,c);-被加数与加数求和add(q2,p2,c,q2,c);add(q3,p3,c,q3,c);add(q4,p4,c,q4,c);ELSIF (b=1)THEN-有减法则进行减法运算b:=0;-减法标志位清零sub(p1,q1,0,q1,c);-被减数与减数作差sub(p2,q2,c,q2,c);sub(p3,q3,c,q3,c);sub(p4,q4,c,q4,c);ELSIF (r=0)THEN-没有加减法操作又不在倒计时状态则启动倒计时r:=1;ELSE-否则为在倒计时状态,“enter”键功能为暂停r:=0;END IF;WHEN 1110 =-按键为“A(+)”键,执行加法功能IF (r=0)THEN-不在倒计时状态,则(否则无效)a:=1;-加法标注位置1b:=0;-减法标志位清零n:=1;-待操作位置1x_to_y(q1,q2,q3,q4,p1,p2,p3,p4);-被加数暂存x_to_y(0,0,0,0,q1,q2,q3,q4);-显示清零END IF;WHEN 1111 =-按键为“B(-)”键,执行减法功能IF (r=0)THEN-不在倒计时状态,则(否则无效)a:=0;-加法标志位清零b:=1;-减法标志位置1n:=1;-待操作位置1x_to_y(q1,q2,q3,q4,p1,p2,p3,p4);-被减数暂存x_to_y(0,0,0,0,q1,q2,q3,q4);-显示清零END IF;WHEN 1010 =-按键为“next”键,执行自加1功能IF (r=0)THEN-不在倒计时状态,则(否则无效)IF (n=0)THEN-不在加减号刚输入之后(否则无效)add(q1,1,0,q1,c);-加1add(q2,0,c,q2,c);add(q3,0,c,q3,c);add(q4,0,c,q4,c);END IF;END IF;WHEN 1011 =-按键为“last”键,执行自减1功能IF (r=0)THEN-不在倒计时状态,则(否则无效)IF (n=0)THEN-不在加减号刚输入之后(否则无效)sub(q1,1,0,q1,c);-减1sub(q2,0,c,q2,c);sub(q3,0,c,q3,c);sub(q4,0,c,q4,c);END IF;END IF;WHEN 1101 =-按键为“esc”键,执行清零功能IF (r=0)THEN-不在倒计时状态,则(否则无效)x_to_y(0,0,0,0,p1,p2,p3,p4);-寄存器,标志位清零x_to_y(0,0,0,0,q1,q2,q3,q4);a:=0;b:=0;n:=0;END IF;WHEN OTHERS =-按键为“09”,执行多位数据输入,移位显示IF (r=0)THEN-不在倒计时状态,则(否则无效)n:=0;-解除加减法待操作状态q4:=q3;-后一个数码管显示内容给前一个q3:=q2;q2:=q1;q1:=CONV_INTEGER(date2);-第一位读取输入的数字END IF;END CASE;e:=1;-重复屏蔽信号打开,防止重复触发ELSIF (en2=0)THEN-使能脉冲过去后重复屏蔽信号关闭e:=0;END IF;IF(r=1)THEN-在倒计时状态,执行每秒减1倒计时IF(countnumbernumbernumbernumbernumber=00000000;-高四位数码管未用,选到是统一输出全暗END CASE;END PROCESS;END behave;3.4、仿真结果图2.扫描电路模块仿真图3.数据处理模块仿真图4.多路开关模块仿真3.5、试验箱验证情况将编写好的程序编译运行并检查无误后下载到装有一款EP1K30TC1443N芯片的实验箱,分配好各个管脚后再次验证次所用程序下载的是否完整后根据课程设计要求按某一个在09的数字键能正确显示所按数字,各功能键是否起作用,从而实现利用键盘控制数码管进行十进制数字的显示。 图5.输入被加数图6.按下“A”表示减图7.输入加数图8.按下“ENTER”表示等于图9.按下“NEXT”表示下一个数图10.按下“LAST”表示上一个数图11.再按下“ENTER”表示倒计时,暂停也是该键图12.按下“ESC”表示清零4、课程设计总结此次试验用一周多的时间用FPGA设计实现了键盘控制数码管显示十进制数的功能。题目很简单,可自由发挥。所以我在十进制数输入和显示的基础上给自己增加了加减法运算和倒计时的要求。本次课设运用的是FPGA芯片,编程语言为VHDL语言,对于没有真正学过FPGA,VHDL又已有些生疏的我们来说,开始阶段确实遇到不少麻烦。比如,数码管的扫描信号和键盘的扫描信号共用,如何让键盘实现扫描又能在对应位显示。开始运用中断程序分时工作,后来发现可以同时存在。开始写程序从头写到尾,各种功能交叉在一起,后来发现经过模块化分,各模块功能独立,便于编写,检查和拓展。这种模块化的设计思路被证明确实是种好习惯。程序语言的设计中经常出现信号不能按所希望的方式变化,而且VHDL语言对变量的属性要求很高,因此在一种程序表达不能够实现的情况下可以通过另一种表达方式或者逻辑形式去实现,从自己的经历我体会到同样的效果确实可以有不同的程序设计思路。一个礼拜的时间,我经历过最初的课本复习,经历过迅速成功,经历

温馨提示

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

评论

0/150

提交评论