Fehler in Bezug auf Skalardraht „Zurücksetzen“ ist kein zulässiger Registrierungs- oder Variablenwert

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?

Sie haben resetals bezeichnet input, aber dann versuchen Sie, ihm einen Wert zuzuweisen ( reset = 1). Das ist, was der Fehler anzeigt.

Antworten (1)

Wenn Ihre Zustandsmaschine gesetzt werden muss , müssen Sie sie als eines Ihres Moduls resetangeben . output reg resetAusgä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 .

Ich habe die Reset-Reg oder -Draht nie als Ausgang betrachtet. Meistens sehe ich im Unterricht, dass das Zurücksetzen als Eingabe verwendet wird, aber ich werde den Code später konfigurieren und sehen, ob das funktioniert hat.
@ user548010, Wenn es keine Ausgabe ist, warum setzt Ihr Code es dann auf einen bestimmten Wert? (Ich frage hauptsächlich, weil ich vielleicht nicht verstanden habe, was der Code eigentlich tun soll)