返回信息流蛇的移位是怎么实现的,用循环移位貌似不好实现。我编了大半发现自己的思想不能实现,VHDL还是比较难理解的啊。。
这是一条镜像帖。来源:北邮人论坛 / see / #39221同步于 2010/12/22
该镜像源已超过 30 天没有更新,可能在源站已被删除。
SEE机器人发帖
大三数电实验有无学长学姐做过“贪食蛇”这个题目?求指导
lazydog616
2010/12/22镜像同步21 回复
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
附上我的程序:
LIBRARY ieee;
USE ieee.std_logic_1164.all;
USE ieee.std_logic_unsigned.all;
USE ieee.std_logic_1164.all;
ENTITY move IS
PORT (
grom,gcol:OUT STD_LOGIC_VECTOR(7 DOWNTO 0);
gradeout: OUT STD_LOGIC_VECTOR(3 DOWNTO 0);
up,down,r,l: IN STD_LOGIC;
reset:IN STD_LOGIC;
clk:IN STD_LOGIC
);
END move;
ARCHITECTURE snake_move of move IS
--TYPE BIT_VECTOR_8 IS ARRAY (0 TO 7) OF BIT;
--TYPE BIT_VECTOR_4 IS ARRAY (O TO 3) OF BIT;
--COMPONENT rorr
--PORT(
--s: IN STD_LOGIC_VECTOR(7 DOWNTO 0);
--ss:OUT STD_LOGIC_VECTOR(7 DOWNTO 0));
--END COMPONENT;
--COMPONENT roll
--PORT(
--l: IN STD_LOGIC_VECTOR(7 DOWNTO 0);
--ll:OUT STD_LOGIC_VECTOR(7 DOWNTO 0));
--END COMPONENT;
SIGNAL tx:STD_LOGIC_VECTOR(1 DOWNTO 0);--up:00;down:11;r:01;l:10
SIGNAL srom1,scol1,srom2,scol2,srom3,scoL3,srom4,scol4:STD_LOGIC_VECTOR(7 DOWNTO 0);
SIGNAL wallrom,wallcol:STD_LOGIC_VECTOR(7 DOWNTO 0);
SIGNAL grade: STD_LOGIC_VECTOR(3 DOWNTO 0);
SIGNAL rom,col:STD_LOGIC_VECTOR(7 DOWNTO 0);--是否碰壁的判定
SIGNAL sign: STD_LOGIC; --是否碰壁的判断(直接)
SIGNAL timecount: INTEGER RANGE 4 DOWNTO 0;
SIGNAL stime: INTEGER RANGE 19 DOWNTO 0;
SIGNAL foodrom,foodcol :STD_LOGIC_VECTOR(7 DOWNTO 0);
SIGNAL temprom,tempcol:STD_LOGIC;
BEGIN
move:PROCESS(clk,reset)
BEGIN
IF reset='1' THEN
srom1<="01111111";
scol1<="10000000";
srom2<="01111111";
scol2<="01000000";
srom3<="01111111";
scol3<="00100000";
srom4<="01111111";
scol4<="00010000";
wallrom<="11101111";
wallcol<="00111100";
ELSE
srom4<=srom3;
scol4<=scol3;
srom3<=srom2;
scol3<=scol2;
srom2<=srom1;
scol2<=scol1;
IF up'event and up='1' THEN
IF tx="11" THEN --此时状态为down
srom1<=srom1;
tempcol<=scol1(0);
scol1(0)<=scol1(1);
scol1(1)<=scol1(2);
scol1(2)<=scol1(3);
scol1(3)<=scol1(4);
scol1(4)<=scol1(5);
scol1(5)<=scol1(6);
scol1(6)<=scol1(7);
scol1(7)<=tempcol;--DOWN ror
tx<="11";
ELSE
srom1<=srom1;
tempcol<=scol1(7);
scol1(7)<=scol1(6);
scol1(6)<=scol1(5);
scol1(5)<=scol1(4);
scol1(4)<=scol1(3);
scol1(3)<=scol1(2);
scol1(2)<=scol1(1);
scol1(1)<=scol1(0);
scol1(0)<=tempcol;--UP rol
tx<="00";
END IF;
ELSIF down' event and down ='1' THEN
IF tx="00" THEN --此时状态为up
srom1<=srom1;
tempcol<=scol1(7);
scol1(7)<=scol1(6);
scol1(6)<=scol1(5);
scol1(5)<=scol1(4);
scol1(4)<=scol1(3);
scol1(3)<=scol1(2);
scol1(2)<=scol1(1);
scol1(1)<=scol1(0);
scol1(0)<=tempcol;--UP rol
tx<="00";
ELSE
srom1<=srom1;
tempcol<=scol1(0);
scol1(0)<=scol1(1);
scol1(1)<=scol1(2);
scol1(2)<=scol1(3);
scol1(3)<=scol1(4);
scol1(4)<=scol1(5);
scol1(5)<=scol1(6);
scol1(6)<=scol1(7);
scol1(7)<=tempcol;--DOWN ror
tx<="11";
END IF;
ELSIF r'event and r='1' THEN
IF tx="10" THEN --此时状态为left
temprom<=srom1(0);
srom1(0)<=srom1(1);
srom1(1)<=srom1(2);
srom1(2)<=srom1(3);
srom1(3)<=srom1(4);
srom1(5)<=srom1(6);
srom1(6)<=srom1(7);
srom1(7)<=temprom;--left ror
scol1<=scol1;
tx<="10";
ELSE
temprom<=srom1(7);
srom1(7)<=srom1(6);
srom1(6)<=srom1(5);
srom1(5)<=srom1(4);
srom1(4)<=srom1(3);
srom1(3)<=srom1(2);
srom1(2)<=srom1(1);
srom1(1)<=srom1(0);
srom1(0)<=temprom;--RIGHT rol
scol1<=scol1;
tx<="01";
END IF;
ELSIF l'event and l='1' THEN
IF tx="01" THEN --此时状态为right
temprom<=srom1(7);
srom1(7)<=srom1(6);
srom1(6)<=srom1(5);
srom1(5)<=srom1(4);
srom1(4)<=srom1(3);
srom1(3)<=srom1(2);
srom1(2)<=srom1(1);
srom1(1)<=srom1(0);
srom1(0)<=temprom;--RIGHT rol
scol1<=scol1;
tx<="01";
ELSE
temprom<=srom1(0);
srom1(0)<=srom1(1);
srom1(1)<=srom1(2);
srom1(2)<=srom1(3);
srom1(3)<=srom1(4);
srom1(5)<=srom1(6);
srom1(6)<=srom1(7);
srom1(7)<=temprom;--left ror
scol1<=scol1;
tx<="10";
END IF;
ELSIF up='0' AND down='0' AND r='0' AND l='0' THEN --如果没有控制信息
IF tx="00" THEN --STATE IS UP NOW
srom1<=srom1;
tempcol<=scol1(7);
scol1(7)<=scol1(6);
scol1(6)<=scol1(5);
scol1(5)<=scol1(4);
scol1(4)<=scol1(3);
scol1(3)<=scol1(2);
scol1(2)<=scol1(1);
scol1(1)<=scol1(0);
scol1(0)<=tempcol;--UP rol
tx<="00";
ELSIF tx="11" THEN --STATE IS DOWN NOW
srom1<=srom1;
tempcol<=scol1(0);
scol1(0)<=scol1(1);
scol1(1)<=scol1(2);
scol1(2)<=scol1(3);
scol1(3)<=scol1(4);
scol1(4)<=scol1(5);
scol1(5)<=scol1(6);
scol1(6)<=scol1(7);
scol1(7)<=tempcol;--DOWN ror
tx<="11";
ELSIF tx="01" THEN --STATS IS RIGHT NOW
temprom<=srom1(7);
srom1(7)<=srom1(6);
srom1(6)<=srom1(5);
srom1(5)<=srom1(4);
srom1(4)<=srom1(3);
srom1(3)<=srom1(2);
srom1(2)<=srom1(1);
srom1(1)<=srom1(0);
srom1(0)<=temprom;--RIGHT rol
scol1<=scol1;
tx<="01";
ELSIF tx="10" THEN --STATE IS LEFT NOW
temprom<=srom1(0);
srom1(0)<=srom1(1);
srom1(1)<=srom1(2);
srom1(2)<=srom1(3);
srom1(3)<=srom1(4);
srom1(5)<=srom1(6);
srom1(6)<=srom1(7);
srom1(7)<=temprom;--left ror
scol1<=scol1;
tx<="10";
END IF;
END IF;
END IF;
END PROCESS move;
gradecount: PROCESS(clk,reset)
VARIABLE g: INTEGER RANGE 7 DOWNTO 0;
BEGIN
IF reset='1' THEN
foodrom<="11101111";
foodcol<="01000000";
grade<="0000";
timecount<=4;
stime<=19;
ELSE stime<=stime-1;
IF stime>=0 THEN
IF (srom1!=foodrom OR scol1!=foodcol) THEN
timecount<=timecount-1;
IF timecount=0 THEN
timecount<=4;
foodrom<=foodrom-'1';
foodcol<=foodcol;
END IF;
ELSIF srom1=foodrom AND scol1=foodcol THEN
foodrom<=foodrom+'1';
foodcol<=foodcol;
timecount<=4;
IF grade<="0100" THEN
grade<=grade+'1';
ELSIF grade="0101" THEN
srom1<="00000000";
srom2<="00000000";
srom3<="00000000";
srom4<="00000000";
scol1<="11111111";
scol2<="11111111";
scol3<="11111111";
scol4<="11111111";
foodrom<="00000000";
foodcol<="11111111";
wallrom<="00000000";
wallcol<="11111111";--light all
END IF;
ELSIF stime< 0 THEN
srom1<="11111111";
srom2<="11111111";
srom3<="11111111";
srom4<="11111111";
scol1<="00000000";
scol2<="00000000";
scol3<="00000000";
scol4<="00000000";
foodrom<="11111111";
foodcol<="00000000";
wallrom<="11111111";
wallcol<="00000000";--dark ,TIMEOUT LOSE
END IF;
END IF;
END PROCESS gradecount;
grom<=srom1 or srom2 or srom3 or srom4 or foodrom or wallrom;
gcol<=scol1 or scol2 or scol3 or scol4 or foodcol or wallcol;
gradeout<=grade;
END snake_move;
这个。我只能帮顶了
【 在 lazydog616 (lazydog616) 的大作中提到: 】
: 蛇的移位是怎么实现的,用循环移位貌似不好实现。我编了大半发现自己的思想不能实现,VHDL还是比较难理解的啊。。
copy下来,以后大三可以用。。
【 在 lazydog616 (lazydog616) 的大作中提到: 】
: 蛇的移位是怎么实现的,用循环移位貌似不好实现。我编了大半发现自己的思想不能实现,VHDL还是比较难理解的啊。。