当前位置:   article > 正文

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

fpga计分器

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是二进制的,无法直接输出到数码管显示,可先用除法取余的方法将分数的百位、十位和个位分离出来: 

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

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

计分模块完整代码

计分模块RTL视图:

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

  1. //数码管计分模块
  2. module score_ctrl
  3. (
  4. input clk,//25MHz
  5. input rst_n,//系统复位
  6. input add_cube,//蛇吃掉一个苹果,该信号为高
  7. input [1:0]game_status,//游戏状态
  8. output [11:0]bcd_data//计分
  9. );
  10. reg [7:0]bin_data;//二进制计分寄存器,最小值0000 0000 ,最大值0110 0100(也就是十进制100
  11. localparam RESTART = 2'b00;//游戏的第1个状态是重启
  12. always@(posedge clk or negedge rst_n) begin
  13. if(!rst_n) //复位时分数归零
  14. bin_data <= 0;
  15. else if(game_status==RESTART) //重启状态下分数归零
  16. bin_data <= 0;
  17. else if(add_cube==1 && bin_data < 8'd100) //当分数不超过100的时候,蛇每吃掉一个苹果计数器就+1
  18. bin_data <= bin_data + 1;
  19. else
  20. bin_data <= bin_data;
  21. end
  22. assign bcd_data[3:0] = bin_data%10; //算出十进制数的个位
  23. assign bcd_data[7:4] = (bin_data/10)%10; //算出十进制数的十位
  24. assign bcd_data[11:8] = (bin_data/100)%10; //算出十进制数的百位
  25. endmodule

二进制码转换比较

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

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

  1. if(add_cube) begin
  2. if(bin_data[3:0] < 9) begin
  3. bin_data[3:0] <= bin_data[3:0] + 1;
  4. end
  5. else begin
  6. bin_data[3:0] <= 0;
  7. if(bin_data[7:4] < 9) begin
  8. bin_data[7:4] <= bin_data[7:4] + 1;
  9. end
  10. else begin
  11. bin_data[7:4] <= 0;
  12. if(bin_data[11:8] < 9) begin
  13. bin_data[11:8] <= bin_data[11:8] + 1;
  14. end
  15. else begin
  16. bin_data[11:8] <= 0;
  17. end
  18. end
  19. end
  20. 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时代码无需改变,只需修改引脚分配即可。

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

闽ICP备14008679号