【友晶科技】基于FPGA的贪吃蛇游戏设计(三)——计分模块

12 篇文章 2 订阅
12 篇文章 1 订阅

DE10-Standard/DE1-SoC/DE2-115

计分模块任务一

游戏计分模块(score_ctrl.v)完成的任务之一:蛇每吃掉一个食物,计数器值增加1,直到计数到100结束。

该功能直接用一个计数器电路实现。

(注:在食物产生模块apple_generate.v中,蛇每吃掉一个食物,add_cube信号被置1。)

计分模块任务二

游戏计分模块(score_ctrl.v)完成的任务之二:将计数器数据bin_data转成BCD码形式输出。

用数码管显示一个十进制数的时候,每个数码管只能显示十进制数的一个位,比如游戏中显示分数范围0-100,需要三个数码管,依次显示十进制的百位,十位,个位。计数器数据bin_data是二进制的,无法直接输出到数码管显示,可先用除法取余的方法将分数的百位、十位和个位分离出来: 

assign bcd_data[3:0]  = bin_data%10;        //算出十进制数的个位
assign bcd_data[7:4]  = (bin_data/10)%10;   //算出十进制数的十位
assign bcd_data[11:8] = (bin_data/100)%10;  //算出十进制数的百位

然后在顶层模块,将分数的百位、十位和个位分配到对应的数码管上进行显示:

计分模块完整代码

计分模块RTL视图:

计分模块score_ctrl.v完整代码如下:

//数码管计分模块
module score_ctrl
(
    input clk,//25MHz
    input rst_n,//系统复位
    
    input add_cube,//蛇吃掉一个苹果,该信号为高
    input [1:0]game_status,//游戏状态

    output [11:0]bcd_data//计分
);
    reg [7:0]bin_data;//二进制计分寄存器,最小值0000 0000 ,最大值0110 0100(也就是十进制100)

   localparam RESTART = 2'b00;//游戏的第1个状态是重启
    
    always@(posedge clk or negedge rst_n) begin
        if(!rst_n)                                          //复位时分数归零
            bin_data <= 0;
        else if(game_status==RESTART)                    //重启状态下分数归零
            bin_data <= 0;    
        else if(add_cube==1 && bin_data < 8'd100)            //当分数不超过100的时候,蛇每吃掉一个苹果计数器就+1 
            bin_data <= bin_data + 1;
        else 
            bin_data <= bin_data;
        end
    
    assign bcd_data[3:0]  = bin_data%10;                //算出十进制数的个位
    assign bcd_data[7:4]  = (bin_data/10)%10;           //算出十进制数的十位
    assign bcd_data[11:8] = (bin_data/100)%10;        //算出十进制数的百位

endmodule

二进制码转换比较

当然,使用除法和取余的代码看起来非常简洁,但很占用FPGA 的逻辑资源,这里用的是DE10-Standard开发板,逻辑资源充足(110K LEs), 但如果大家是移植到其他资源有限的开发板上,可以选择二进制转BCD码的算法(如加3移位法)以节省更多资源。

另外也可以直接将bin_data信号转成BCD码计数,代码如下:

if(add_cube) begin
  if(bin_data[3:0] < 9) begin
    bin_data[3:0] <= bin_data[3:0] + 1;
  end
        
  else begin
    bin_data[3:0] <= 0;
    if(bin_data[7:4] < 9) begin
      bin_data[7:4] <= bin_data[7:4] + 1;
    end
           
    else begin
      bin_data[7:4] <= 0;
      if(bin_data[11:8] < 9) begin
        bin_data[11:8] <= bin_data[11:8] + 1;
      end
              
      else begin
        bin_data[11:8] <= 0;
      end
    end
  end
end

贪吃蛇系列连载文章:

  ​
1. 基于FPGA的贪吃蛇游戏设计(一)

2. 基于FPGA的贪吃蛇游戏设计(二)——数码管驱动模块

3. 基于FPGA的贪吃蛇游戏设计(三)——计分模块

4. 基于FPGA的贪吃蛇游戏设计(四)——VGA驱动模块色块显示

5. 基于FPGA的贪吃蛇游戏设计(五)——VGA驱动模块字符显示

6. 基于FPGA的贪吃蛇游戏设计(六)——VGA驱动模块图片显示

7. 基于FPGA的贪吃蛇游戏设计(七)——食物(苹果)的产生

8. 基于FPGA的贪吃蛇游戏设计(八)——状态机设计

9. 基于FPGA的贪吃蛇游戏设计(九)——蛇身控制

关注“友晶Terasic”公众号可获取源码下载地址。

移植到DE1-SOC、DE2-115时代码无需改变,只需修改引脚分配即可。

  • 7
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值