课程设计基于FPGA的数码管十进制显示.docx
《课程设计基于FPGA的数码管十进制显示.docx》由会员分享,可在线阅读,更多相关《课程设计基于FPGA的数码管十进制显示.docx(19页珍藏版)》请在冰豆网上搜索。
课程设计基于FPGA的数码管十进制显示
中北大学
课程设计说明书
学生姓名:
金博楠
学号:
0906024139
学院:
电子与计算机科学技术学院
专业:
微电子
题目:
利用键盘控制数码管进行十进制数字显示
指导教师:
崔永俊职称:
副教授
2012年6月22日
目录
1、课程设计的目的……………………………………………………………1
2、课程设计内容和要求……………………………………………………1
2.1、设计内容………………………………………………………………1
2.2、设计要求………………………………………………………………1
3、设计方案及实现情况……………………………………………………1
3.1、设计思路………………………………………………………………1
3.2、工作原理及框图………………………………………………………1
3.3、各模块功能描述………………………………………………………3
3.4、仿真结果………………………………………………………………9
3.5、试验箱验证情况………………………………………………………10
4、课程设计总结……………………………………………………………11
5、参考文献………………………………………………………………12
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-0
Kin3-0
对应按键
000
1110
0
001
1110
1
010
1110
2
011
1110
3
110
1110
4
111
1110
5
000
1101
6
001
1101
7
Sel2-0
Kin3-0
对应按键
100
1101
8
101
1101
9
110
1011
NEXT
000
1011
LAST
111
1011
ENTER
101
1110
ESC
110
1101
A(+)
111
1101
B(-)
4、数据处理
键盘扫描模块检测到按键按下后,给下级发出使能脉冲,同时将按键信息给数据处理模块。
根据按键不同进行不同处理。
数字键按下时,要进行移位操作;加减键按下时要进行寄存操作;自加减键按下是要进行加减1操作;清零键按下时要进行全部清零;确认键按下时要进行计算操作或者倒计时操作。
这就需要设立一些标志位来判断。
计算采用一位BCD形式计算,进借位标志位辅助,这样比用实数计算后转BCD形式的电路简单高效。
处于倒计时模式时,引入外部时钟,内部分频后自减一操作。
5、多路选择显示
四个需要显示的数码管的值始终输入,通过片选决定某一时刻那个值输出。
选择信号即为扫描输出信号,因为数码管和键盘是共用一个扫描端。
所以当扫描信号选中相应数码管时让对应值输出即可。
6、整体电路结构框图
图1.原理图框架
3.3、各模块功能描述
扫描模块:
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_ARITH.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYscanIS
PORT(clk:
INSTD_LOGIC;--输入时钟
en:
OUTSTD_LOGIC;--有键按下时输出使能
data:
OUTSTD_LOGIC_VECTOR(3DOWNTO0);--输出按键信息
slk:
OUTSTD_LOGIC_VECTOR(2DOWNTO0);--数码管选择端口
kin:
INSTD_LOGIC_VECTOR(3DOWNTO0));--键盘响应输入端口
ENDscan;
ARCHITECTUREbehaveOFscanIS
BEGIN
PROCESS(clk)
VARIABLEpslk:
STD_LOGIC_VECTOR(2DOWNTO0);--扫描变量
VARIABLEp:
STD_LOGIC_VECTOR(6DOWNTO0);--按键信息变量
VARIABLEi:
INTEGERRANGE0TO7;--扫描循环变量
VARIABLErel:
INTEGERRANGE0TO300;--重复按键延时变量
VARIABLEint:
STD_LOGIC;--按键中断变量
BEGIN
IF(clk'EVENTANDclk='1')THEN--500HZ的时钟信号上升沿触发
IF(rel=300)THEN--两次按键产生有效的最短时间,延时避免重复触发
rel:
=rel;
ELSE
rel:
=rel+1;
ENDIF;
IF(i<=7)THEN--扫描信号为000~111,8次循环扫描
slk<=pslk;--赋扫描值
int:
=kin(0)ANDkin
(1)ANDkin
(2)ANDkin(3);--按键输入任意位为0即引起中断
IF(int='0'ANDrel=300)THEN
--在中断和最小按键间隔条件满足下对按键内容进行判断
FORjIN0TO20LOOP--延时(避开抖动阶段)
ENDLOOP;
int:
=kin(0)ANDkin
(1)ANDkin
(2)ANDkin(3);
IF(int='0')THEN--消抖后再次确认有键按下
rel:
=0;
p:
=(pslk-1)&kin;--结合slk和kin的信息判断哪个键按下
CASEpIS--判断按键信息
WHEN"0001110"=>data<="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<="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";--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"=>data<="1111";--15-B(-)
WHENOTHERS=>NULL;
ENDCASE;
en<='1';--产生脉冲信号
ENDIF;
ELSE
en<='0';
ENDIF;
pslk:
=pslk+1;
FORjIN0TO3LOOP
ENDLOOP;
i:
=i+1;
ELSE
i:
=0;
ENDIF;
ENDIF;
ENDPROCESS;
ENDbehave;
数据处理模块:
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_ARITH.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYeightbitIS
PORT(data2:
INSTD_LOGIC_VECTOR(3DOWNTO0);--按键信息输入
en2:
INSTD_LOGIC;--使能脉冲接收
clk2:
INSTD_LOGIC;--时钟信号,负责检查输入信号状态,分频倒计时
bit1:
OUTSTD_LOGIC_VECTOR(7DOWNTO0);
bit2:
OUTSTD_LOGIC_VECTOR(7DOWNTO0);
bit3:
OUTSTD_LOGIC_VECTOR(7DOWNTO0);
bit4:
OUTSTD_LOGIC_VECTOR(7DOWNTO0));
--对应四个需要显示的数码管需要显示的信息
ENDeightbit;
ARCHITECTUREbehaveOFeightbitIS
PROCEDUREq_to_bit--子程序(数值转数码管显示码)
(q:
ININTEGER;--需要显示的数值
SIGNALbit0:
OUTSTD_LOGIC_VECTOR(7DOWNTO0))IS--转换出来的数码管显示码
BEGIN
CASEqIS
WHEN0=>bit0<="00111111";
WHEN1=>bit0<="00000110";
WHEN2=>bit0<="01011011";
WHEN3=>bit0<="01001111";
WHEN4=>bit0<="01100110";
WHEN5=>bit0<="01101101";
WHEN6=>bit0<="01111101";
WHEN7=>bit0<="00100111";
WHEN8=>bit0<="01111111";
WHEN9=>bit0<="01101111";
WHENOTHERS=>bit0<="00000000";
ENDCASE;
ENDPROCEDUREq_to_bit;
PROCEDUREx_to_y--子程序(四变量赋值)
(x1:
ININTEGER;--赋值内容
x2:
ININTEGER;
x3:
ININTEGER;
x4:
ININTEGER;
y1:
OUTINTEGER;--被赋值变量
y2:
OUTINTEGER;
y3:
OUTINTEGER;
y4:
OUTINTEGER)IS
BEGIN
y1:
=x1;
y2:
=x2;
y3:
=x3;
y4:
=x4;
ENDPROCEDUREx_to_y;
PROCEDUREadd--子程序(十进制一位加法)
(a:
ININTEGER;--被加数
b:
ININTEGER;--加数
c1:
ININTEGERRANGE0TO2;--上级进位
z:
OUTINTEGER;--和
c2:
OUTINTEGERRANGE0TO2)IS--下级进位
VARIABLEzz:
INTEGER;
BEGIN
zz:
=a+b+c1;--被加数+加数+进位
IF(zz>9)THEN--大于10进位
c2:
=1;
zz:
=zz-10;
ELSE
c2:
=0;
ENDIF;
z:
=zz;
ENDPROCEDUREadd;
PROCEDUREsub--子程序(十进制一位减法)
(a:
ININTEGER;--被减数
b:
ININTEGER;--减数
c1:
ININTEGERRANGE0TO2;--上级借位
z:
OUTINTEGER;--差
c2:
OUTINTEGERRANGE0TO2)IS--下级借位
VARIABLEzz:
INTEGER;
BEGIN
zz:
=a-b-c1;--被减数-减数-借位
IF(zz<0)THEN--差小于0借位
c2:
=1;
zz:
=zz+10;
ELSE
c2:
=0;
ENDIF;
z:
=zz;
ENDPROCEDUREsub;
BEGIN
PROCESS(clk2)
VARIABLEq1,q2,q3,q4,p1,p2,p3,p4:
INTEGERRANGE0TO9:
=0;
--q为显示的数对应的四个位的值,p和q一一对应,用作加减法时存放被加数,被减数
VARIABLEc:
INTEGERRANGE0TO2:
=0;--进位,借位标志位
VARIABLEr,n,a,b,e:
BIT:
='0';
--r为倒计时标志位,n为加减法待操作位,a为加法标志位,b为减法标志位,e为重复屏蔽位
VARIABLEcount:
INTEGERRANGE0TO500:
=0;--倒计时分频计数变量
BEGIN
IF(clk2'EVENTANDclk2='1')THEN--时钟信号上升沿触发检查端口状态
IF(en2='1'ANDe='0')THEN--使能信号有效,且重复屏蔽信号关闭时响应按键信息
CASEdata2IS
WHEN"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,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';
ENDIF;
WHEN"1110"=>--按键为“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);--显示清零
ENDIF;
WHEN"1111"=>--按键为“B(-)”键,执行减法功能
IF(r='0')THEN--不在倒计时状态,则(否则无效)
a:
='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);--显示清零
ENDIF;
WHEN"1010"=>--按键为“next”键,执行自加1功能
IF(r='0')THEN--不在倒计时状态,则(否则无效)
IF(n='0')THEN--不在加减号刚输入之后(否则无效)
add(q1,1,0,q1,c);--加1
add(q2,0,c,q2,c);
add(q3,0,c,q3,c);
add(q4,0,c,q4,c);
ENDIF;
ENDIF;
WHEN"1011"=>--按键为“last”键,执行自减1功能
IF(r='0')THEN--不在倒计时状态,则(否则无效)
IF(n='0')THEN--不在加减号刚输入之后(否则无效)
sub(q1,1,0,q1,c);--减1
sub(q2,0,c,q2,c);
sub(q3,0,c,q3,c);
sub(q4,0,c,q4,c);
ENDIF;
ENDIF;
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';
ENDIF;
WHENOTHERS=>--按键为“0~9”,执行多位数据输入,移位显示
IF(r='0')THEN--不在倒计时状态,则(否则无效)
n:
='0';--解除加减法待操作状态
q4:
=q3;--后一个数码管显示内容给前一个
q3:
=q2;
q2:
=q1;
q1:
=CONV_INTEGER(date2);--第一位读取输入的数字
ENDIF;
ENDCASE;
e:
='1';--重复屏蔽信号打开,防止重复触发
ELSIF(en2='0')THEN--使能脉冲过去后重复屏蔽信号关闭
e:
='0';
ENDIF;
IF(r='1')THEN--在倒计时状态,执行每秒减1倒计时