北邮数字电路与逻辑设计实验实验报告下Word格式.docx

上传人:b****5 文档编号:21137726 上传时间:2023-01-27 格式:DOCX 页数:35 大小:308.55KB
下载 相关 举报
北邮数字电路与逻辑设计实验实验报告下Word格式.docx_第1页
第1页 / 共35页
北邮数字电路与逻辑设计实验实验报告下Word格式.docx_第2页
第2页 / 共35页
北邮数字电路与逻辑设计实验实验报告下Word格式.docx_第3页
第3页 / 共35页
北邮数字电路与逻辑设计实验实验报告下Word格式.docx_第4页
第4页 / 共35页
北邮数字电路与逻辑设计实验实验报告下Word格式.docx_第5页
第5页 / 共35页
点击查看更多>>
下载资源
资源描述

北邮数字电路与逻辑设计实验实验报告下Word格式.docx

《北邮数字电路与逻辑设计实验实验报告下Word格式.docx》由会员分享,可在线阅读,更多相关《北邮数字电路与逻辑设计实验实验报告下Word格式.docx(35页珍藏版)》请在冰豆网上搜索。

北邮数字电路与逻辑设计实验实验报告下Word格式.docx

8LED点阵显示模块8

5.LCD液晶屏显示模块8

6.中心模块8

四、源程序9

1.分频器模块9

4键盘输入模块9

3.数码管显示模块11

8LED点阵显示模块12

5.LCD液晶屏显示模块19

6.中心模块23

五、功能说明及资源利用情况26

六、故障及问题分析27

七、总结和结论27

一、任务要求

本电路可供甲乙二人进行猜拳游戏。

通过不同的按键控制,选择多种出拳方式,显示猜拳的结果,实现猜拳游戏,防止了作弊的可能。

1.基本要求

1、甲乙双方各用4×

4键盘中的三个按键模拟“石头”、“剪刀”、“布”,一个按键为“确认”。

4键盘第一行为甲,第二行为乙;

2、裁判用4×

4键盘第三行的一个按键模拟“开”,一个按键为“准备”,一个按键为“复位”;

3、裁判宣布“准备”后,甲乙双方分别选择出拳方式并确认;

4、裁判“开”以后,用点阵的左右三列同时显示甲乙双方的猜拳选择(如下图所示),并用两个数码管显示甲乙的猜拳比分;

图1甲“布”,乙“剪刀”;

甲“剪刀”,乙“石头”

5、猜拳游戏为五局三胜制。

若甲乙双方出拳一致,则比分保持不变,双方重新出拳;

6、比赛结束后,用8×

8点阵显示甲乙获胜方;

7、复位后游戏重新开始。

2.提高要求

1、点阵显示增加游戏开机动画、结束动画;

2、为游戏增加音效;

3、在LCD1602液晶屏上显示甲乙双方的猜拳比分;

4、自拟其他功能。

二、系统设计

1.设计思路

本电路分为6个模块,分别是中心模块(包含状态机)、8×

8LED点阵显示模块、数码管显示模块、LCD液晶屏显示模块、4×

4键盘输入模块、分频器模块,各模块使用VHDL语言设计,顶层连接使用QuartusII原理图设计。

分频器模块负责将50MHz时钟分成低频信号,供其他模块使用。

中心模块负责读取4×

4键盘输入模块的输入,并控制状态机和其他模块的输出显示。

8LED点阵显示模块负责接收中心模块的信号,显示相应的图案。

数码管显示模块和LCD液晶屏显示模块负责接收中心模块的信号,显示比分。

4键盘输入模块负责读取键盘输入,并将其输出到中心模块。

2.总体框图

图2系统流程图

图3逻辑框图

图4BDF原理图

3.分块设计

(1)分频器模块

输入clkin为50MHz时钟,输出clkout为1KHz时钟,作为中心模块、8×

8LED点阵显示模块、数码管显示模块、4×

4键盘输入模块的时钟信号。

4键盘输入模块

输出KBcol为4位二进制信号,是键盘的遍历扫描信号。

输入KBrow为4位二进制信号,是键盘的检测信号。

输出resultout为5位二进制信号,是4×

4键盘输入模块所检测出的所按的按键,其中第一位代表键盘按下,后四位用二进制数表示所按的按键。

(3)数码管显示模块

数码管显示模块负责接收中心模块的信号,显示比分。

输入A、B分别为2位二进制信号,代表甲、乙的得分。

