俄罗斯方块设计实验报告

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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;

相关文档
最新文档