课程设计(基于FPGA的数码管十进制显示)_第1页
课程设计(基于FPGA的数码管十进制显示)_第2页
课程设计(基于FPGA的数码管十进制显示)_第3页
课程设计(基于FPGA的数码管十进制显示)_第4页
课程设计(基于FPGA的数码管十进制显示)_第5页
已阅读5页,还剩10页未读 继续免费阅读

下载本文档

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

文档简介

1、中北大学课 程 设 计 说 明 书指导教师: 崔永俊 职称: 副教授2012 年 6 月 22 日目 录1、课程设计的目的 12、课程设计内容和要求 2.1、设计内容 2.2、设计要求 3、设计方案及实现情况 3.1、设计思路 3.2、工作原理及框图 3.3、各模块功能描述 3.4、仿真结果 3.5、试验箱验证情况 4、课程设计总结 5、参考文献 - 1 - 1 1 1 1 1 1 3 9 1011 121、课程设计的目的1)、学习操作数字电路设计实验开发系统,掌握数码管显示模块的工作原理及应用。2)、掌握组合逻辑电路、时序逻辑电路的设计方法。3)、学习掌握可编程器件设计的全过程。2、课程设计

2、内容和要求2.1、设计内容1)、学习掌握键盘控制模块、数码管显示模块的工作原理及应用;2)、熟练掌握VHDL编程语言,编写键盘控制模块的控制逻辑。2.2、设计要求1)、仿真所编写的程序,模拟验证所编写的模块功能;2)、下载程序到芯片中,硬件验证所设置的功能,能够实现十进制数的显示;3)、整理设计内容,编写设计说明书。3、设计方案及实现情况3.1、设计思路1)、键盘不断扫描,有按键按下则输出相应信号,并且发出使能信号给处理模块。 2)、处理模块对收到的信号进行判断,决定执行什么操作,对数据进行运算。 3)、对于数字键需要移位显示,功能键要考虑优先级判断,进行倒计时操作时要能对时钟信号分频自减。4

