多驱动网络,或 reg 未被驱动
multi-driven net, or reg not being driven
我正在完成一项任务,我需要创建一个累积奖金游戏。但是我在驱动控制获胜条件的寄存器时遇到了问题,我不知道为什么。据我所知,每当我将开关拨到向上位置时, always@(posedge zero) 块应该能够 运行 。然后,只要在同一时刻出现正确的热寄存器值,就应该能够设置 win 寄存器。然而,这种情况并非如此。似乎什么都没有发生,我不确定为什么。我已经尝试 运行 将 always 块设置为不同的敏感度,但似乎没有任何效果。也许我只是误解了块的工作方式或开关的工作方式,我们将不胜感激。
module jackpot(
input [3:0] SWITCHES,
output [3:0] LEDS,
input CLOCK,
input reset
);
reg [3:0] hot = 4'd1;
reg win;
wire clk, zero, one, two, three;
Clock_Div CDD (CLOCK, clk);
assign LEDS[2:0] = hot[2:0];
assign zero = SWITCHES[0];
assign one = SWITCHES[1];
assign two = SWITCHES[2];
assign three = SWITCHES[3];
assign LEDS[3] = zero;
initial begin
win <= 1'b0;
end
always @(posedge zero) begin
if(hot[0] && zero)
win <= 1'd1;
end
always @(posedge clk) begin
if (reset == 1'b1) begin
hot <= 4'd1;
win <= 1'd0;
end
else if(win == 1'b1) begin
hot <= 4'b1111;
end
else begin
if(hot == 4'b1000) begin
hot <= 4'b0001;
end
else begin
hot <= hot << 1;
end
end
end
endmodule
多亏了 Serge 的评论,我才意识到这个问题。正如他的评论所说,从多个 always 块中驱动一个寄存器会引发严重警告,Vivado 会选择其中一个块来使用另一个块。一旦我确定将一个 reg 隔离为一个 always 块,行为开始看起来像我预期的那样。这一定是在 class 期间被掩盖的事情,或者我没有足够注意。
我正在完成一项任务,我需要创建一个累积奖金游戏。但是我在驱动控制获胜条件的寄存器时遇到了问题,我不知道为什么。据我所知,每当我将开关拨到向上位置时, always@(posedge zero) 块应该能够 运行 。然后,只要在同一时刻出现正确的热寄存器值,就应该能够设置 win 寄存器。然而,这种情况并非如此。似乎什么都没有发生,我不确定为什么。我已经尝试 运行 将 always 块设置为不同的敏感度,但似乎没有任何效果。也许我只是误解了块的工作方式或开关的工作方式,我们将不胜感激。
module jackpot(
input [3:0] SWITCHES,
output [3:0] LEDS,
input CLOCK,
input reset
);
reg [3:0] hot = 4'd1;
reg win;
wire clk, zero, one, two, three;
Clock_Div CDD (CLOCK, clk);
assign LEDS[2:0] = hot[2:0];
assign zero = SWITCHES[0];
assign one = SWITCHES[1];
assign two = SWITCHES[2];
assign three = SWITCHES[3];
assign LEDS[3] = zero;
initial begin
win <= 1'b0;
end
always @(posedge zero) begin
if(hot[0] && zero)
win <= 1'd1;
end
always @(posedge clk) begin
if (reset == 1'b1) begin
hot <= 4'd1;
win <= 1'd0;
end
else if(win == 1'b1) begin
hot <= 4'b1111;
end
else begin
if(hot == 4'b1000) begin
hot <= 4'b0001;
end
else begin
hot <= hot << 1;
end
end
end
endmodule
多亏了 Serge 的评论,我才意识到这个问题。正如他的评论所说,从多个 always 块中驱动一个寄存器会引发严重警告,Vivado 会选择其中一个块来使用另一个块。一旦我确定将一个 reg 隔离为一个 always 块,行为开始看起来像我预期的那样。这一定是在 class 期间被掩盖的事情,或者我没有足够注意。