verilog hdl设计21点游戏

verilog hdl硬件描述语言设计一个游戏机,初始显示0;当按下按钮时,随机产生1~13之间的数字,并显示当前的数字和点数叠加的结果。要求:数码管扫描显示当前的数字和点叠加的结果;若电路叠加的结果未超过21,则可以继续按键发牌;达到21点,直接提示为赢;超过21点,直接提示失败。"

简单的Verilog HDL代码实现游戏机的设计

module game_machine(
    input clk, // 时钟信号
    input rst, // 复位信号
    input btn, // 按键信号
    output reg [3:0] num // 数码管显示信号
);

reg [3:0] point; // 点数
reg [3:0] card; // 当前的牌

// 状态机定义
parameter IDLE = 2'b00; // 空闲状态
parameter DEAL = 2'b01; // 发牌状态
parameter WIN = 2'b10; // 赢状态
parameter LOSE = 2'b11; // 输状态

reg [1:0] state; // 状态寄存器

// 时序逻辑
always @(posedge clk, posedge rst) begin
    if (rst) begin
        state <= IDLE;
        num <= 4'b0000;
        point <= 4'b0000;
        card <= 4'b0000;
    end else begin
        case (state)
            IDLE: begin
                if (btn) begin
                    card <= $random % 13 + 1; // 随机产生1~13之间的数字
                    point <= point + card; // 点数叠加
                    state <= DEAL;
                end
            end
            DEAL: begin
                num <= card; // 显示当前的数字
                if (point > 21) begin
                    state <= LOSE; // 超过21点,直接提示失败
                end else if (point == 21) begin
                    state <= WIN; // 达到21点,直接提示为赢
                end else if (btn) begin
                    card <= $random % 13 + 1; // 继续发牌
                    point <= point + card;
                end
            end
            WIN: begin
                num <= 4'b1010; // 显示“赢”
                if (!btn) begin
                    state <= IDLE;
                    point <= 4'b0000;
                end
            end
            LOSE: begin
                num <= 4'b1100; // 显示“输”
                if (!btn) begin
                    state <= IDLE;
                    point <= 4'b0000;
                end
            end
        endcase
    end
end

endmodule