EDA 课程设计拔河游戏机 ?
一、总体设计思想
电子拔河游戏机是一种能容纳甲乙双方参赛游戏电路。由一排发光二极管表示拔河的“电子绳”。由甲乙双方通过按纽开关使发光二极管向一方的终点延伸,当延伸到某方的最后一个发光二极管时,?则该方获胜,连续比赛多局以定胜负。
1.基本原理
本电路要求使用9个发光二极管,开机后只有中间一个发亮,此即拔河的中心点。游戏双方各持一个按钮,迅速地、不断地按动,产生脉冲,谁按得快,亮点就向谁的方向移动,每按一次,亮点移动一次。亮点移到任一方终端二极管时,这一方就获胜,此时双方按钮均无作用,输出保持,只有复位后才使亮点恢复到中心。最后用数码管显示获胜者的盘数。
由设计内容可知,首先需要一个十进制的计数器,用于对双方按钮的次数计数,并通过译码器显示在数码管上。设计要求用50MHz的频率,而设计用到的是1K?Hz的频率,所以要设计一个程序进行分频。其次,显视控制部分设计要求在发光二极管上显示游戏状态,双方每按十次,亮点向先按十次移动一次,对脉冲进行计数,每十次移一位。需接入一个清零端?,用于复位。再次,运用VHDL程序语言进行各个模块的程序编写,控制电路的正常运行。最后,将以上程序组装起来,就可得到所需要的拔河游戏机
library?ieee;
use?ieee.std_logic_1164.all;
use?ieee.std_logic_unsigned.all;
entity?bahe?is?
port?(a,b,rst,clk:in?std_logic;
sg,led:out?std_logic_vector(8?downto?0);
bt:out?std_logic_vector(7?downto?0));
end?bahe;
----------------------------------
architecture?one?of?bahe?is
component?cnt10
port?(clk,rst,en:std_logic;
cout:out?std_logic;
cq:out?std_logic_vector(3?downto?0));
end?component;
component?scan?
port?(clk?:in?std_logic;
a1,?a2,a3,b1,b2,b3:in?std_logic_vector(3?downto?0);
sg:out?std_logic_vector(8?downto?0);
bt:?out?std_logic_vector(7?downto?0));
end?component;
component?lmov
port?(kl?,kr:in?std_logic_vector(3?downto?0)?;
led:out?std_logic_vector(8?downto?0);
en?:?out?std_logic;
rst:in?std_logic);
end?component;
signal?e,f,ca1,ca2,cb1,cb2:std_logic;
signal?cqa1,cqa2,cqa3,cqb1,cqb2,cqb3:std_logic_vector(3?downto?0);
begin
u1:?cnt10?port?map?(en=>e,rst=>rst,clk=>a,cout=>ca1,cq=>cqa1);
u2:?cnt10?port?map?(en=>e,rst=>rst,clk=>ca1,cout=>ca2,cq=>cqa2);
u3:?cnt10?port?map?(en=>e,rst=>rst,clk=>ca2,cq=>cqa3);
u4:?cnt10?port?map?(en=>e,rst=>rst,clk=>b,cout=>cb1,cq=>cqb1);
u5:?cnt10?port?map?(en=>e,rst=>rst,clk=>cb1,cout=>cb2,cq=>cqb2);
u6:?cnt10?port?map?(en=>e,rst=>rst,clk=>cb2,cq=>cqb3);
u7:?scan?port?map?(a1=>cqa1,a2=>cqa2,a3=>cqa3,b1=>cqb1,
b2=>cqb2,b3=>cqb3,clk=>clk,sg=>sg,bt=>bt);
u8:lmov?port?map?(en=>e,kl=>cqa2,kr=>cqb2,rst=>rst,led=>led);
end?architecture?one;
library?ieee;
use?ieee.std_logic_1164.all;
use?ieee.std_logic_unsigned.all;?
entity?cnt10?is
port(clk,rst,en:std_logic;
cout:out?std_logic;
cq:out?std_logic_vector(3?downto?0));
end;
architecture?one?of?cnt10?is
begin
process(clk,rst,en)
variable?cqi:std_logic_vector(3?downto?0);
begin?
if?rst='1'?then?
cqi:=(others=>'0');
elsif?clk'event?and?clk='1'?then?
if?en='1'?then?
if?cqi<9?then?cqi:=cqi+1;
else?cqi?:=(others=>'0');
end?if?;
end?if;
end?if;
if?c?qi=9?then?cout<='0'?;
else?cout<='1';
end?if;
cq<=cqi;
end?process;
end;
library?ieee;
use?ieee.std_logic_1164.all;
use?ieee.std_logic_unsigned.all;
entity?scan?is?
port?(clk?:in?std_logic;
a1,a2,a3,b1,b2,b3:in?std_logic_vector(3?downto?0);
sg:out?std_logic_vector(8?downto?0);
bt:?out?std_logic_vector(7?downto?0));
end;
architecture?one?of?scan?is
signal?cnt4:std_logic_vector(2?downto?0);
signal?a:std_logic_vector(3?downto?0);
signal?clk1:std_logic;
begin?
p1:process(cnt4)
begin
case?cnt4?is
when?"000"=>bt<="10000000";a<=a1;
when?"001"=>bt<="01000000";a<=a2;
when?"010"=>bt<="00100000";a<=a3;
when?"011"=>bt<="00000100";a<=b1;
when?"100"=>bt<="00000010";a<=b2;
when?"101"=>bt<="00000001";a<=b3;
when?others=>bt<="00000000";
end?case?;
end?process?p1;
---------------------------------
p2:process?(clk)
variable?ct:integer?range?0?to?50000;
begin?
if?clk'event?and?clk='1'?then?--1000HZ?
if?ct<49999?then
ct:=ct+1;
clk1<='0';
else?
ct:=0;
clk1<='1';
end?if;
end?if;
end?process?p2;
process(clk1)
begin?
if?clk1'event?an?d?clk1='1'?then
if?cnt4<5?then
cnt4<=cnt4+1;
else?
cnt4<="000";
end?if;
end?if;
end?process;
------------------------------------
process?(a)
begin?
case?a?is?
when?"0000"=>sg<="100000000";
when?"0001"=>sg<="111110001";
when?"0010"=>sg<="001001000";
when?"0011"=>sg<="001100000";
when?"0100"=>sg<="000110010";
when?"0101"=>sg<="000100100";
when?"0110"=>sg<="000000100";
when?"0111"=>sg<="111110000";
when?"1000"=>sg<="000000000";
when?"1001"=>sg<="100011111";
when?"1010"=>sg<="000100100";
when?"1011"=>sg<="000011000";
when?"1100"=>sg<="010001100";
when?"1101"=>sg<="001001000";
when?"1110"=>sg<="001000000";
when?"1111"=>sg<="000011111";
when?others=>null;
end?case?;
end?process;
end;
library?ieee;
use?ieee.std_logic_1164.all;
use?ieee.std_logic_unsigned.all;
entity?lmov?is?
port?(kl?,kr:in?std_logic_vector(3?downto?0)?;
led:out?std_logic_vector(8?downto?0);
en?:?out?std_logic;
rst:in?std_logic);
end?;
architecture?one?of?lmov?is
begin?
process(rst,kl,kr)
begin?
if?rst='1'?then?led<="111101111";en<='1';
elsif?kl-kr=1?then?led<="111011111";en<='1';
elsif?kl-kr=2?then?led<="110111111";en<='1';
elsif?kl-kr=3?then?led<="101111111";en<='1';
elsif?kl-kr=4?then?led<="011111111";en<='0';
elsif?kr-kl=1?then?led<="111110111";en<='1';
elsif?kr-kl=2?then?led<="111111011";en<='1'?;
elsif?kr-kl=3?then?led<="111111101";en<='1';
elsif?kl-kr=4?then?led<="111111110";en<='0';
elsif?kr-kl=0?then?led<="111101111";en<='1';
else?null;
end?if;
end?process;
end;