3、)、专门的程序段用来不断将当前数据各位求出,译码成显示内容输给数据选择模块。 5)、数据选择模块根据扫描电路选择信号将各位数字显示出来。3.2、工作原理及框图1、键盘原理键盘电路网络很像一台微缩的计算机,它拥有自己的处理器和在该处理器之间传输数据的电路,这个电路的很大一部分组成了键矩阵。键矩阵是位于键下方的一种电路网格。在所有的键盘(中,每个电路在每个按键所处的位置点下均处于断开状态。当您按下某个键时,此按键将按下了开关,从而闭合电路,使得少量电流可以通过。开关的机械作用会导致某种振动(称作回弹),处理器可以过滤掉这种振动。如果您按下某键并保 - 1 -持住,则处理器认为您是在反复按下该键。试

4、验箱上的键盘可以看做是8*4的矩阵键盘(虽然外部不是),8行由38译码器选择,所以有外部sel0-2三根线控制扫描。2、键盘中按键的判断对于键盘中有无键按下的判断是很重要的,具体判断如下:将全部行线置低电平,然后检测列线的状态。只要有一列的电平为低,则表示键盘中有键被按下,而且闭合的键位于低电平线与行线相交叉的按键之中。若所有列线均为高电平,则键盘中无键按下。在确认有键按下后,即可进入确定具体闭合键的过程。其方法是:依次将行线置为低电平,即在置某根行线为低电平时,其它线为高电平。在确定某根行线位置为低电平后,再逐行检测各列线的电平状态。若某列为低,则该列线与低电平的行线交叉处的按键就是闭合的按

5、键。键盘扫描模块在时钟下不断将行置零,扫描列的状态,判断按键。3、键盘按键对应的编码4、数据处理键盘扫描模块检测到按键按下后,给下级发出使能脉冲,同时将按键信息给数据处理模块。根据按键不同进行不同处理。数字键按下时,要进行移位操作;加减键按下时要进行寄存操作;自加减键按下是要进行加减1操作;清零键按下时要进行全部清零;确认键按下时要进行计算操作或者倒计时操作。这就需要设立一些标志位来判断。计算采用一位BCD形式计算,进借位标志位辅助,这样比用实数计算后转BCD形式的电- 2 -路简单高效。处于倒计时模式时,引入外部时钟,内部分频后自减一操作。5、多路选择显示四个需要显示的数码管的值始终输入,通

6、过片选决定某一时刻那个值输出。选择信号即为扫描输出信号,因为数码管和键盘是共用一个扫描端。所以当扫描信号选中相应数码管时让对应值输出即可。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;- 3 - -输入时钟 -有键按下时输出使能data:OUT STD_LOGIC_V

7、ECTOR(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

8、 0 TO 7; -扫描循环变量 VARIABLE rel:INTEGER RANGE 0 TO 300; -重复按键延时变量 VARIABLE int:STD_LOGIC; -按键中断变量 BEGINIF(clk'EVENT AND clk='1')THEN -500HZ的时钟信号上升沿触发 IF(rel=300)THEN -两次按键产生有效的最短时间,延时避免重复触发 rel:=rel;ELSErel:=rel+1;END IF;IF(i<=7)THEN -扫描信号为000111,8次循环扫描 slk<=pslk; -赋扫描值 int:=kin(0) A

9、ND kin(1) AND kin(2) AND kin(3); -按键输入任意位为0即引起中断 IF(int='0' AND rel=300)THENFOR j IN 0 TO 20 LOOP END LOOP; int:=kin(0) AND kin(1) AND kin(2) AND kin(3); IF(int='0')THEN -消抖后再次确认有键按下 rel:=0; p:=(pslk-1) & kin; -结合slk和kin的信息判断哪个键按下 CASE p IS -判断按键信息 WHEN "0001110"=>da

10、ta<="0000" -0 WHEN "0011110"=>data<="0001" -1 WHEN "0101110"=>data<="0010" -2 WHEN "0111110"=>data<="0011" -3 WHEN "1101110"=>data<="0100" -4 WHEN "1111110"=>data<=&qu

11、ot;0101" -5 WHEN "0001101"=>data<="0110" -6 WHEN "0011101"=>data<="0111" -7 WHEN "1001101"=>data<="1000" -8 WHEN "1011101"=>data<="1001" -9 WHEN "1101011"=>data<="1010&qu

12、ot; -10-NEXT WHEN "0001011"=>data<="1011" -11-LAST WHEN "1111011"=>data<="1100" -12-ENTER WHEN "1011110"=>data<="1101" -13-ESC WHEN "1101101"=>data<="1110" -14-A(+) WHEN "1111101"=>da

13、ta<="1111" -15-B(-) WHEN OTHERS=>NULL; END CASE; en<='1' -产生脉冲信号 END IF; ELSE - 4 - -在中断和最小按键间隔条件满足下对按键内容进行判断 -延时(避开抖动阶段)en<='0'END IF;pslk:=pslk+1;FOR j IN 0 TO 3 LOOPEND LOOP;i:=i+1;ELSEi:=0;END IF;END IF;END PROCESS;END behave;数据处理模块:LIBRARY IEEE;USE IEEE.STD

14、_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_ARITH.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY eightbit ISPORT(data2:IN STD_LOGIC_VECTOR(3 DOWNTO 0); -按键信息输入 en2:IN STD_LOGIC; -使能脉冲接收 clk2:IN STD_LOGIC; -时钟信号,负责检查输入信号状态,分频倒计时 bit1:OUT STD_LOGIC_VECTOR(7 DOWNTO 0);bit2:OUT STD_LOGIC_VECTOR(7 DOWNTO 0);bit3:OUT

15、STD_LOGIC_VECTOR(7 DOWNTO 0);bit4:OUT STD_LOGIC_VECTOR(7 DOWNTO 0);-对应四个需要显示的数码管需要显示的信息END eightbit;ARCHITECTURE behave OF eightbit ISPROCEDURE q_to_bit -子程序(数值转数码管显示码) (q:IN INTEGER; -需要显示的数值 SIGNAL bit0:OUT STD_LOGIC_VECTOR(7 DOWNTO 0)IS -转换出来的数码管显示码 BEGINCASE q ISWHEN 0=>bit0<="0011111

16、1"WHEN 1=>bit0<="00000110"WHEN 2=>bit0<="01011011"WHEN 3=>bit0<="01001111"WHEN 4=>bit0<="01100110"WHEN 5=>bit0<="01101101"WHEN 6=>bit0<="01111101"WHEN 7=>bit0<="00100111"WHEN 8=>bi

17、t0<="01111111"WHEN 9=>bit0<="01101111"WHEN OTHERS=>bit0<="00000000"END CASE;END PROCEDURE q_to_bit;PROCEDURE x_to_y -子程序(四变量赋值) (x1:IN INTEGER; -赋值内容 x2:IN INTEGER;x3:IN INTEGER;- 5 -x4:IN INTEGER;y1:OUT INTEGER; -被赋值变量 y2:OUT INTEGER;y3:OUT INTEGER;y4:OU

18、T INTEGER)ISBEGINy1:=x1;y2:=x2;y3:=x3;y4:=x4;END PROCEDURE x_to_y;PROCEDURE add -子程序(十进制一位加法) (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>9)THEN -大于10进位 c2:=1;z

19、z:=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<0)THEN -差小于0借位 c2:=1;zz:=zz+10;ELSEc2:

20、=0;END IF;z:=zz;END PROCEDURE sub;BEGINPROCESS(clk2)VARIABLE q1,q2,q3,q4,p1,p2,p3,p4:INTEGER RANGE 0 TO 9:=0;-q为显示的数对应的四个位的值,p和q一一对应,用作加减法时存放被加数,被减数- 6 -VARIABLE c:INTEGER RANGE 0 TO 2:=0; VARIABLE r,n,a,b,e:BIT:='0'-进位,借位标志位BEGINIF(clk2'EVENT AND clk2='1')THEN -时钟信号上升沿触发检查端口状态 I

21、F(en2='1' AND e='0')THEN -使能信号有效,且重复屏蔽信号关闭时响应按键信息 CASE data2 ISWHEN "1100" => -按键为“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,q

22、4,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" => -按键为“

23、A(+)”键,执行加法功能 IF (r='0')THEN -不在倒计时状态,则(否则无效) a:='1' -加法标注位置1 b:='0' -减法标志位清零 n:='1' -待操作位置1 x_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:=

24、9;0' -加法标志位清零 b:='1' -减法标志位置1 n:='1' -待操作位置1 x_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); -加1 ad

25、d(q2,0,c,q2,c); add(q3,0,c,q3,c); add(q4,0,c,q4,c); END IF; END IF;- 7 -r为倒计时标志位,n为加减法待操作位,a为加法标志位,b为减法标志位,e为重复屏蔽位VARIABLE count:INTEGER RANGE 0 TO 500:=0; -倒计时分频计数变量WHEN "1011" => -按键为“last”键,执行自减1功能 IF (r='0')THEN -不在倒计时状态,则(否则无效) IF (n='0')THEN -不在加减号刚输入之后(否则无效) sub(q

26、1,1,0,q1,c); -减1 sub(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 =&g

27、t; -按键为“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')T

28、HEN -在倒计时状态,执行每秒减1倒计时 IF(count<500)THEN -计500次一分频 count:=count+1; -未到500时累加 ELSIF(count=500)THEN -计到500时减1 count:=0; -计数清零 sub(q1,1,0,q1,c);sub(q2,0,c,q2,c);sub(q3,0,c,q3,c);sub(q4,0,c,q4,c);END IF;END IF;END IF;q_to_bit(q1,bit1); -将各位数值转成数码管显示码给输出 q_to_bit(q2,bit2);q_to_bit(q3,bit3);q_to_bit(q4,

29、bit4);END PROCESS;END behave;显示模块:LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;- 8 -USE IEEE.STD_LOGIC_ARITH.ALL; USE IEEE.STD_LOGIC_UNSIGNED.ALL; ENTITY choose ISPORT(slk2:IN STD_LOGIC_VECTOR(2 DOWNTO 0); number1:IN STD_LOGIC_VECTOR(7 DOWNTO 0); number2:IN STD_LOGIC_VECTOR(7 DOWNTO 0); number3:IN STD_L

30、OGIC_VECTOR(7 DOWNTO 0); number4:IN STD_LOGIC_VECTOR(7 DOWNTO 0); number:OUT STD_LOGIC_VECTOR(7 DOWNTO 0); END choose;ARCHITECTURE behave OF choose IS BEGINPROCESS(slk2) BEGINCASE slk2 ISWHEN "000"=>number<=number1; WHEN "001"=>number<=number2; WHEN "010"=>number<=number3; WHEN "011"=>number<=number4;WHEN OTHERS=>number<="00000000" END CASE; END PROCESS; END behave;-扫描信号,用作选择 -各数码管要显示的内容-片选的数码管显示的内容-片选信号对应的多路选择器的选通规则-高四位数码管未用,选到是统一输出全暗3.4、仿真结果图2.扫

温馨提示

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

评论

0/150

提交评论