输出cat为8位二进制信号,控制8个数码管的使能端。

输出disp为7位二进制信号,控制数码管所显示的图案。

8LED点阵显示模块

输入A、B分别为2位二进制信号,代表甲、乙的出拳结果,其中“11”表示甲或乙获胜,显示结束动画。

输入en为点阵的使能端,start为开机动画控制信号。

输出row为8位二进制信号,是点阵的扫描信号。

输出colr为8位二进制信号,是红色点阵的数据信号。

输出colg为8位二进制信号,是绿色点阵的数据信号。

(5)LCD液晶屏显示模块

LCD液晶屏显示模块负责接收中心模块的信号,显示比分。

时钟clk直接使用50MHz信号。

输入rst为LCD液晶屏模块的复位信号,输入A、B分别为2位二进制信号,代表甲、乙的得分。

输出rs、en、rw、data_out为LCD液晶屏的控制和数据信号。

(6)中心模块

输入KB为5位二进制信号,是4×

4键盘输入模块所检测出的所按的按键。

输出LEDen控制LED点阵模块的使能端,LEDstart为LED点阵模块的开机动画控制信号。

输出LEDA、LEDB分别为2位二进制信号,代表甲、乙的出拳结果,其中“11”表示甲或乙获胜,显示结束动画。

输出DISPA、DISPB分别为2位二进制信号,代表甲、乙的得分。

三、仿真波形及波形分析

1.分频器模块

分频比太大,不易仿真。

图54×

4键盘输入模块仿真

模块为时钟下降沿有效,resultout[4]为有按键按下的信号,resultout[0..3]为按下的按键。

仿真中遍历了所有按键的情况,在resultout中对应有16~31的所有情况(没有按顺序)。

在中心模块编写时,考虑了防抖的问题,检测到按下多次按键与按下一次按键的效果相同,所以在此模块中没有必要加入防抖。

3.数码管显示模块

图6数码管显示模块仿真

时钟clk为‘0’时,DISP7点亮,显示甲的得分,时钟clk为‘1’时,DISP6点亮,显示乙的得分。

输入A、B遍历了甲、乙得分的所有结果,对应disp为数码管的显示,‘~’状态表示0分,‘0’状态表示1分,‘m’状态表示2分,‘y’状态表示3分。

图78×

8LED点阵显示模块仿真

此模块状态太多,只仿真了部分状态。

输入A、B的‘0’-‘2’状态分别代表石头、剪刀、布,‘3’状态代表甲或乙获胜。

输出colr为甲的出拳结果,colg为乙的出拳结果。

5.LCD液晶屏显示模块

此模块使用50MHz信号,不易仿真。

实现功能与数码管显示模块类似。

6.中心模块

图8中心模块仿真

仿真中模拟按下了3个按键,第一个是裁判的“准备”键,按键抬起后结束开机动画,进入选手输入状态,LEDen和LEDstart都变为‘0’。

第二个是乙按下“剪刀”(甲默认出“布”),按键抬起后LEDB的信号发生变化。

第一个是裁判的“开”键,按键抬起后结算双方出拳结果,给乙+1分(DISPB),同时显示双方出拳结果,LEDen变为‘1’。

四、源程序

libraryieee;

useieee.std_logic_1164.all;

entityfenpinqi12is

port(clkin:

instd_logic;

--时钟信号输入

clkout:

outstd_logic);

--时钟信号输出

endfenpinqi12;

architecturearoneMHZoffenpinqi12is

signaldata:

integerrange0to24999;

signalQ:

std_logic;

begin

process(clkin)

begin

ifrising_edge(clkin)then--检测输入时钟上升沿

if(data=24999)then--此句为你想要的分频比,data=0,1,2,3,4.......9的分频比为1,2,3,,,10

data<

=0;

Q<

=notQ;

else

=data+1;

endif;

clkout<

=Q;

endprocess;

endaroneMHZ;

LIBRARYIEEE;

USEIEEE.STD_LOGIC_1164.ALL;

USEIEEE.STD_LOGIC_UNSIGNED.ALL;

ENTITYKBcontrollerIS

PORT(

clk:

INSTD_LOGIC;

--时钟

KBcol:

OUTSTD_LOGIC_VECTOR(0TO3);

--扫描信号

KBrow:

INSTD_LOGIC_VECTOR(0TO3);

--检测信号

resultout:

OUTSTD_LOGIC_VECTOR(4DOWNTO0)--检测结果

);

