FPGA实现俄罗斯方块(二)

一. 简介

欢迎关注 微信公众号 FPGA之旅 获取获取更多,最后项目工程将会在公众号进行开源。
回复 FPGA俄罗斯方块 获取项目工程
完整视频演示
在前一篇文章中,简要的介绍了一下俄罗斯方块的一些基本要素,以及一些需要注意的点。在这篇文章中,主要实现两个功能 1. 绘制俄罗斯方块的边界,2.绘制出下一个方块的图像。 现在让我们开始吧。先看一下效果图。

FPGA实现俄罗斯方块(二)_第1张图片

二. 边界的绘制

在这里定义每一个方块的边长为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的位置。
  • 根据随机数生成的值,来判断当前选择那个图形,对照上一篇文章中的图片,一一对应赋值就可以了,如下图,以第一个点为例,这样我们下一个图形的数据就生成了。
    FPGA实现俄罗斯方块(二)_第2张图片
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

四. 游戏数据输出

游戏可以分为四部分数据显示,分别是边界,下一个图形,当前图形和以及静止的图形。这里通过一个模块来选择输出对应的数据
FPGA实现俄罗斯方块(二)_第3张图片


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

下一篇
我们将在下篇文章继续推进该项目的学习。
欢迎关注 微信公众号 FPGA之旅 获取获取更多,最后项目工程将会在公众号进行开源。
回复 FPGA俄罗斯方块 获取项目工程

你可能感兴趣的:(FPGA,fpga开发,俄罗斯方块,Verilog)