FPGA实现俄罗斯方块(二)

简介: 笔记

一. 简介


欢迎关注 微信公众号 FPGA之旅 获取获取更多,最后项目工程将会在公众号进行开源。

回复 FPGA俄罗斯方块 获取项目工程

完整视频演示

在前一篇文章中,简要的介绍了一下俄罗斯方块的一些基本要素,以及一些需要注意的点。在这篇文章中,主要实现两个功能 1. 绘制俄罗斯方块的边界,2.绘制出下一个方块的图像。 现在让我们开始吧。先看一下效果图。

1.png


二. 边界的绘制


在这里定义每一个方块的边长为10,边框的起始点相对于屏幕的偏移为(20,20)。

然后设置下一个方块的预览区域的宽度为5(5个方块大小,后面不再提示)。

这样整个俄罗斯方块的边界大小就确定下来了为宽18,高22。


localparam  TerisW  =  'd10;
localparam  TerisH  = 'd10;
localparam  StartX  = 'd20;
localparam  StartY  = 'd20;

1. 绘制最上面一行方块

首先判断y_addr的值是否到了设置的区域内,然后判断x_addr是否也到了设置的区域内。

为了每一个方块之间有一个间隙,这里还要计算x_addr对TerisW 取余,看是不是方块的左边界,如果是的话,就不显示。

XNum为总宽度。然后最后一行的显示也是如此。

else if(y_addr >= StartY && y_addr < StartY + TerisH)
  if(x_addr%TerisW == 'd0)    //the aim is generate gap
    WallReg <= 1'b0;
  else if(x_addr > StartX && x_addr < StartX + XNum)
    WallReg <= 1'b1;
  else
    WallReg <= 1'b0;


2. 绘制中间区域的三列方块

判断的方式,和上面一样,只是判断的条件发生了变化。

else if(y_addr > StartY + TerisH && y_addr < (StartY + YNum - TerisH))
  if(y_addr%TerisH == 'd0)   //生产间隙
    WallReg <= 1'b0;
  else if(x_addr > StartX + TerisW*4'd6  && x_addr < StartX + TerisW*4'd7) //中间那列方块
    WallReg <= 1'b1;
  else if(x_addr > StartX && x_addr < StartX + TerisW) //最左边那列方块
    WallReg <= 1'b1;
  else if(x_addr > (StartX + XNum -TerisW) && x_addr < StartX + XNum)  //最右边那列方块
    WallReg <= 1'b1;
  else
    WallReg <= 1'b0;


到这里边界的绘制就完成了,这还是非常容易的,就没有做过多的解释,有疑问可以留言哦。


三. 下一个图形生成与显示。


1. 图形的生成

图形的生成是随机的,这里需要用到之前贪吃蛇中随机数生成的模块,直接拿来用就可以了。


每一个图形都是由四个方块组成,所以可以直接用四个寄存器存储四个方块的位置即可。

这里使用10位的寄存器存储,高5位表示x的位置,低5位表示y的位置。

根据随机数生成的值,来判断当前选择那个图形,对照上一篇文章中的图片,一一对应赋值就可以了,如下图,以第一个点为例,这样我们下一个图形的数据就生成了。


2.png

2. 图形的显示

这里以一个点的显示为例,先判断x的位置,然后再判断y的位置。

这里还要结和起始偏移值。

x的值是对应于游戏区域内的值,要想放在下一个图形显示区域内,需要调整XStart的值。

XStart ,YStart 的值可以根据显示需要自行调整。

localparam  XStart  = 'd00;
localparam  YStart  = 'd50;
always@(posedge clk or negedge rst)
begin
  if(rst == 1'b0)
  NextDisplayEnReg1 <= 1'b0;
  else if(x_addr > (TerisW*dot1[9:5] + XStart)  && x_addr < (TerisW*dot1[9:5] + XStart + TerisW))
  if(y_addr > (TerisH*dot1[4:0] + YStart) && y_addr < (TerisH*dot1[4:0] + YStart + TerisH))
    NextDisplayEnReg1 <= 1'b1;
  else
    NextDisplayEnReg1 <= 1'b0;
  else
  NextDisplayEnReg1 <= 1'b0;
end

四. 游戏数据输出


游戏可以分为四部分数据显示,分别是边界,下一个图形,当前图形和以及静止的图形。这里通过一个模块来选择输出对应的数据


3.png

自此这部分的说明就完成了。

下一篇

我们将在下篇文章继续推进该项目的学习。

欢迎关注 微信公众号 FPGA之旅 获取获取更多,最后项目工程将会在公众号进行开源。

回复 FPGA俄罗斯方块 获取项目工程

公众号:FPGA之旅

目录
相关文章
|
存储 算法 IDE
如何用FPGA解一道初中数学题
如何用FPGA解一道初中数学题
164 0
如何用FPGA解一道初中数学题
|
8月前
|
算法 定位技术 C语言
51单片机实现俄罗斯方块游戏编程
设计了一款基于AT89C51单片机的俄罗斯方块游戏机,使用LCD12864液晶显示,按键控制方块移动与变形。游戏中,7种不同形状的方块随机下落,填满一行得分,满屏则游戏结束。包含电源、单片机最小系统、LCD和按键模块的硬件电路通过Proteus进行了仿真,展示了游戏运行、得分和计时等。代码部分展示了检查碰撞和更新地图的函数。
165 1
|
存储 算法 定位技术
|
定位技术 异构计算
|
存储 芯片 异构计算
电子技术课程设计基于FPGA的音乐硬件演奏电路的设计与实现
设计一个乐曲演奏电路,能够自动播放编写好的音乐。要求将音乐通过实验箱上的喇叭播放出来,用发光二级管显示出乐曲的节拍。 (附加功能:本设计在题目所要求的功能全部实现的基础之上又添加了许多附加功能,所有的功能将在“工程设计总述”中阐明,特此声明。
254 0
|
存储 Android开发 异构计算
|
异构计算
|
异构计算
FPGA乐曲演奏电路设计之music1
FPGA乐曲演奏电路设计之music1
107 0
|
编解码 算法 IDE
基于单片机的俄罗斯方块游戏机设计
本设计是通过STC89S52单片机来实现俄罗斯方块游戏的设计,使用C语言进行编程,并通过Proteus来进行仿真。本设计要实现的基本功能是:应用按键来控制方块的变换与移动;消除一行并计分;消除多行额外奖励记分,方块堆满时结束游戏等俄罗斯方块的基本功能。
基于单片机的俄罗斯方块游戏机设计
|
芯片 异构计算
FPGA设计中遇到的奇葩问题之“芯片也要看出身”(一)
FPGA设计中遇到的奇葩问题之“芯片也要看出身”(一) 昨夜西风凋碧树。独上高楼,望尽天涯路 2000年的时候,做设计基本都是使用Xilinx公司的Virtex和Virtex-E系列芯片。那时候Altera技术实力还比较弱,基于Altera的芯片做设计是要被大家diss的。
6168 0
FPGA设计中遇到的奇葩问题之“芯片也要看出身”(一)