我正在尝试解决这个 HDLBits 问题,我的问题在提交以下代码时出现:
module top_module (
input clk,
input reset,
input [7:0] d,
output [7:0] q
);
genvar i;
generate for(i = 0; i < 8; i = i + 1)
begin: DFF
dFlipFlop instance_i(.clk(clk), .reset(reset), .d(d[i]), .q(q[i]));
end
endgenerate
endmodule
module dFlipFlop(input clk, input reset, input d, output q);
always@(negedge clk) begin
if(reset) q <= 8'h34;
else q <= d;
end
endmodule
提交此代码会给我提示“您的重置似乎不起作用。”这是一次不成功的尝试。
通过删除生成循环的使用并实现单个 8 位触发器来修复此错误,如下所示:
module top_module (
input clk,
input reset,
input [7:0] d,
output [7:0] q
);
always@(negedge clk) begin
if(reset) q <= 8'h34;
else q <= d;
end
endmodule
为什么使用生成循环会导致问题?
问题不在于
generate
循环。
问题出在这一行:
if(reset) q <= 8'h34;
当您声明
output q
时,q
是 1 位宽,但您尝试为其分配 8 位值 (8'h34)。这与8b0011_0100
相同。 q
始终分配给值的 LSB,即 0。忽略 7 个 MSB。