任务2:I型模块的顺时针旋转测试与动作
由上一节可知,我们需要先完成I型模块的顺时针旋转对应的表格。表中测试空位、测试阻挡、旋转后的坐标和边界条件与逆时针原理相似,因此本节不再赘述,直接展示结果。
由设计任务,我们需要在ctrl_Irotate.vhd文件中添加顺时针旋转的程序,类比逆时针旋转的程序,结合上表,易得出以下程序段。
--测试I型模块能否以p3为轴心顺时针旋转--
--测试边界、空位与阻挡--
when test_Rp3=>
case test is
--测试边界与空位1--
when X"1"=>--test
if(forms="00")then
if(p3y>"001" and p3y<"111")then--边界条件
cx<=p3x; cy<=p3y+1; test<=X"2";--测试空位1
else
state<=wait_btn;--不能旋转,等待操作键
end if;
elsif(forms="01")then
if(p3x>"001" and p3x<"111")then
cx<=p3x+1; cy<=p3y; test<=X"2";
else state<=wait_btn;
end if;
elsif(forms="10")then
if(p3y>"000" and p3y<"110")then
cx<=p3x; cy<=p3y-1; test<=X"2";
else state<=wait_btn;
end if;
elsif(forms="11")then
if(p3x>"000" and p3x<"110")then
cx<=p3x-1; cy<=p3y; test<=X"2";
else state<=wait_btn;
end if;
end if;
when X"2"=>
if(dotin="1")then--高电平点亮,位置已被占
state<=wait_btn;--不能旋转,等待操作键
else
test<=X"3";--有空位,测试下一个位置
end if;
--测试空位2--
when X"3"=>--test
if(forms="00")then
cx<=p3x; cy<=p3y-1; test<=X"4";
elsif(forms="01")then
cx<=p3x-1; cy<=p3y; test<=X"4";
elsif(forms="10")then
cx<=p3x; cy<=p3y+1; test<=X"4";
elsif(forms="11")then
cx<=p3x+1; cy<=p3y; test<=X"4";
end if;
when X"4"=>
if(dotin="1")then state<=wait_btn;
else test<=X"5";
end if;
--测试空位3--
when X"5"=>--test
if(forms="00")then
cx<=p3x; cy<=p3y-2; test<=X"6";
elsif(forms="01")then
cx<=p3x-2; cy<=p3y; test<=X"6";
elsif(forms="10")then
cx<=p3x; cy<=p3y+2; test<=X"6";
elsif(forms="11")then
cx<=p3x+2; cy<=p3y; test<=X"6";
end if;
when X"6"=>
if(dotin="1")then state<=wait_btn;
else test<=X"7";
end if;
--测试阻挡1--
when X"7"=>--test
if(forms="00")then
cx<=p1x; cy<=p1y-1; test<=X"8";
elsif(forms="01")then
cx<=p1x-1; cy<=p1y; test<=X"8";
elsif(forms="10")then
cx<=p1x; cy<=p1y+1; test<=X"8";
elsif(forms="11")then
cx<=p1x+1; cy<=p1y; test<=X"8";
end if;
when X"8"=>
if(dotin="1")then --高电平点亮,有阻挡
state<=wait_btn;--不能旋转,等待操作键
else
test<=X"9";--无阻挡,测试下一个位置
end if;
--测试阻挡2--
when X"9"=>--test
if(forms="00")then
cx<=p2x; cy<=p2y-1; test<=X"A";
elsif(forms="01")then
cx<=p2x-1; cy<=p2y; test<=X"A";
elsif(forms="10")then
cx<=p2x; cy<=p2y+1; test<=X"A";
elsif(forms="11")then
cx<=p2x+1; cy<=p2y; test<=X"A";
end if;
when X"A"=>
if(dotin="1")then
state<=wait_btn;
else
test<=X"B";
end if;
--测试阻挡3--
when X"B"=>--test
if(forms="00")then
cx<=p2x; cy<=p2y-2; test<=X"C";
elsif(forms="01")then
cx<=p2x-2; cy<=p2y; test<=X"C";
elsif(forms="10")then
cx<=p2x; cy<=p2y+2; test<=X"C";
elsif(forms="11")then
cx<=p2x+2; cy<=p2y; test<=X"C";
end if;
when X"C"=>
if(dotin="1")then
state<=wait_btn;
else
test<=X"D";
end if;
--测试阻挡4--
when X"D"=>--test
if(forms="00")then
cx<=p4x; cy<=p4y+1; test<=X"E";
elsif(forms="01")then
cx<=p4x+1; cy<=p4y; test<=X"E";
elsif(forms="10")then
cx<=p4x; cy<=p4y-1; test<=X"E";
elsif(forms="11")then
cx<=p4x-1; cy<=p4y; test<=X"E";
end if;
when X"E"=>
if(dotin="1")then
state<=wait_btn;
else
make<=X"8"; state<=rotate_Rp3;
end if;
when others=>null;
end case;
--I型模块以p3为中心顺时针旋转--
when rotate_Rp3=>
case make is --make:8~F
--清空原片--
when X"8"=>
wen_tmp<="1";--开写使能
dotout_tmp<="0";--低电平,熄灭led灯
cx<=p1x; cy<=p1y; make<=X"9";
when X"9"=>
cx<=p2x; cy<=p2y; make<=X"A";
when X"A"=>
cx<=p4x; cy<=p4y; make<=X"B";
--更新p1,p2,p4新片位置--
when X"B"=>--make
if(forms="00")then
p1x<=p1x+2; p1y<=p1y-2;
p2x<=p2x+1; p2y<=p2y-1;
p4x<=p4x-1; p4y<=p4y+1;
elsif(forms="01")then
p1x<=p1x-2; p1y<=p1y-2;
p2x<=p2x-1; p2y<=p2y-1;
p4x<=p4x+1; p4y<=p4y+1;
elsif(forms="10")then
p1x<=p1x-2; p1y<=p1y+2;
p2x<=p2x-1; p2y<=p2y+1;
p4x<=p4x+1; p4y<=p4y-1;
elsif(forms="11")then
p1x<=p1x+2; p1y<=p1y+2;
p2x<=p2x+1; p2y<=p2y+1;
p4x<=p4x-1; p4y<=p4y-1;
end if;
make<=X"C";
--显示新片--
when X"C"=>--make
dotout_tmp<="1";--高电平,点亮led灯
cx<=p1x; cy<=p1y; make<=X"D";
when X"D"=>
cx<=p2x; cy<=p2y; make<=X"E";
when X"E"=>
cx<=p4x; cy<=p4y; make<=X"F";
when X"F"=>--make
wen_tmp<="0";--关写使能
--切换I型模块的形状--
if(forms="00")then forms<="11";
elsif(forms="11")then forms<="10";
elsif(forms="10")then forms<="01";
elsif(forms="01")then forms<="00";
end if;
make<=X"0"; state<=wait_btn;
when others=>null;
end case;
注意:在ctrl_Irotate.vhd文件中我们还需要加入test_Rp3, rotate_Lp3变量声明语句
type state_group is(wait_btn,clr_screen,test_n,display,test_Lp3,rotate_Lp3,test_Rp3,rotate_Rp3);
完整的代码将在文末给出。
任务3:其他形状模块的旋转测试与动作
上图是2024年版实验任务分组,每年可能会有区别,注意区分。
以本人分组(F12)为例,和之前的步骤类似,我们先完成对应的表格,再根据表格修改对应的代码,即可完成此任务。
特别注意:
1. 请仔细确认自己分组图案的旋转轴,不同旋转轴需修改变量名,例如test_Lp3代表旋转轴为p3,旋转方向为逆时针,如自己的分组实现的是绕p2顺时针则修改为test_Lp2。(此处可不修改,程序不会报错,但代码可读性会下降,老师提问需要注意)、
3. 当旋转轴为p3时,p3位置始终不变,只更改p1, p2, p4位置。相同的,当旋转轴为p2时,只更改p1, p3, p4位置。注意区分。
2. 同样的,旋转轴改变,显示新片的函数也需要相应改变(见第一节)。以下为以p3为旋转轴的函数,新片是p1, p2, p4。若以p2为旋转轴,点亮新片需修改为p1, p3, p4。
--显示新片--
when X"C"=>--make
dotout_tmp<="1";--高电平,点亮led灯
cx<=p1x; cy<=p1y; make<=X"D";
when X"D"=>
cx<=p2x; cy<=p2y; make<=X"E";
when X"E"=>
cx<=p4x; cy<=p4y; make<=X"F";
在填写实验表格的过程中,可能会发现自己设计的模块阻挡和空位需求比给出的示例要少(或多),此时我们可以通过增删test函数中相应代码来实现。
由上一节我们已经知道,在ctrl_Irotate.vhd程序中如下函数代表阻挡和空位。对应的,当阻挡和空位减少时,我们只需要删除多余的结构段,但需要确保上下两个函数X值能连接(红框处)且结尾跳转动作函数(蓝框处)。
由于各组的要求均不同,故此任务不给出完整实现代码,可按照本教程完成设计表格,对应修改ctrl_Irotate.vhd程序,烧录即可。
附:任务2相关代码
除ctrl_Irotate.vhd以外代码均与任务1相同,可见本人上一篇博客,本次只给出ctrl_Irotate.vhd代码。
--库
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_arith.all;
use ieee.std_logic_unsigned.all;
--实体
entity ctrl_Irotate is
port (clk_game : in std_logic;
rst : in std_logic;
btn_en : in std_logic;
dotin : in std_logic_vector(0 downto 0);
btn_nlr : in std_logic_vector(2 downto 0);
addrb : out std_logic_vector(8 downto 0);
web : out std_logic_vector(0 downto 0);
dotout : out std_logic_vector(0 downto 0));
end;
--结构体
architecture behavioral of ctrl_Irotate is
type state_group is(wait_btn,clr_screen,test_n,display,test_Lp3,rotate_Lp3,test_Rp3,rotate_Rp3);
signal state:state_group:=wait_btn;
signal test:std_logic_vector(3 downto 0):=X"0";--测试
signal make:std_logic_vector(3 downto 0):=X"0";--动作
signal makex,makey:std_logic_vector(3 downto 0):=X"0";--清屏
signal next_n:std_logic_vector(1 downto 0):="00";--切换测试项
signal rst_en,btnen_tmp:std_logic:='0';
signal wen_tmp:std_logic_vector(0 downto 0):="0";
signal dotout_tmp:std_logic_vector(0 downto 0);
signal cy:std_logic_vector(2 downto 0):="000";--8行
signal cx:std_logic_vector(2 downto 0):="000";--8列
signal p1x,p2x,p3x,p4x,p5x:std_logic_vector(2 downto 0):="000";
signal p1y,p2y,p3y,p4y,p5y:std_logic_vector(2 downto 0):="000";
signal forms:std_logic_vector(1 downto 0):="00";--I型模块的形状
begin
web<=wen_tmp;
addrb<="01"&cy&"1"&cx;--俄罗斯方块旋转测试界面的地址
dotout<=dotout_tmp;
process(rst,clk_game,btn_en,dotin,state,make,test)
begin
if(rst='1')then
rst_en<='1'; btnen_tmp<=btn_en;
makey<=X"0"; makex<=X"0"; state<=clr_screen;
elsif rising_edge(clk_game)then
--识别操作键
if(btnen_tmp/=btn_en)then
btnen_tmp<=not btnen_tmp;
--BTN3:切换测试项
if(btn_nlr="100" and state=wait_btn)then
next_n<=next_n+1;
makey<=X"0"; makex<=X"0"; state<=clr_screen;
--BTN2:逆时针旋转(向左转)
elsif(btn_nlr="010"and state=wait_btn)then
test<=X"1"; state<=test_Lp3;
--BTN1:顺时针旋转(向右转),此功能待开发(实验任务)
elsif(btn_nlr="001"and state=wait_btn)then
test<=X"1";state<=test_Rp3;
end if;
else
case state is
--等待按键操作--
when wait_btn=>null;
--清屏--
when clr_screen=>
if(makex<X"8")then
wen_tmp<="1";--开写使能
dotout_tmp<="0";--清空点阵显示,低电平不亮
cx<=makex(2 downto 0); makex<=makex+1;
cy<=makey(2 downto 0);
else
if(makey<X"8")then
makey<=makey+1; makex<=X"0";
else
wen_tmp<="0";--关写使能
if(rst_en='1')then
rst_en<='0'; state<=wait_btn;
else state<=test_n;
end if;
end if;
end if;
--选择新的测试项--
when test_n=>
case next_n is--共4种测试项
when"00"=>--测试旋转
forms<="00";--I型模块,p1 p2 p3 p4
--
--
--p1 p2 p3 p4,左上,第三行
p1x<="000";p2x<="001";p3x<="010";p4x<="011";
p1y<="010";p2y<="010";p3y<="010";p4y<="010";
p5x<="111";p5y<="010";
when"01"=>--测试边界
forms<="00";
--
--p1 p2 p3 p4,左上角,第2行
p1x<="000";p2x<="001";p3x<="010";p4x<="011";
p1y<="001";p2y<="001";p3y<="001";p4y<="001";
p5x<="110";p5y<="111";
when"10"=>--测试位置被占
forms<="00";
--p1 p2 p3 p4,居中
-- p5
p1x<="010";p2x<="011";p3x<="100";p4x<="101";
p1y<="100";p2y<="100";p3y<="100";p4y<="100";
p5x<="100";p5y<="101";
when"11"=>--测试旋转路径有阻挡
forms<="00";
--p1 p2 p3 p4,居中
-- p5
p1x<="010";p2x<="011";p3x<="100";p4x<="101";
p1y<="100";p2y<="100";p3y<="100";p4y<="100";
p5x<="101";p5y<="101";
when others=>null;
end case;
make<=X"1"; state<=display;
--显示新的测试项形状--
when display=>
case make is --make:1~5
when X"1"=>
wen_tmp<="1";--开写使能
dotout_tmp<="1";--高电平,点亮led灯
cx<=p1x; cy<=p1y; make<=X"2";
when X"2"=>
cx<=p2x; cy<=p2y; make<=X"3";
when X"3"=>
cx<=p3x; cy<=p3y; make<=X"4";
when X"4"=>
cx<=p4x; cy<=p4y; make<=X"5";
when X"5"=>
cx<=p5x; cy<=p5y; make<=X"0";
when others=>
wen_tmp<="0";--关写使能
state<=wait_btn;--等待操作键
end case;
--测试I型模块能否以p3为轴心逆时针旋转--
--测试边界、空位与阻挡--
when test_Lp3=>
case test is
--测试边界与空位1--
when X"1"=>--test
if(forms="00")then
if(p3y>"000" and p3y<"110")then--边界条件
cx<=p3x; cy<=p3y-1; test<=X"2";--测试空位1
else
state<=wait_btn;--不能旋转,等待操作键
end if;
elsif(forms="01")then
if(p3x>"000" and p3x<"110")then
cx<=p3x-1; cy<=p3y; test<=X"2";
else state<=wait_btn;
end if;
elsif(forms="10")then
if(p3y>"001" and p3y<"111")then
cx<=p3x; cy<=p3y-2; test<=X"2";
else state<=wait_btn;
end if;
elsif(forms="11")then
if(p3x>"001" and p3x<"111")then
cx<=p3x-2; cy<=p3y; test<=X"2";
else state<=wait_btn;
end if;
end if;
when X"2"=>
if(dotin="1")then--高电平点亮,位置已被占
state<=wait_btn;--不能旋转,等待操作键
else
test<=X"3";--有空位,测试下一个位置
end if;
--测试空位2--
when X"3"=>--test
if(forms="00")then
cx<=p3x; cy<=p3y+1; test<=X"4";
elsif(forms="01")then
cx<=p3x+1; cy<=p3y; test<=X"4";
elsif(forms="10")then
cx<=p3x; cy<=p3y-1; test<=X"4";
elsif(forms="11")then
cx<=p3x-1; cy<=p3y; test<=X"4";
end if;
when X"4"=>
if(dotin="1")then state<=wait_btn;
else test<=X"5";
end if;
--测试空位3--
when X"5"=>--test
if(forms="00")then
cx<=p3x; cy<=p3y+2; test<=X"6";
elsif(forms="01")then
cx<=p3x+2; cy<=p3y; test<=X"6";
elsif(forms="10")then
cx<=p3x; cy<=p3y+1; test<=X"6";
elsif(forms="11")then
cx<=p3x+1; cy<=p3y; test<=X"6";
end if;
when X"6"=>
if(dotin="1")then state<=wait_btn;
else test<=X"7";
end if;
--测试阻挡1--
when X"7"=>--test
if(forms="00")then
cx<=p1x; cy<=p1y+1; test<=X"8";
elsif(forms="01")then
cx<=p1x+1; cy<=p1y; test<=X"8";
elsif(forms="10")then
cx<=p1x; cy<=p1y-1; test<=X"8";
elsif(forms="11")then
cx<=p1x-1; cy<=p1y; test<=X"8";
end if;
when X"8"=>
if(dotin="1")then --高电平点亮,有阻挡
state<=wait_btn;--不能旋转,等待操作键
else
test<=X"9";--无阻挡,测试下一个位置
end if;
--测试阻挡2--
when X"9"=>--test
if(forms="00")then
cx<=p2x; cy<=p2y+1; test<=X"A";
elsif(forms="01")then
cx<=p2x+1; cy<=p2y; test<=X"A";
elsif(forms="10")then
cx<=p2x; cy<=p2y-1; test<=X"A";
elsif(forms="11")then
cx<=p2x-1; cy<=p2y; test<=X"A";
end if;
when X"A"=>
if(dotin="1")then
state<=wait_btn;
else
test<=X"B";
end if;
--测试阻挡3--
when X"B"=>--test
if(forms="00")then
cx<=p2x; cy<=p2y+2; test<=X"C";
elsif(forms="01")then
cx<=p2x+2; cy<=p2y; test<=X"C";
elsif(forms="10")then
cx<=p2x; cy<=p2y-2; test<=X"C";
elsif(forms="11")then
cx<=p2x-2; cy<=p2y; test<=X"C";
end if;
when X"C"=>
if(dotin="1")then
state<=wait_btn;
else
test<=X"D";
end if;
--测试阻挡4--
when X"D"=>--test
if(forms="00")then
cx<=p4x; cy<=p4y-1; test<=X"E";
elsif(forms="01")then
cx<=p4x-1; cy<=p4y; test<=X"E";
elsif(forms="10")then
cx<=p4x; cy<=p4y+1; test<=X"E";
elsif(forms="11")then
cx<=p4x+1; cy<=p4y; test<=X"E";
end if;
when X"E"=>
if(dotin="1")then
state<=wait_btn;
else
make<=X"8"; state<=rotate_Lp3;
end if;
when others=>null;
end case;
--I型模块以p3为轴心逆时针旋转--
when rotate_Lp3=>
case make is --make:8~F
--清空原片--
when X"8"=>
wen_tmp<="1";--开写使能
dotout_tmp<="0";--低电平,熄灭led灯
cx<=p1x; cy<=p1y; make<=X"9";
when X"9"=>
cx<=p2x; cy<=p2y; make<=X"A";
when X"A"=>
cx<=p4x; cy<=p4y; make<=X"B";
--更新p1,p2,p4新片位置--
when X"B"=>--make
if(forms="00")then
p1x<=p1x+2; p1y<=p1y+2;
p2x<=p2x+1; p2y<=p2y+1;
p4x<=p4x-1; p4y<=p4y-1;
elsif(forms="01")then
p1x<=p1x+2; p1y<=p1y-2;
p2x<=p2x+1; p2y<=p2y-1;
p4x<=p4x-1; p4y<=p4y+1;
elsif(forms="10")then
p1x<=p1x-2; p1y<=p1y-2;
p2x<=p2x-1; p2y<=p2y-1;
p4x<=p4x+1; p4y<=p4y+1;
elsif(forms="11")then
p1x<=p1x-2; p1y<=p1y+2;
p2x<=p2x-1; p2y<=p2y+1;
p4x<=p4x+1; p4y<=p4y-1;
end if;
make<=X"C";
--显示新片--
when X"C"=>--make
dotout_tmp<="1";--高电平,点亮led灯
cx<=p1x; cy<=p1y; make<=X"D";
when X"D"=>
cx<=p2x; cy<=p2y; make<=X"E";
when X"E"=>
cx<=p4x; cy<=p4y; make<=X"F";
when X"F"=>--make
wen_tmp<="0";--关写使能
--切换I型模块的形状--
if(forms="00")then forms<="01";
elsif(forms="01")then forms<="10";
elsif(forms="10")then forms<="11";
elsif(forms="11")then forms<="00";
end if;
make<=X"0"; state<=wait_btn;
when others=>null;
end case;
--测试I型模块能否以p3为轴心顺时针旋转--
--测试边界、空位与阻挡--
when test_Rp3=>
case test is
--测试边界与空位1--
when X"1"=>--test
if(forms="00")then
if(p3y>"001" and p3y<"111")then--边界条件
cx<=p3x; cy<=p3y+1; test<=X"2";--测试空位1
else
state<=wait_btn;--不能旋转,等待操作键
end if;
elsif(forms="01")then
if(p3x>"001" and p3x<"111")then
cx<=p3x+1; cy<=p3y; test<=X"2";
else state<=wait_btn;
end if;
elsif(forms="10")then
if(p3y>"000" and p3y<"110")then
cx<=p3x; cy<=p3y-1; test<=X"2";
else state<=wait_btn;
end if;
elsif(forms="11")then
if(p3x>"000" and p3x<"110")then
cx<=p3x-1; cy<=p3y; test<=X"2";
else state<=wait_btn;
end if;
end if;
when X"2"=>
if(dotin="1")then--高电平点亮,位置已被占
state<=wait_btn;--不能旋转,等待操作键
else
test<=X"3";--有空位,测试下一个位置
end if;
--测试空位2--
when X"3"=>--test
if(forms="00")then
cx<=p3x; cy<=p3y-1; test<=X"4";
elsif(forms="01")then
cx<=p3x-1; cy<=p3y; test<=X"4";
elsif(forms="10")then
cx<=p3x; cy<=p3y+1; test<=X"4";
elsif(forms="11")then
cx<=p3x+1; cy<=p3y; test<=X"4";
end if;
when X"4"=>
if(dotin="1")then state<=wait_btn;
else test<=X"5";
end if;
--测试空位3--
when X"5"=>--test
if(forms="00")then
cx<=p3x; cy<=p3y-2; test<=X"6";
elsif(forms="01")then
cx<=p3x-2; cy<=p3y; test<=X"6";
elsif(forms="10")then
cx<=p3x; cy<=p3y+2; test<=X"6";
elsif(forms="11")then
cx<=p3x+2; cy<=p3y; test<=X"6";
end if;
when X"6"=>
if(dotin="1")then state<=wait_btn;
else test<=X"7";
end if;
--测试阻挡1--
when X"7"=>--test
if(forms="00")then
cx<=p1x; cy<=p1y-1; test<=X"8";
elsif(forms="01")then
cx<=p1x-1; cy<=p1y; test<=X"8";
elsif(forms="10")then
cx<=p1x; cy<=p1y+1; test<=X"8";
elsif(forms="11")then
cx<=p1x+1; cy<=p1y; test<=X"8";
end if;
when X"8"=>
if(dotin="1")then --高电平点亮,有阻挡
state<=wait_btn;--不能旋转,等待操作键
else
test<=X"9";--无阻挡,测试下一个位置
end if;
--测试阻挡2--
when X"9"=>--test
if(forms="00")then
cx<=p2x; cy<=p2y-1; test<=X"A";
elsif(forms="01")then
cx<=p2x-1; cy<=p2y; test<=X"A";
elsif(forms="10")then
cx<=p2x; cy<=p2y+1; test<=X"A";
elsif(forms="11")then
cx<=p2x+1; cy<=p2y; test<=X"A";
end if;
when X"A"=>
if(dotin="1")then
state<=wait_btn;
else
test<=X"B";
end if;
--测试阻挡3--
when X"B"=>--test
if(forms="00")then
cx<=p2x; cy<=p2y-2; test<=X"C";
elsif(forms="01")then
cx<=p2x-2; cy<=p2y; test<=X"C";
elsif(forms="10")then
cx<=p2x; cy<=p2y+2; test<=X"C";
elsif(forms="11")then
cx<=p2x+2; cy<=p2y; test<=X"C";
end if;
when X"C"=>
if(dotin="1")then
state<=wait_btn;
else
test<=X"D";
end if;
--测试阻挡4--
when X"D"=>--test
if(forms="00")then
cx<=p4x; cy<=p4y+1; test<=X"E";
elsif(forms="01")then
cx<=p4x+1; cy<=p4y; test<=X"E";
elsif(forms="10")then
cx<=p4x; cy<=p4y-1; test<=X"E";
elsif(forms="11")then
cx<=p4x-1; cy<=p4y; test<=X"E";
end if;
when X"E"=>
if(dotin="1")then
state<=wait_btn;
else
make<=X"8"; state<=rotate_Rp3;
end if;
when others=>null;
end case;
--I型模块以p3为中心顺时针旋转--
when rotate_Rp3=>
case make is --make:8~F
--清空原片--
when X"8"=>
wen_tmp<="1";--开写使能
dotout_tmp<="0";--低电平,熄灭led灯
cx<=p1x; cy<=p1y; make<=X"9";
when X"9"=>
cx<=p2x; cy<=p2y; make<=X"A";
when X"A"=>
cx<=p4x; cy<=p4y; make<=X"B";
--更新p1,p2,p4新片位置--
when X"B"=>--make
if(forms="00")then
p1x<=p1x+2; p1y<=p1y-2;
p2x<=p2x+1; p2y<=p2y-1;
p4x<=p4x-1; p4y<=p4y+1;
elsif(forms="01")then
p1x<=p1x-2; p1y<=p1y-2;
p2x<=p2x-1; p2y<=p2y-1;
p4x<=p4x+1; p4y<=p4y+1;
elsif(forms="10")then
p1x<=p1x-2; p1y<=p1y+2;
p2x<=p2x-1; p2y<=p2y+1;
p4x<=p4x+1; p4y<=p4y-1;
elsif(forms="11")then
p1x<=p1x+2; p1y<=p1y+2;
p2x<=p2x+1; p2y<=p2y+1;
p4x<=p4x-1; p4y<=p4y-1;
end if;
make<=X"C";
--显示新片--
when X"C"=>--make
dotout_tmp<="1";--高电平,点亮led灯
cx<=p1x; cy<=p1y; make<=X"D";
when X"D"=>
cx<=p2x; cy<=p2y; make<=X"E";
when X"E"=>
cx<=p4x; cy<=p4y; make<=X"F";
when X"F"=>--make
wen_tmp<="0";--关写使能
--切换I型模块的形状--
if(forms="00")then forms<="11";
elsif(forms="11")then forms<="10";
elsif(forms="10")then forms<="01";
elsif(forms="01")then forms<="00";
end if;
make<=X"0"; state<=wait_btn;
when others=>null;
end case;
end case;
end if;
end if;
end process;
end behavioral;