俄罗斯方块设计实验报告_第1页
俄罗斯方块设计实验报告_第2页
俄罗斯方块设计实验报告_第3页
俄罗斯方块设计实验报告_第4页
俄罗斯方块设计实验报告_第5页
已阅读5页,还剩4页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

——————数字电路与逻辑设计实验报告—————基于VHDL的简易俄罗斯方块 实验名称 简易俄罗斯方块 姓名 班级 电信工程学院04107班学号 辅导老师 高英 日期 2006年11月6日 摘要 俄罗斯方块游戏是我们熟知的经典小游戏之一,本实验通过硬件编成实现了简易的俄罗斯方块游戏机。VHDL是一种标准的,规范的硬件描述语言,在电子设计领域有着广泛的应用。它具有很强的电路描述和建模能力,能从多个层次多电路进行描述和建模,从而大大简化了硬件设计任务,提高了设计效率和可靠性。 本实验基于VHDL语言,利用电路中心开发的实验板,用一个4×4点阵做为基本显示屏,一个发光点表示一个图形,完成俄罗斯方块游戏的基本功能:下落、左右移动、消行和显示得分情况,当某一列到顶时游戏结束。关键字 俄罗斯方块游戏VHDL点阵设计任务 利用电路中心开发的实验板,用点阵做为显示屏,一个发光点表示一个方块,完成下落、左右移动、消行和显示得分情况,当某一列到顶时游戏结束,数码管显示的分数保持不变。设计思路 由于实验中只用到了16个点来完成显示功能,所以选用一个16位的向量STATUS(0TO15)来存储各点状态,再用两个整型数分别控制当前点的坐标,但是这样控制会涉及到乘法运算,因此改为4个4位向量STAN(0TO3),每个向量代表一行点阵,这样做不仅使控制简单,而且在扫描显示的时候很方便,代码也很简洁。 设计包括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/06LIBRARYIEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_SIGNED.ALL;ENTITY RUSSIA ISPORT(CLK :INSTD_LOGIC; -------时钟频率,选用低频 RESET :INSTD_LOGIC; -------复位键 LEFT :INSTD_LOGIC; -------左移键 RIGHT :INSTD_LOGIC; -------右移键 SCORES :OUTINTEGERRANGE0TO15; -------分数 STA0:OUTSTD_LOGIC_VECTOR(0TO3); -------以下为四行状态寄存 STA1:OUTSTD_LOGIC_VECTOR(0TO3); STA2:OUTSTD_LOGIC_VECTOR(0TO3); STA3:OUTSTD_LOGIC_VECTOR(0TO3));ENDRUSSIA;ARCHITECTUREMOVINGOFRUSSIAISSIGNALSTATU0:STD_LOGIC_VECTOR(0TO3);SIGNAL STATU1:STD_LOGIC_VECTOR(0TO3);SIGNAL STATU2:STD_LOGIC_VECTOR(0TO3);SIGNAL STATU3:STD_LOGIC_VECTOR(0TO3);SIGNALFLAG :STD_LOGIC; -------gameover标志SIGNALFP :INTEGERRANGE0TO499; -------1000分频SIGNALCLK1 :STD_LOGIC;SIGNALSCOR_TEMP:INTEGERSIGNALROW4:STD_LOGIC; -------消行标志SIGNALROW,COL:INTEGERRANGE0TO3; -------点的坐标控制BEGINP1:PROCESS(CLK,RESET)BEGIN IFRESET='1'THEN FP<=0; CLK1<='0'; ELSIF(CLK'EVENTANDCLK='1')THEN IFFP=2THEN FP<=0; CLK1<=NOTCLK1; ELSE FP<=FP+1; ENDIF; ENDIF;ENDPROCESS; --------p1用来分频P2:PROCESS(CLK1,RESET)BEGIN IFRESET='1'THEN --------系统初始化 STATU0<="0100"; STATU1<="0000"; STATU2<="0000"; STATU3<="0000"; FLAG<='0'; SCOR_TEMP<=0; ROW4<='0'; ROW<=0; COL<=1; ELSIF(CLK1'EVENTANDCLK1='1')THEN IFFLAG='1'THEN --------gameover进入空循环 NULL; ELSIFROW4='1'THEN --------消行 STATU3<=STATU2; STATU2<=STATU1; STATU1<=STATU0; ROW4<='0'; SCOR_TEMP<=SCOR_TEMP+1; --------加分 ELSIF(STATU0(0)='1'ANDSTATU1(0)='1'ANDSTATU2(0)='1'ANDSTATU3(0)='1') OR(STATU0(1)='1'ANDSTATU1(1)='1'ANDSTATU2(1)='1'ANDSTATU3(1)='1') OR(STATU0(2)='1'ANDSTATU1(2)='1'ANDSTATU2(2)='1'ANDSTATU3(2)='1') OR(STATU0(3)='1'ANDSTATU1(3)='1'ANDSTATU2(3)='1'ANDSTATU3(3)='1')THEN FLAG<='1'; --------判断四列中是否有一列全为1,是则FLAG<='1' ELSIFSTATU3="1111"THEN ROW4<='1'; --------可以消行了 ELSIFRIGHT='1'ANDCOL<3THEN --------右移判断 CASEROWISWHEN0=>IFSTATU0(COL+1)='0'THENCOL<=COL+1;STATU0(COL+1)<='1';STATU0(COL)<='0';ENDIF;WHEN1=>IFSTATU1(COL+1)='0'THENCOL<=COL+1;STATU1(COL+1)<='1';STATU1(COL)<='0';ENDIF;WHEN2=>IFSTATU2(COL+1)='0'THENCOL<=COL+1;STATU2(COL+1)<='1';STATU2(COL)<='0';ENDIF;WHENOTHERS=>IFSTATU3(COL+1)='0'THENCOL<=COL+1;STATU3(COL+1)<='1';STATU3(COL)<='0';ENDIF; ENDCASE; ELSIFLEFT='1'ANDCOL>0THEN ---------左移判断 CASEROWISWHEN0=>IFSTATU0(COL-1)='0'THENCOL<=COL-1;STATU0(COL-1)<='1';STATU0(COL)<='0';ENDIF;WHEN1=>IFSTATU1(COL-1)='0'THENCOL<=COL-1;STATU1(COL-1)<='1';STATU1(COL)<='0';ENDIF;WHEN2=>IFSTATU2(COL-1)='0'THENCOL<=COL-1;STATU2(COL-1)<='1';STATU2(COL)<='0';ENDIF;WHENOTHERS=>IFSTATU3(COL-1)='0'THENCOL<=COL-1;STATU3(COL-1)<='1';STATU3(COL)<='0';ENDIF; ENDCASE; --------以下elsif语句为点的下移处理ELSIFROW=0ANDSTATU1(COL)='0'THENROW<=ROW+1;STATU1(COL)<='1';STATU0(COL)<='0';ELSIFROW=1ANDSTATU2(COL)='0'THENROW<=ROW+1;STATU2(COL)<='1';STATU1(COL)<='0';ELSIFROW=2ANDSTATU3(COL)='0'THENROW<=ROW+1;STATU3(COL)<='1';STATU2(COL)<='0'; ELSEROW<=0;COL<=1;STATU0(1)<='1';---不能下移则产生一个新的点 ENDIF;ENDIF;ENDPROCESS; SCORES<=SCOR_TEMP; STA0<=STATU0; STA1<=STATU1; STA2<=STATU2; STA3<=STATU3;END;底层文件2:RUSSIA_SCAN.vhd-----RUSSIA_SCAN.vhd-----osom------6/11/06LIBRARYIEEE;USE IEEE.STD_LOGIC_1164.ALL;ENTITY RUSSIA_SCAN ISPORT(CLK: IN STD_LOGIC; RESET: INSTD_LOGIC; STA0: INSTD_LOGIC_VECTOR(0TO3); -------以下为4行的状态 STA1: INSTD_LOGIC_VECTOR(0TO3); STA2: INSTD_LOGIC_VECTOR(0TO3); STA3: INSTD_LOGIC_VECTOR(0TO3); SCORE: ININTEGERRANGE0TO15; -------分数 COL: OUTSTD_LOGIC_VECTOR(0TO3); -------点阵显示的行列控制 ROW: OUTSTD_LOGIC_VECTOR(0TO3); DISP:OUTSTD_LOGIC_VECTOR(6DOWNTO0);------数码管译码 CAT : OUTSTD_LOGIC_VECTOR(5DOWNTO0)------数码管选择);ENDRUSSIA_SCAN;ARCHITECTUREBEHAVEOFRUSSIA_SCANISSIGNAL CP:INTEGERSIGNALROWT,COLT:STD_LOGIC_VECTOR(0TO3);SIGNALDISPT:STD_LOGIC_VECTOR(6DOWNTO0);BEGINPROCESS(CLK,SCORE,RESET)BEGINIFRESET='1'THEN DISPT<="0000000"; ROWT<="0000"; COLT<="1111"; CP<=0;ELSIFCLK'EVENTANDCLK='1'THEN IFCP=3THEN CP<=0; ELSE CP<=CP+1; ENDIF; CASECPIS --------对时钟4分频,用于点阵扫描 WHEN0=>ROWT<="1000";COLT<=NOTSTA0; -------采用行扫描法 WHEN1=>ROWT<="0100";COLT<=NOTSTA1; WHEN2=>ROWT<="0010";COLT<=NOTSTA2; WHENOTHERS=>ROWT<="0001";COLT<=NOTSTA3; ENDCASE; CASESCOREIS --------分数译码 WHEN0=>DISPT<="1111110"; --------0 WHEN1=>DISPT<="0110000"; --------1 WHEN2=>DISPT<="1101101"; --------2 WHEN3=>DISPT<="1111001"; --------3 WHEN4=>DISPT<="0110011"; --------4 WHEN5=>DISPT<="1011011"; --------5 WHEN6=>DISPT<="1011111"; --------6 WHEN7=>DISPT<="1110000"; --------7 WHEN8=>DISPT<="1111111"; --------8 WHEN9=>DISPT<="1111011"; --------9 WHEN10=>DISPT<="1110111"; -------10 WHEN11=>DISPT<="0011111"; -------11 WHEN12=>DISPT<="1001110"; -------12 WHEN13=>DISPT<="0111101"; -------13 WHEN14=>DISPT<="1001111"; -------14 WHEN15=>DISPT<="1000111"; -------15 WHENOTHERS=>DISPT<="0000000"; ENDCASE;ENDIF;ENDPROCESS; ROW<=ROWT; COL<=COLT; DISP<=DISPT; CAT<="011111"; -------选择第一个数码管END; 顶层文件RUSSIABLOCK.vhd------RUSSIABLOCK.vhd-----osom------6/11/06LIBRARYIEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_SIGNED.ALL;ENTITY RUSSIABLOCK ISPORT(CLK :INSTD_LOGIC; -----------低频时钟 RESET :INSTD_LOGIC; -----------开始复位键 LEFT :INSTD_LOGIC; -----------左移 RIGHT : INSTD_LOGIC; -----------右移 COL OUTSTD_LOGIC_VECTOR(0TO3); ----------列 ROW: OUTSTD_LOGIC_VECTOR(0TO3); ----------行 DISP:OUTSTD_LOGIC_VECTOR(6DOWNTO0);--------数码管显示分数 CAT : OUTSTD_LOGIC_VECTOR(5DOWNTO0)------数码管选择 );ENDRUSSIABLOCK;ARCHITECTURE RBLOCKOFRUSSIABLOCKISSIGNAL FENSHU:INTEGERSIGNALSTA0,STA1,STA2,STA3:STD_LOGIC_VECTOR(0TO3);COMPONENT -----------元件例化申明 RUSSIAPORT(CLK RESET :INSTD_LOGIC; LEFT :INSTD_LOGIC; RIGHT :INSTD_LOGIC; SCORES :OUT STA0:OUTSTD_LOGIC_VECTOR(0TO3); STA1:OUTSTD_LOGIC_VECTOR(0TO3); STA2:OUTSTD_LOGIC_VECTOR(0TO3); STA3:OUTSTD_LOGIC_VECTOR(0TO3) );ENDCOMPONENT;COMPONENT-----------元件例化申明RUSSIA_SCANPORT( CLK: IN STD_LOGIC; STA0: INSTD_LOGIC_VECTOR(0TO3); STA1: INSTD_LOGIC_VECTOR(0TO3); STA2: INSTD_LOGIC_VECTOR(0TO3); STA3: INSTD_LOGIC_VECTOR(0TO3); SCORE: ININTEGER COL: OUTSTD_LOGIC_VECTOR(0TO3); ROW: OUTSTD_LOGIC_VECTOR(0TO3); DISP: OUTSTD_LOGIC_VECTOR(6DOWNTO0); CAT : OUTSTD_LOGIC_VECTOR(5DOWNTO0) );ENDCOMPONENT;BEGIN --------------元件例化 C1:RUSSIA PORTMAP(CLK,RESET,LEFT,RIGHT,FENSHU,STA0,STA1,STA2,STA3);C2:RUSSIA_SCANPORTMAP(CLK,STA0,STA1,STA2,STA3,FENSHU,COL,ROW,DISP,CAT);END;仿真波形 实验中所遇到的问题 1.由于初次设计较大的硬件程序,所以开始遇到的问题比较多。对于本实验而言,最重要的我认为是数据结构的设计,就是使用什么方案来解决点的状态寄

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论