EDA拔河游戏机课程设计Word文档下载推荐.docx
《EDA拔河游戏机课程设计Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《EDA拔河游戏机课程设计Word文档下载推荐.docx(18页珍藏版)》请在冰点文库上搜索。
科学出版社,20XX年.康华光主编.电子技术基础模拟部分.北京:
高教出版社,20XX年.阎石主编.数字电子技术基础.北京:
高教出版社,20XX年.
一、总体设计思想1.基本原理由设计内容可知,需要一个十进制的计数器,用于对双方按钮的次数计数,并通过译码器显示在数码管上。
设计要求用50MHz的频率,而设计用到的是1KHz的频率,所以要设计一个程序进行分频。
显视控制部分设计要求在发光二极管上显示游戏状态,双方每按十次,亮点向先按十次移动一次,对脉冲进行计数,每十次移一位。
需接入一个清零端,用于复位。
将以上程序组装起来。
2.设计框图译码器编码电路
选择开关整形电路可逆计数器控制电路
图1.拔河机游戏机框图
二、设计步骤和调试过程1、总体设计电路总体电路图和仿真图如图(25)所示,由仿真图可知,此电路设计无误,可以实现按动A、B两个按键时,分别产生两个脉冲信号,经整形后分别加到可逆计数器上,可逆计数器输出的代码经译码器译码后驱动电平指示灯点亮并产生位移,当亮点移到任何一方终端后,由于控制电路的作用,使这一状态被锁定,双方按键产生的输入脉冲不起作用。
如按动复位键C,亮点又回到中点位置,再次按C键则比赛又可重新开始。
图2.电路图2、模块设计和相应模块程序1.顶层文件libraryIEEE;
useIEEE.std_logic_1164.all;
useIEEE.std_logic_unsigned.all;
entitybaheis
port(
player1,player2:
instd_logic;
--玩家1,2输入
clk_in:
--clk_in(1MHZ)
reset:
--重置键
row:
outstd_logic_vector(7downto0);
col:
led:
outstd_logic_vector(7downto0);
--绳子
cats:
outstd_logic_vector(6downto0);
--比分
q:
outstd_logic_vector(5downto0);
--数码管控制
mus:
outstd_logic);
--蜂鸣输出endbahe;
architecturebody_baheofbaheis--分频模块
componentdivision
--1MHZ输入
clk_100,clk_5,clk_1:
--100HZ,5Hz,1HZ
endcomponent;
--计数模块
componentcount
clk_1:
--1HZ输入
sw:
--状态开关
--选手输入
sum1,sum2:
outstd_logic_vector(4downto0));
--计数结果输出
--比较模块
componentcmp
clk_100:
--100hz
--1hz
outstd_logic;
--状态开关输出
--重置
start:
--开始
instd_logic_vector(4downto0);
--计数结果输入
music_begin:
--音乐
record1,record2:
outstd_logic_vector(1downto0);
--比分输出
lights:
outstd_logic_vector(2downto0));
--拔河绳子显示
--音乐模块
componentmusic
clk:
--1MHz
clk_5:
--5hz
--音乐开始
--译码模块
componentdecode
--1mHZ
instd_logic_vector(1downto0);
--比分输入
instd_logic_vector(2downto0);
--拔河绳子输入
--输出到LED
bufferstd_logic_vector(5downto0);
outstd_logic_vector(6downto0)--数码管显示比分
);
--倒计时模块
componentdaojishi
clk_in,clk_1,reset:
outstd_logic
--分频器输出
signalclk_100,clk_5,clk_1:
std_logic;
--时钟信号
--计数器输出
signalsum1,sum2:
std_logic_vector(4downto0);
--计数结果
--比较器输出
signalsw:
signalrecord1,record2:
std_logic_vector(1downto0);
signallights:
std_logic_vector(2downto0);
signalmusic_begin:
--解码器输出
signaltmp_led:
std_logic_vector(7downto0);
--LED显示
signaltmp_q:
std_logic_vector(5downto0);
signal
tmp_cat:
std_logic_vector(6downto0);
--数码管显示比分
--倒计时器输出
signaltmp_start:
begin
cats=tmp_cat;
q=tmp_q;
led=tmp_led;
div:
divisionportmap(clk_in=clk_in,clk_100=clk_100,clk_5=clk_5,clk_1=clk_1);
cnt:
countportmap(
clk_1=clk_1,sw=sw,player1=player1,player2=player2,
sum1=sum1,sum2=sum2);
com:
cmpportmap(
clk_100=clk_100,clk_1=clk_1,sw=sw,reset=reset,
start=tmp_start,sum1=sum1,sum2=sum2,music_begin=music_begin,
record1=record1,record2=record2,lights=lights);
dec:
decodeportmap(
clk_in=clk_in,record1=record1,record2=record2,
lights=lights,led=tmp_led,q=tmp_q,cats=tmp_cat);
mu:
musicportmap(
reset=reset,clk=clk_in,clk_5=clk_5,
music_begin=music_begin,mus=mus);
dao:
daojishiportmap(
clk_in=clk_in,clk_1=clk_1,reset=reset,
start=tmp_start,col=col,row=row);
endbody_bahe;
2.CMP模块
libraryIEEE;
entitycmpis
port(clk_100:
--100HZ输入
--计数输入
--比分输出
--状态输出
--绳子状态
endcmp;
architecturebody_cmpofcmpis
signaltmp_record1:
signaltmp_record2:
signaltmp:
signaltmp_sta:
--状态
signals1,s2:
--计数
record1=tmp_record1;
record2=tmp_record2;
lights=tmp;
sw=tmp_sta;
process(clk_100)
--判断比赛状态
if(start='1')then
if(clk_100'eventandclk_100='1')then
tmp_sta='1';
endif;
--任意比分到3,比赛结束,开始播放音乐
if(tmp_record1=“11“ortmp_record2=“11“)then
tmp_sta='0';
music_begin='1';
if(tmp=“001“ortmp=“111“)then
--绳子到头,进入等待状态
if(reset='1')then
--复位,状态归零
music_begin='0';
endprocess;
s1=sum1;
s2=sum2;
process(clk_1,reset)
--控制绳子移位
tmp=“100“;
--绳子初始状态为100
tmp_record1=“00“;
tmp_record2=“00“;
else
if(clk_1'eventandclk_1='1')then
if(tmp_sta='1')then
if(s1s2)thentmp=tmp-'1';
--绳子左移
elsif(s1=s2)thentmp=tmp;
--绳子保持原状
elsetmp=tmp+'1';
--绳子右移
if(tmp=“001“)then
--绳子到左尽头,左计分器加1
tmp_record1=tmp_record1+'1';
elsif(tmp=“111“)then
--绳子到右尽头,右记分器加1,
tmp_record2=tmp_record2+'1';
endbody_cmp;
3.COUT模块
entitycountis
port(clk_1:
--状态判断输入
--计数输出
endcount;
architecturebody_countofcountis
signalp1,p2:
sum1
sum2
process(player1,player2,sw,clk_1)
if(sw='1')then
--处于比赛状态
if(clk_1='0')then
if(player1'eventandplayer1='1')then
p1=p1+'1';
if(player2'eventandplayer2='1')then
p2=p2+'1';
p1=“00000“;
p2=“00000“;
--比赛状态结束
elsep1=“00000“;
endbody_count;
4.daojishi模块
entitydaojishiis
port(clk_1,clk_in,reset:
instd_logic;
start:
outstd_logic);
enddaojishi;
architecturebody_daojishiofdaojishiis
typestateis(s0,s1,s2,s3,s4,s5,s6,s7,s8,s9,s10);
signalpresent_state:
state:
=s10;
signalnum:
std_logic_vector(2downto0):
=“000“;
p3:
process(clk_in)
ifclk_in'eventandclk_in='1'then
ifnum=“101“thennum=“000“;
elsenum=num+1;
casepresent_stateis
whens9=
casenumis
when“000“=col=“***-*****“;
row=“***-*****“;
when“001“=col=“***-*****“;
when“010“=col=“***-*****“;
when“011“=col=“***-*****“;
when“100“=col=“***-*****“;
whenothers=col=“***-*****“;
endcase;
whens8=
whens7=
whens6=
whens5=
whens4=
whens3=
whens2=
when“001