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

