You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ALTERA DE2开发板Verilog猜数字游戏按键冲突问题求助

解决ALTERA DE2猜数字游戏中Submit与Count按键冲突问题

我仔细看了你在ALTERA DE2开发板上实现的猜数字游戏代码,现在Submit和Count按键不能同时工作的问题,根源其实很清晰——你错误地把两个按键的与操作作为了唯一的触发信号,导致只有两个按键同时按下时逻辑才会运行,单独按其中一个根本触发不了对应的操作。另外代码里还有一些分支逻辑的小错误,我帮你一起修正了。

核心问题分析

你定义了wire trig = (count & submit);,然后把negedge trig作为always块的敏感信号之一。这就意味着,只有当count和submit同时为高(假设按键是高电平有效)时,这个always块才会执行。但实际你需要的是Count按键负责递增猜测数字,Submit按键负责提交猜测并判断结果,这两个操作应该是独立触发的,不能绑定在一起。

另外还有两个小问题:

  • red_state_value是1位寄存器,但你用了if(red_state_value == 2'b01)这种2位比较,属于类型不匹配,会导致逻辑错误。
  • 部分else分支嵌套混乱,导致一些状态转换逻辑被错误覆盖。

修改后的完整代码

module test2 ( 
    input [2:0] answer_pin, 
    input count, 
    input submit, 
    input reset, 
    output reg [6:0] phase, 
    output reg [6:0] answer, 
    output reg [6:0] red_state, 
    output reg [6:0] red_score, 
    output reg [6:0] blue_state, 
    output reg [6:0] blue_score 
); 

reg [2:0] count_value;
reg [1:0] phase_value;
reg red_state_value;
reg [1:0] red_score_value;
reg blue_state_value;
reg [1:0] blue_score_value;

// 用按键边沿触发,支持count和submit独立工作
always @(negedge reset or posedge count or posedge submit) begin
    if (~reset) begin
        phase_value <= 2'b01;
        blue_state_value <= 1'b0;
        blue_score_value <= 2'b00;
        red_state_value <= 1'b1;
        red_score_value <= 2'b00;
        count_value <= 3'b000;
    end 
    // 处理Count按键:递增猜测数字,仅在非结束状态生效
    else if(posedge count) begin
        if(phase_value != 2'b00) begin
            if(count_value == 3'b111) begin
                count_value <= 3'b000;
            end else begin
                count_value <= count_value + 1'b1;
            end
        end
    end
    // 处理Submit按键:提交猜测并判断结果
    else if(posedge submit) begin
        if(phase_value != 2'b00) begin
            if(phase_value == 2'b01) begin
                // 当前是红方回合(red_state_value=1)
                if(red_state_value == 1'b1) begin
                    if(answer_pin == count_value) begin
                        // 红方猜对,蓝方得分
                        if(blue_score_value == 2'b10) begin
                            blue_score_value <= blue_score_value + 1'b1;
                            phase_value <= 2'b00; // 游戏结束
                        end else begin
                            blue_score_value <= blue_score_value + 1'b1;
                            red_state_value <= 1'b0;
                            blue_state_value <= 1'b1;
                            count_value <= 3'b000;
                        end
                    end else begin
                        // 红方猜错,红方得分
                        if(red_score_value == 2'b10) begin
                            red_score_value <= red_score_value + 1'b1;
                            phase_value <= 2'b00; // 游戏结束
                        end else begin
                            red_score_value <= red_score_value + 1'b1;
                            red_state_value <= 1'b0;
                            blue_state_value <= 1'b1;
                            count_value <= 3'b000;
                        end
                    end
                end 
                // 当前是蓝方回合(blue_state_value=1)
                else if(blue_state_value == 1'b1) begin
                    if(answer_pin == count_value) begin
                        // 蓝方猜对,红方得分
                        if(red_score_value == 2'b10) begin
                            red_score_value <= red_score_value + 1'b1;
                            phase_value <= 2'b00; // 游戏结束
                        end else begin
                            red_score_value <= red_score_value + 1'b1;
                            red_state_value <= 1'b1;
                            blue_state_value <= 1'b0;
                            count_value <= 3'b000;
                        end
                    end else begin
                        // 蓝方猜错,蓝方得分
                        if(blue_score_value == 2'b10) begin
                            blue_score_value <= blue_score_value + 1'b1;
                            phase_value <= 2'b00; // 游戏结束
                        end else begin
                            blue_score_value <= blue_score_value + 1'b1;
                            red_state_value <= 1'b1;
                            blue_state_value <= 1'b0;
                            count_value <= 3'b000;
                        end
                    end
                end
                phase_value <= 2'b01; // 保持回合状态,等待下一次操作
            end
        end
    end
end

// 七段码译码逻辑保持不变
always @(*) begin
    case(answer_pin)
        3'b000: answer=7'b1000000;
        3'b001: answer=7'b1111001;
        3'b010: answer=7'b0100100;
        3'b011: answer=7'b0110000;
        3'b100: answer=7'b0011001;
        3'b101: answer=7'b0010010;
        3'b110: answer=7'b0000010;
        3'b111: answer=7'b1011000;
        default: answer=7'b1000000;
    endcase

    case(red_state_value)
        1'b1: red_state = 7'b0111111;
        1'b0: red_state = 7'b1111111;
        default: red_state=7'b0111111;
    endcase

    case(blue_state_value)
        1'b1: blue_state = 7'b0111111;
        1'b0: blue_state = 7'b1111111;
        default: blue_state = 7'b1111111;
    endcase

    case(red_score_value)
        2'b00: red_score = 7'b1000000;
        2'b01: red_score = 7'b1111001;
        2'b10: red_score = 7'b0100100;
        2'b11: red_score = 7'b0110000;
        default: red_score= 7'b1000000;
    endcase

    case(blue_score_value)
        2'b00: blue_score = 7'b1000000;
        2'b01: blue_score = 7'b1111001;
        2'b10: blue_score = 7'b0100100;
        2'b11: blue_score = 7'b0110000;
        default: blue_score= 7'b1000000;
    endcase

    case(phase_value)
        2'b00: phase = 7'b1000000;
        2'b01: phase = 7'b1111001;
        2'b10: phase = 7'b0100100;
        default: phase= 7'b1111001;
    endcase
end

endmodule

关键修改点说明

  1. 拆分按键触发逻辑:把count和submit的边沿(这里用posedge,如果你的按键是低电平有效可以改成negedge)直接加入敏感列表,两个按键可以独立触发对应的操作,互不干扰。
  2. 修正信号比较错误:把red_state_value == 2'b01改成red_state_value == 1'b1,解决1位和2位信号类型不匹配的问题。
  3. 梳理分支逻辑:重新整理了Submit按键的判断分支,明确区分红方/蓝方回合的猜对/猜错逻辑,避免嵌套混乱导致的逻辑覆盖错误。
  4. 独立处理Count按键:Count按键仅负责递增猜测数字,且只在游戏未结束时生效,逻辑更清晰。

内容的提问来源于stack exchange,提问作者Seung Joon Park

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 07:05:20