【tusterのFPGA作业教程】第四章:实验3——俄罗斯方块的旋转测试与动作(2)

        任务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;

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值