Wie funktioniert eine einfache state machine, Blick in Verilog?
Ich versuche zu konvertieren ein Flussdiagramm einfache state machine
in Verilog
code.
Aber ich bin irgendwie fest mit dem folgenden, und so habe ich kaum Kenntnisse in Verilog ich bin wahrscheinlich etwas fehlt.
Statemachine erkennt für einen input-stream von 0 and 1
, wenn die Anzahl der 1
s geteilt durch 3 (oder einfach: wenn es 3 mal die Zahl 1).
module example (
input clk,
input rst,
input input1,
output output
);
reg state;
reg nextstate;
localparam state2 = 3'd0;
localparam state1 = 3'd1;
localparam state0 = 3'd2;
always @(posedge clk or posedge rst) begin
if (rst)
state <= state0;
else
state <= nextstate;
end
always @* begin
case(state)
state0: begin
if(input1)
nextstate = state1;
end
state2: begin
if(input1)
nextstate = state0;
end
state1: begin
if(input1)
nextstate = state2;
end
default: nextstate = state0;
endcase
end
always @* begin
output1 = state0 & input1;
end
endmodule
Ich bin mir nicht sicher:
-
muss ich definieren die Eingänge + Ausgänge als
reg
oderwire
? Oder istinput
undoutput
! ausreichend? -
muss ich eine Vektor-dimension für die
reg state, nextstate
? Wenn ja, wie weiß ich, welche Größe zu wählen? -
kann, Schreibe ich diese Art von Behauptungen, die sich am Ende wie
state0 & input1
? Oder sollte ichstate = state0 & input1 = ??
- ja, was?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Eingänge sind immer die Drähte, obwohl es eigentlich egal ist, da Sie nicht Ihnen zuweisen. Ausgänge sind Leitungen standardmäßig, aber Sie können auch erklären
output reg
wenn Sie möchten, dass ein register statt.Ja, Sie müssen erklären, eine dimension oder anderes Ihr design wird katastrophal scheitern, wenn die verilog-lautlos schneidet alle Ihre Mitgliedstaaten
0
oder1
. Die Breite der Mitgliedstaaten sollte die gleiche Breite der localparams, die Sie verwenden, um zu definieren, den Status-Namen, oder mehr allgemein die Breite solltelog2(number of input states)
.Ich glaube nicht, dass dies ist, was Sie wollen. State0 ist einfach eine Konstante Zahl. Wenn Sie wissen wollen , wenn der Zustand der Maschine ist in state0, dann müssen Sie vergleichen den aktuellen Zustand mit der Konstanten state0. Auch werden Sie wahrscheinlich nicht wollen, eine bitweise UND hier, so verwenden Sie die regulären und die
&&
. Sollte sein:number of input states
? Wäre diese 3 in meinem Fall (input1, clock, reset), und damit die dimension vector wäre[1:0]
? Weiter: wenn ich davon ausgehe meine Staaten sind immer entweder high oder low (1 oder 0), kann ich dann vernachlässigen Sie die Vektor-dimension für dielocalparams
?total number of inputs + outputs
, aber nurtotal number of inputs, thus any signal that write "input X,"
, richtig?Obwohl es zu spät ist, aber ich habe auf die band wagon lernen Verilog und beschlossen, nehmen Sie einen Schuss auf Ihre Anfrage. Ich schrieb das design-Modul und auch ein Prüfstand für es. Dies funktioniert nach Ihren Erwartungen.