俄罗斯方块设计实验报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
——————数字电路与逻辑设计实验报告—————基于VHDL的简易俄罗斯方块
实验名称简易俄罗斯方块
姓名
班级电信工程学院04107班
学号
辅导老师高英
日期2006年11月6日
◆摘要
俄罗斯方块游戏是我们熟知的经典小游戏之一,本实验通过硬件编成实现了简易的俄罗斯方块游戏机。VHDL是一种标准的,规范的硬件描述语言,在电子设计领域有着广泛的应用。它具有很强的电路描述和建模能力,能从多个层次多电路进行描述和建模,从而大大简化了硬件设计任务,提高了设计效率和可靠性。
本实验基于VHDL语言,利用电路中心开发的实验板,用一个4×4点阵做为基本显示屏,一个发光点表示一个图形,完成俄罗斯方块游戏的基本功能:下落、左右移动、消行和显示得分情况,当某一列到顶时游戏结束。
关键字俄罗斯方块游戏VHDL 点阵
◆设计任务
利用电路中心开发的实验板,用点阵做为显示屏,一个发光点表示一个方块,完成下落、左右移动、消行和显示得分情况,当某一列到顶时游戏结束,数码管显示的分数保持不变。
◆设计思路
由于实验中只用到了16个点来完成显示功能,所以选用一个16位的向量STATUS(0 TO 15)来存储各点状态,再用两个整型数分别控制当前点的坐标,但是这样控制会涉及到乘法运算,因此改为4个4位向量STAN(0 TO 3),每个向量代表一行点阵,这样做不仅使控制简单,而且在扫描显示的时候很方便,代码也很简洁。
设计包括2个大的元件,一个是RUSSIA,其功能是存储状态,分频,完成左右下移动以及计分等功能;另一个是RUSSIA_SCAN,主要完成点阵扫描和数码管译码。具体设计是这样的:4个向量STA0,STA1,STA2,STA3记录游戏状态,点的坐标由COL 和ROW来控制。设置两个指针FLAG和ROW4,如果四列中有一列都为1,表示游戏结束了,置FLAG为1,程序进入NULL;当最后一行及STA3=”1111”时,置ROW4=1,当ROW4=1时,表示要消行,加分,并且将上一行的值赋到下一行。游戏继续,如按下左键或右键,程序更根据下一状态决定是否左移或右移。(BTN1为复位RESET,BTN2为左,BTN3为右)若无键按下,则根据情况当前点是否需要自动下移。
源代码
底层文件1:russia.vhd
------ russia.vhd
------osom
------6/11/06
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_SIGNED.ALL;
ENTITY RUSSIA IS
PORT(CLK :IN STD_LOGIC; -------时钟频率,选用低频RESET :IN STD_LOGIC; -------复位键
LEFT :IN STD_LOGIC; -------左移键
RIGHT :IN STD_LOGIC; -------右移键
SCORES :OUT INTEGER RANGE 0 TO 15; -------分数
STA0 : OUT STD_LOGIC_VECTOR(0 TO 3) ; -------以下为四行状态寄存STA1 : OUT STD_LOGIC_VECTOR(0 TO 3) ;
STA2 : OUT STD_LOGIC_VECTOR(0 TO 3) ;
STA3 : OUT STD_LOGIC_VECTOR(0 TO 3) );
END RUSSIA;
ARCHITECTURE MOVING OF RUSSIA IS
SIGNAL STATU0 : STD_LOGIC_VECTOR(0 TO 3) ;
SIGNAL STATU1 : STD_LOGIC_VECTOR(0 TO 3) ;
SIGNAL STATU2 : STD_LOGIC_VECTOR(0 TO 3) ;
SIGNAL STATU3 : STD_LOGIC_VECTOR(0 TO 3) ;
SIGNAL FLAG : STD_LOGIC; -------game over 标志SIGNAL FP :INTEGER RANGE 0 TO 499; -------1000分频
SIGNAL CLK1 :STD_LOGIC;
SIGNAL SCOR_TEMP :INTEGER RANGE 0 TO 15;
SIGNAL ROW4 :STD_LOGIC; -------消行标志
SIGNAL ROW,COL:INTEGER RANGE 0 TO 3; -------点的坐标控制
BEGIN
P1:PROCESS(CLK,RESET)
BEGIN
IF RESET='1' THEN
FP<=0;
CLK1<='0';
ELSIF(CLK'EVENT AND CLK='1')THEN
IF FP=2 THEN
FP<=0;
CLK1<=NOT CLK1;
ELSE
FP<=FP+1;
END IF;
END IF;
END PROCESS; --------p1用来分频
P2:PROCESS(CLK1,RESET)
BEGIN
IF RESET='1' THEN --------系统初始化
STATU0<="0100";
STATU1<="0000";
STATU2<="0000";
STATU3<="0000";
FLAG<='0';
SCOR_TEMP<=0;
ROW4<='0';
ROW<=0;
COL<=1;
ELSIF(CLK1'EVENT AND CLK1='1')THEN
IF FLAG='1' THEN --------game over 进入空循环
NULL;
ELSIF ROW4='1' THEN --------消行
STATU3<=STATU2;
STATU2<=STATU1;
STATU1<=STATU0;
ROW4<='0';
SCOR_TEMP<=SCOR_TEMP+1; --------加分
ELSIF (STATU0(0)='1' AND STATU1(0)='1' AND STATU2(0)='1' AND STATU3(0)='1' ) OR(STATU0(1)='1' AND STATU1(1)='1' AND STATU2(1)='1' ANDSTATU3(1)='1' )
OR(STATU0(2)='1' AND STATU1(2)='1' AND STATU2(2)='1' AND STATU3(2)='1' )
OR(STATU0(3)='1' AND STATU1(3)='1' AND STATU2(3)='1' AND STATU3(3)='1') THEN
FLAG<='1'; --------判断四列中是否有一列全为1,是则FLAG<='1' ELSIF STATU3="1111"THEN
ROW4<='1'; --------可以消行了
ELSIF RIGHT='1' AND COL<3 THEN --------右移判断
CASE ROW IS
WHEN 0=>IF STATU0(COL+1)='0' THEN
COL<=COL+1;STATU0(COL+1)<='1';STATU0(COL)<='0'; END IF ;
WHEN 1=>IF STATU1(COL+1)='0' THEN
COL<=COL+1;STATU1(COL+1)<='1';STATU1(COL)<='0'; END IF ;
WHEN 2=>IF STATU2(COL+1)='0' THEN
COL<=COL+1;STATU2(COL+1)<='1';STATU2(COL)<='0'; END IF ;
WHEN OTHERS=>IF STATU3(COL+1)='0' THEN
COL<=COL+1;STATU3(COL+1)<='1'; STATU3(COL)<='0'; END IF ;
END CASE;