课程设计基于FPGA的数码管十进制显示.docx

上传人:b****6 文档编号:4022771 上传时间:2022-11-27 格式:DOCX 页数:19 大小:309.69KB
下载 相关 举报
课程设计基于FPGA的数码管十进制显示.docx_第1页
第1页 / 共19页
课程设计基于FPGA的数码管十进制显示.docx_第2页
第2页 / 共19页
课程设计基于FPGA的数码管十进制显示.docx_第3页
第3页 / 共19页
课程设计基于FPGA的数码管十进制显示.docx_第4页
第4页 / 共19页
课程设计基于FPGA的数码管十进制显示.docx_第5页
第5页 / 共19页
点击查看更多>>
下载资源
资源描述

课程设计基于FPGA的数码管十进制显示.docx

《课程设计基于FPGA的数码管十进制显示.docx》由会员分享,可在线阅读,更多相关《课程设计基于FPGA的数码管十进制显示.docx(19页珍藏版)》请在冰豆网上搜索。

课程设计基于FPGA的数码管十进制显示.docx

课程设计基于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倒计时

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > IT计算机 > 计算机硬件及网络

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1