HDLBits考题m2014_q6c代码异常:Y2、Y4始终接地求助
解决HDLBits Exams/m2014_q6c输出Y2、Y4始终为GND的问题
错误原因分析
你的代码存在两个核心问题,直接导致Y2和Y4永远为低电平:
- 参数定义未指定基数:
A = 000001这类写法会被解析为十进制数(实际值为1),而非预期的6位二进制1-hot编码。同时next_state被定义为3位寄存器,与6位宽度的参数不匹配,赋值时会被截断,导致next_state永远无法等于6位的B或D。 - 状态变量位宽不匹配:输入
y是6位1-hot状态编码,next_state却定义为3位,与状态编码的位宽完全不符,后续next_state == B这类比较永远不成立。
修正后的代码
module top_module ( input [6:1] y, input w, output Y2, output Y4); // 明确指定6位二进制1-hot编码的状态参数 parameter A = 6'b000001, B = 6'b000010, C = 6'b000100, D = 6'b001000, E = 6'b010000, F = 6'b100000; // next_state位宽与状态参数、输入y保持一致(6位) reg [5:0] next_state; always @(*) begin casez(y) 6'b000001 : next_state = w ? A : B; 6'b00001z : next_state = w ? D : C; 6'b0001zz : next_state = w ? D : E; 6'b001zzz : next_state = w ? A : F; 6'b01zzzz : next_state = w ? D : E; 6'b1zzzzz : next_state = w ? D : C; default : next_state = A; endcase end assign Y2 = (next_state == B); assign Y4 = (next_state == D); endmodule
额外说明
- 状态参数必须明确指定基数(
6'b),确保是6位二进制1-hot编码,避免十进制数值解析错误。 next_state的位宽需与输入y、状态参数一致,保证状态赋值和比较的正确性。- 组合逻辑块中建议使用阻塞赋值(
=)而非非阻塞赋值(<=),这是Verilog组合逻辑的最佳实践。
内容的提问来源于stack exchange,提问作者s s
相关产品推荐
相关产品推荐

