⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 control.vhd

📁 游戏代码
💻 VHD
字号:
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_arith.all;
use ieee.std_logic_unsigned.all;

ENTITY control IS
	PORT(clk,p1,p2,judge,who,sel,reset:  IN STD_LOGIC;--低频时钟,发球/击球,裁判,当前发球权,首发权选择,全局复位
		   score1,score2:  IN integer range 0 to 11;--当前局比分
					total: IN integer range 0 to 4;  --总比分和
		     p1total,p2total,p1win,p2win,clear,first: OUT STD_LOGIC;--p1/p2赢得该局或该球,清楚当前比分,当前首发权(输出至发球权控制模块)
			     led_out: OUT STD_LOGIC_VECTOR(7 downto 0));--发光二极管的显示
END ENTITY;

ARCHITECTURE main OF control IS
SIGNAL  led_pos:integer range 0 to 9; --表示当前发光二极管被点亮的位置
TYPE   statetype IS (waiting,p1ready,p2ready,p1top2,p2top1,ends);
SIGNAL state : statetype;
BEGIN
	PROCESS(clk,judge,reset)
	BEGIN
		if(reset='1') then state <= waiting;--全局复位
		elsif(rising_edge(clk)) then
			CASE state IS
				when waiting=>
					p1win <= '0';--所有指示赢球的信号均为低电平
					p2win <= '0';
					p1total <= '0';
					p2total <= '0';
					led_pos <= 0;
					if(judge = '1') then
						clear <= '1';  --送至分数统计模块,清除比分
						if(total = 0 OR total = 2 OR total = 4 OR total = 6) then
							CASE sel IS
							when '0'=> first<='0';state<=p1ready;
							when '1'=> first<='1';state<=p2ready;
							END CASE;
						elsif(total = 1 OR total = 3 OR total = 5) then
							CASE sel IS
							when '0'=> first<='1';state<=p2ready;
							when '1'=> first<='0';state<=p1ready;--以上控制首发权
							END CASE;
						end if;		
					else 
						state <= waiting;
					end if;
				when p1ready=>
					clear <= '0';--清除比分信号置为低电平
					led_pos <= 1;--靠近发球方的发光二极管被点亮(下同)
					if(p1 = '1') then 
						state <= p1top2;--发球,状态发生转移
					else state <= p1ready;
					end if;
				when p2ready=>
					clear <= '0';
					led_pos <= 8;
					if(p2 = '1') then
						state <= p2top1;
					else state <= p2ready;
					end if;
				when p1top2=>
					if(p2 = '1') then--检测到对方击球
						if(led_pos = 7) then  -- 判断球的位置
							state <= p2top1;--击球成功
						else
							p1win <= '1';-- 击球失误,p1方得分
							state <= ends;-- 状态转移至一球结束
						end if;
					elsif(led_pos = 9) then --球“出界“
						p1win <= '1'; --p1方得分
						state <= ends;
					else
						led_pos <= led_pos + 1;-- 球继续移动
						state <= p1top2;--状态发生转移
					end if;
				when p2top1=>
					if(p1 = '1') then
						if(led_pos = 2) then
							state <= p1top2;
						else
							p2win <= '1';
							state <= ends;
						end if;
					elsif(led_pos = 0) then
						p2win <= '1';
						state <= ends;
					else
						led_pos <= led_pos - 1;
						state <= p2top1;
					end if;
				when ends=>
					p1win <= '0';
					p2win <= '0';
					if(score1 = 11) then -- 一局比赛是否结否
						p1total <= '1'; -- 总比分加1
						state <= waiting;  -- 状态转移至等待裁判开始
					elsif(score2 = 11) then
						p2total <= '1';
						state <= waiting;
					else
						CASE who IS -- 根据发球权选择下一状态
							when '0'=> state <= p1ready;
							when '1'=> state <= p2ready;
						END CASE;
					end if;
			END CASE;
		end if;		
	END PROCESS;
	-- 以下为发光二极管组合译码电路,表示球的位置
	WITH led_pos SELECT
	led_out <= "00011000" when 0,
			   "10011000" when 1,
			   "01011000" when 2,
			   "00111000" when 3,
			   "00001000" when 4,
			   "00010000" when 5,
			   "00011100" when 6,
			   "00011010" when 7,
			   "00011001" when 8,
			   "00011000" when 9;
			
END ARCHITECTURE;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -