Ich erhalte einen Fehler in Verilog mit einem Eingabeparameter, der nicht als gültige Registrierung oder als variabler lvalue erkannt wird. Ich hatte das gleiche Problem mit der Ausgabe im Modul, aber es wurde behoben, indem ich es als Reg bezeichnete. Es ist der einzige Fehler in meinem Code und er tritt nur an der Input-Reset-Variablen im Always-Block auf.
module lasersystem(input clk, input reset, output reg click
);
reg [1:0] next_state = 2'b00;
localparam off = 2'b00, start = 2'b01, on = 2'b10;
reg [32:0] counter;
always @ (clk)
begin
case (next_state)
off: if (clk == 0) begin
next_state = off;
reset = 1;
counter = 32'd0;
click = 0;
end
else if (clk == 1) begin
next_state = start;
reset = 1;
counter = 32'd0;
click = 0;
end
start: if (clk == 1) begin
reset = 0;
click = 0;
counter = 32'd0;
next_state = on;
end
else begin
next_state = on;
reset = 0;
counter = 32'd0;
click = 0;
end
on: if (clk == 1) begin
reset = 0;
click = 1;
if (counter == 32'd249999999) begin
next_state = off;
end
else if (counter != 32'd249999999)
next_state = on;
end
default: next_state = off;
endcase
end
always @ (posedge clk) begin
case (reset)
1: if (next_state == off) while (counter > 32'd0 && counter < 32'd250000000) counter = counter - 32'd1;
0: if (next_state == on) while (counter > 32'd0 && counter < 32'd250000000) counter = counter + 32'd1;
default: counter = 32'd0;
endcase
end
endmodule
Warum passiert das?
Wenn Ihre Zustandsmaschine gesetzt werden muss , müssen Sie sie als eines Ihres Moduls reset
angeben . output reg reset
Ausgänge sind standardmäßig Netze, es sei denn, Sie fügen einen Datentyp wie hinzu reg
. Dann werden sie wie Variablen behandelt, die von Ihrem ` always1-Block prozedural zugewiesen werden können .
awjlogan
reset
als bezeichnetinput
, aber dann versuchen Sie, ihm einen Wert zuzuweisen (reset = 1
). Das ist, was der Fehler anzeigt.