当前位置:   article > 正文

FPGA实现 贪吃蛇_fpga贪吃蛇

fpga贪吃蛇

一. 硬件

  1. 黑金AX4010
  2. AN430显示屏(480*272)
  3. 蓝牙模块
  4. 安卓手机

采用app通过蓝牙模块来操作蛇的移动情况

二. 数据的存储

reg[18:0]	Snake[0:7];		//蛇 18:10 x 9:1 y 	0 :flag 是否是蛇身
reg[17:0]	Food;			//	食物
  • 1
  • 2

三. 蛇的移动的方向

  • 通过上下左右来控制蛇移动的方向
  • 上下左右的命令是app通过蓝牙发送过来的
//方向
always@(posedge clk or negedge rst)
begin
	if(rst == 1'b0)
		direct <= 2'b00;
	else if(up == 1'b1 && direct != 2'b01)
		direct <= 2'b00;
	else if(down == 1'b1 && direct != 2'b00)
		direct <= 2'b01;
	else if(left == 1'b1 && direct != 2'b11)
		direct <= 2'b10;
	else if(right == 1'b1 && direct != 2'b10)
		direct <= 2'b11;
	else
		direct <= direct;
end
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

四. 蛇的刷新

  • 通过观察移动情况可以知道,蛇的当前节下一时刻的位置是前一节的当前位置。
  • 蛇头除外,蛇头的位置需要根据方向来判断,然后计算
    于是就有了如下代码
//刷新蛇 18:10 x   9:1  y
	else if(speed >= SPEED)
	begin
		case(direct)
		2'b00:Snake[0][9:1] <= Snake[0][9:1] - 'd25;
		2'b01:Snake[0][9:1] <= Snake[0][9:1] + 'd25;
		2'b10:Snake[0][18:10] <= Snake[0][18:10] - 'd25;
		2'b11:Snake[0][18:10] <= Snake[0][18:10] + 'd25;
		endcase
		for(i = 1;i<= sub_index ;i=i+1)
			Snake[i] <= Snake[i-1];
	end
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

五. 食物的刷新

  • 当吃到食物之后,就刷新食物的位置,这里食物随机的数据不是很好,周期性重复,但不影响游戏的运行
//生成食物
always@(posedge clk or negedge rst)
begin
	if(rst == 1'b0)
		Food <= {9'd40,9'd50};
	else if(eated == 1'b1)
		Food <= {1'b0,Food[8]^Food[7]^Food[6]^Food[5],Food[7:1],1'b0,Food[16:10],Food[9]^Food[17]};
end
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

六. 蛇和食物的显示

  • 这里采用极为简单的方式来显示,通过几个if else块来判断是否有显示
always@(posedge clk)
begin		
	if(cur_x >= Snake[0][18:10] && cur_x < Snake[0][18:10] + 'd25 &&  cur_y >= Snake[0][9:1] && cur_y < Snake[0][9:1]+'d25 && cur_y >= Snake[0][9:1] && cur_y < Snake[0][9:1]+'d25 && Snake[0][0] == 1'b1)
		lcd_data_out = 24'hABCDEF;
	else if(cur_x >= Snake[1][18:10] && cur_x < Snake[1][18:10] + 'd25 &&  cur_y >= Snake[1][9:1] && cur_y < Snake[1][9:1]+'d25 && cur_y >= Snake[1][9:1] && cur_y < Snake[1][9:1]+'d25 && Snake[1][0] == 1'b1)
		lcd_data_out = 24'hFACDEB;
	else if(cur_x >= Snake[2][18:10] && cur_x < Snake[2][18:10] + 'd25 &&  cur_y >= Snake[2][9:1] && cur_y < Snake[2][9:1]+'d25 && cur_y >= Snake[2][9:1] && cur_y < Snake[2][9:1]+'d25 && Snake[2][0] == 1'b1)
		lcd_data_out = 24'hFACDEB;
	else if(cur_x >= Snake[3][18:10] && cur_x < Snake[3][18:10] + 'd25 &&  cur_y >= Snake[3][9:1] && cur_y < Snake[3][9:1]+'d25 && cur_y >= Snake[3][9:1] && cur_y < Snake[3][9:1]+'d25 && Snake[3][0] == 1'b1)
		lcd_data_out = 24'hFACDEB;
	else if(cur_x >= Snake[4][18:10] && cur_x < Snake[4][18:10] + 'd25 &&  cur_y >= Snake[4][9:1] && cur_y < Snake[4][9:1]+'d25 && cur_y >= Snake[4][9:1] && cur_y < Snake[4][9:1]+'d25 && Snake[4][0] == 1'b1)
		lcd_data_out = 24'hFACDEB;
	else if(cur_x >= Snake[5][18:10] && cur_x < Snake[5][18:10] + 'd25 &&  cur_y >= Snake[5][9:1] && cur_y < Snake[5][9:1]+'d25 && cur_y >= Snake[5][9:1] && cur_y < Snake[5][9:1]+'d25 && Snake[5][0] == 1'b1)
		lcd_data_out = 24'hFACDEB;
	else if(cur_x >= Snake[6][18:10] && cur_x < Snake[6][18:10] + 'd25 &&  cur_y >= Snake[6][9:1] && cur_y < Snake[6][9:1]+'d25 && cur_y >= Snake[6][9:1] && cur_y < Snake[6][9:1]+'d25 && Snake[6][0] == 1'b1)
		lcd_data_out = 24'hFACDEB;
	else if(cur_x >= Food[17:9] && cur_x < Food[17:9] + 'd25 &&  cur_y >= Food[8:0] && cur_y < Food[8:0]+'d25 && cur_y >= Food[8:0] && cur_y < Food[8:0]+'d25)
		lcd_data_out = 24'hFACDEB;
	else
		lcd_data_out = 24'hffffff;
end
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21

效果图如下 下载链接
关注微信公众号 FPGA之旅 回复 FPGA贪吃蛇免费获取
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/爱喝兽奶帝天荒/article/detail/775846
推荐阅读
相关标签
  

闽ICP备14008679号