食物产生模块完成的任务是:每次初始化就给定一个食物坐标比如(24,10),然后用蛇头坐标跟食物坐标对比来判断是否吃掉了食物,如果被吃掉,就产生新的苹果坐标。
单元的划分
蛇要吃掉的食物(苹果)大小为16*16个像素(蛇头大小也是16*16, 蛇身每一节大小也是16*16)。
显示器分辨率是640*480,假设16*16算作一个单元,那么640*480可以看作是40*30个单元的一个长方形。这些单元的坐标范围是[39:0],[29:0];去掉墙壁厚度(墙壁占用一个单元的厚度),食物可产生的坐标范围为:[38:1],[28:1]。
产生分数累计信号(也是蛇身增长信号)
当蛇头坐标和苹果坐标一样时,表示蛇吃掉一个苹果,就将 add_cube 信号置1:
if(apple_x == head_x && apple_y == head_y) begin add_cube <= 1; end
随机数的产生
这里用加法产生随机数。
random_num寄存器没有初始化,所以它的初始值是不确定的,然后随着每次吃食物的时间不确定性,random_num+999就是一个非常具有随机数特征的数。
采用随机数高六位为食物x的坐标,低五位为苹果y坐标。
always@(posedge clk) random_num <= random_num + 999;
每当蛇吃掉一个食物,就要同时产生一个新的食物,这个食物的坐标是这样产生的:
apple_x <= (random_num[10:5] > 38) ? (random_num[10:5] - 25) : (random_num[10:5] == 0) ? 1 : random_num[10:5]; apple_y <= (random_num[4:0] > 28) ? (random_num[4:0] - 3) : (random_num[4:0] == 0) ? 1:random_num[4:0];
如果 apple_x满足条件 random num[10:5] > 38(代表食物x坐标与显示器最右边边框重合),那apple_x值就取 random num[10:5] - 25,如果apple_x不满足条件random num[10:5] > 38,就看apple_x满不满足 random_num[10:5] == 0(代表食物x坐标与显示器最左边边框重合),如果apple_x满足random_num[10:5] == 0,apple_x就取1, 否则apple_x就取random_num[10:5]。
apple_y 同理。
食物产生模块完整代码
apple_generate.v的完整代码如下:
//食物(苹果)产生控制模块 //初始化给定一个食物坐标,输入蛇头坐标跟食物坐标对比来判断是否吃掉食物,如果被吃掉,就产生新的苹果坐标 module apple_generate( input clk, //时钟25MHz input rst_n,//系统复位 input [5:0]head_x,//蛇的头部x轴坐标 input [5:0]head_y,//蛇的头部y轴坐标 output reg [5:0]apple_x,//苹果的x轴坐标 output reg [4:0]apple_y,//苹果的y轴坐标 output reg add_cube//蛇吃掉一个苹果标志 ); reg [31:0]clk_cnt; reg [10:0]random_num;//寄存器没有初始化 always@(posedge clk) random_num <= random_num + 999; //用加法产生随机数 //随机数高六位为食物x的坐标,低五位为苹果Y坐标 always@(posedge clk or negedge rst_n) begin if(!rst_n) begin clk_cnt <= 0; apple_x <= 24; apple_y <= 10; add_cube <= 0; end else begin if(apple_x == head_x && apple_y == head_y) begin//当蛇头坐标和苹果坐标一样时,表示蛇吃掉一个苹果 add_cube <= 1; apple_x <= (random_num[10:5] > 38) ? (random_num[10:5] - 25) : (random_num[10:5] == 0) ? 1 : random_num[10:5]; apple_y <= (random_num[4:0] > 28) ? (random_num[4:0] - 3) : (random_num[4:0] == 0) ? 1:random_num[4:0]; end //判断随机数是否超出频幕坐标范围 将随机数转换为下个苹果的X Y坐标 else add_cube <= 0; end end endmodule
友晶科技FPGA开发板实现贪吃蛇游戏(九)——蛇身控制 DE10-STANDARD、DE1-SOC、DE2-115 - Doreen的FPGA自留地 - 博客园 (cnblogs.com)
友晶科技FPGA开发板实现贪吃蛇游戏(八)——游戏控制之状态机设计 DE10-STANDARD、DE1-SOC、DE2-115 - Doreen的FPGA自留地 - 博客园 (cnblogs.com)
友晶科技FPGA开发板实现贪吃蛇游戏(七)食物(苹果)的产生 DE10-STANDARD、DE1-SOC、DE2-115 - Doreen的FPGA自留地 - 博客园 (cnblogs.com)
友晶科技FPGA开发板实现贪吃蛇游戏(六)VGA 驱动模块色块显示 DE10-STANDARD、DE1-SOC、DE2-115 - Doreen的FPGA自留地 - 博客园 (cnblogs.com)
友晶科技FPGA开发板实现贪吃蛇游戏(五)VGA 驱动模块字符显示 DE10-STANDARD、DE1-SOC、DE2-115 - Doreen的FPGA自留地 - 博客园 (cnblogs.com)
友晶科技FPGA开发板实现贪吃蛇游戏(四)VGA 驱动模块图片显示 DE10-STANDARD、DE1-SOC、DE2-115 - Doreen的FPGA自留地 - 博客园 (cnblogs.com)
友晶科技FPGA开发板实现贪吃蛇游戏(三)记分模块 DE10-STANDARD、DE1-SOC、DE2-115 - Doreen的FPGA自留地 - 博客园 (cnblogs.com)
友晶科技FPGA开发板实现贪吃蛇游戏(二)数码管驱动模块 DE10-STANDARD、DE1-SOC、DE2-115 - Doreen的FPGA自留地 - 博客园 (cnblogs.com)
友晶科技FPGA开发板实现贪吃蛇游戏(一)——整体描述 DE10-Standard、DE1-SOC、DE2-115 - Doreen的FPGA自留地 - 博客园 (cnblogs.com)