ENDKBcontroller;

ARCHITECTUREbehavioralOFKBcontrollerIS

signaltemp:

INTEGERRANGE0TO3;

signalresult:

STD_LOGIC_VECTOR(4DOWNTO0);

BEGIN

P1:

PROCESS(temp)

BEGIN

IF(clk'

eventandclk='

0'

)THEN

CASEtempIS--检测键盘输入结果

WHEN0=>

CASEKBrowIS

WHEN"

0111"

=>

result<

="

11111"

;

1011"

11110"

1101"

11101"

1110"

11100"

WHENOTHERS=>

00000"

ENDCASE;

WHEN1=>

11011"

11010"

11001"

11000"

WHEN2=>

10111"

10110"

10101"

10100"

WHEN3=>

10011"

10010"

10001"

10000"

WHENOTHERS=>

NULL;

ENDCASE;

ENDIF;

resultout<

=result;

ENDPROCESSP1;

P2:

process(clk)

IF(clk'

1'

)THEN--模4计数器,对应键盘的4列

IFtemp=3THEN

temp<

ELSE

=temp+1;

ENDPROCESSP2;

P3:

process(temp)

CASEtempIS--键盘扫描输出

WHEN0=>

KBcol<

WHEN1=>

WHEN2=>

WHEN3=>

WHENOTHERS=>

1111"

ENDCASE;

ENDPROCESSP3;

ENDbehavioral;

ENTITYDISPshowIS

A:

INSTD_LOGIC_VECTOR(1DOWNTO0);

--甲的得分

B:

--乙的得分

disp:

OUTSTD_LOGIC_VECTOR(0To6);

--显示内容

cat:

OUTSTD_LOGIC_VECTOR(7DOWNTO0));

--数码管使能

ENDDISPshow;

ARCHITECTUREbehavioralOFDISPshowIS

process(clk,A,B)

variabledispA:

STD_LOGIC_VECTOR(0To6);

variabledispB:

CASEAIS--将甲得分变为数码管显示信号

WHEN"

00"

dispA:

1111110"

--0

01"

0110000"

--1

10"

1101101"

--2

11"

1111001"

--3

0000000"

CASEBIS--将乙得分变为数码管显示信号

dispB:

CASEclkIS--时钟为‘0’时显示甲,时钟为‘1’时显示乙,相当于扫描

WHEN'

disp<

=dispA;

cat<

01111111"

=dispB;

10111111"

11111111"

ENTITYLEDshowIS

--时钟

en:

--使能端

--甲的出拳

--乙的出拳

start:

--开始动画控制

colr:

OUTSTD_LOGIC_VECTOR(7DOWNTO0);

--红色数据信号

colg:

--绿色数据信号

row:

ENDLEDshow;

ARCHITECTUREbehavioralOFLEDshowIS

INTEGERRANGE0TO8;

signaltemp1:

INTEGERRANGE0TO5;

integerrange0to249;

signalclk_2Hz,Q:

STD_LOGIC;

signalA0:

STD_LOGIC_VECTOR(0to7);

signalA1:

signalA2:

signalA3:

signalA4:

signalA5:

signalA6:

signalA7:

signalB0:

STD_LOGIC_VECTOR(7DOWNTO0);

signalB1:

signalB2:

signalB3:

signalB4:

signalB5:

signalB6:

signalB7:

PROCESS(clk_2Hz)

ifstart='

then

ifA="

then--甲出布

A0<

00000000"

A1<

A2<

11100000"

A3<

A4<

A5<

A6<

A7<

elsifA="

then--甲出剪刀

00100000"

11000000"

then--甲出石头

01000000"

else

casetemp1is--甲获胜,显示动画

when0=>

--显示“甲”

A0<

11111110"

A1<

10010010"

A2<

A3<

A4<

A5<

00010000"

A6<

A7<

when1=>

--显示“获”

00101000"

10101000"

01001010"

10111110"

01101000"

10101100"

01110010"

when2=>

--显示“胜”

11100100"

10110100"

10100100"

when3=>

--显示笑脸

00111100"

01000010"

10000001"

10100101"

01011010"

when4=>

when5=>

--显示空白

whenothers=>

NULL;

endcase;

endif;

ifB="

then--乙出布

B0<

B1<

B2<

00000111"

B3<

B4<

B5<

B6<

B7<

0000

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

当前位置:首页 > 初中教育 > 数学

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

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