游戏的计分模块(score_ctrl.v)完成的任务是:蛇每吃掉一个苹果,计数器增加1,直到计数到100结束。由于计数器里面的数据是二进制的,无法直接输出到数码管显示,还需要进行二进制转十进制。

 

我们在代码里面直接用除法取余的方法将分数的个位、十位和百位分离出来:

    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;        //算出十进制数的百位

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

 

游戏的计分模块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)
            bin_data[3:0] <= bin_data[3:0] + 1;
        else begin
            bin_data[3:0] <= 0;
            if(bin_data[7:4] < 9)
                bin_data[7:4] <= bin_data[7:4] + 1;
            else begin
                bin_data[7:4] <= 0;
                if(bin_data[11:8] < 9)
                    bin_data[11:8] <= bin_data[11:8] + 1;
                else begin
                    bin_data[11:8] <= 0;
                end
            end
        end
    end

 

友晶科技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)