Recibo un error en Verilog con un parámetro de entrada que no se reconoce como un registro legal o un valor l variable. Tuve el mismo problema con la salida en el módulo, sin embargo, se solucionó al etiquetarlo como reg. Es el único error en mi código y ocurre solo en la variable de reinicio de entrada en el bloque siempre.
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
¿Por qué pasó esto?
Si su máquina de estado necesita configurarse reset
, entonces debe especificarlo como parte output reg reset
de su módulo. Las salidas predeterminadas son redes a menos que agregue un tipo de datos como reg
. Luego, se tratan como variables que se pueden asignar de forma procesal desde el bloque ` always1.
awjlogan
reset
comoinput
pero luego intenta asignarle un valor (reset = 1
). Eso es lo que está marcando el error.