📄 control.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 + -