SystemVerilog Code für eine Schlosskombination (Finite State Machines)

Ich schreibe Code für eine Türschlosskombination. Meine Eingaben sind b0, b1, b2 und b3, die den Tasten entsprechen, um den Code zum Entriegeln einer Tür einzugeben. Der Code zum Aufschließen dieser bestimmten Tür lautet b2 -> b2 ---> b3 ---> b1.

Zwischen den Übergängen muss der Code jedoch berücksichtigen, dass der Benutzer seinen Finger von der Taste nimmt, bevor er mit dem Drücken der nächsten Taste für den Türcode fortfährt.

dh. b2 --> loslassen --> b2 --> loslassen --> b2 --> loslassen --> b3 ---> loslassen --> beliebige Taste ---> zurücksetzen. Drückt der Benutzer dabei den falschen Wert, muss der Zustand wieder auf Reset gehen.

Das Bild unten ist mein Code, aber die Synthese schlägt fehl. Ich habe die nächste Zustandslogik meines Codes durchgesehen, aber ich kann anscheinend kein Problem damit finden, und ich erhalte auch keine Syntaxfehler.

Ich freue mich über jede Hilfe, vielen Dank für Ihre Zeit.

https://i.stack.imgur.com/8zBji.png

 module Lock(input logic clk, reset, b0, b1, b2, b3,
 output logic unlock);

typedef enum logic[2:0] {s0, s1, s2, s3, s4, s5, s6, s7, s8} statetype;
statetype state, nextstate;



//state register
always_ff @(posedge clk, posedge reset)
    if (reset) state <= s0;
    else state<=nextstate; 

//next state logic    
always_comb
case (state)
s0: if (b2 & ~b1 & ~b0 & ~b3) nextstate = s1;
    else if (~(b2 & ~b1 & ~b0 & ~b3))nextstate = s0;//ie. if did not press the corrrect button (b2)

s1: if (~b2 & ~b1 & ~b0 & ~b3) nextstate = s2; //. ie move a state ahead when you release the b2
    else if (b2 & ~b3 & ~b1 & ~b0) nextstate = s1; //ie. If user is holdig down the button b2.

s2: if (b2 & ~b1 & ~b0 & ~b3) nextstate = s3; //entering the second digit of the door code
 else if(~(  b2 & ~b1 & ~b0 & ~b3))nextstate = s0; //back to reset if the second digit inserted is not b2
 else if  ( ~ b2 & ~b3 & ~b1 & ~b0) nextstate=s2;//e. if still havent pressed a button, stay in state s2

s3: if (~b2 & ~b1 & ~b0 & ~b3) nextstate = s4; // ie. when releasing button b2
     else if (b2 & ~b1 & ~b0 & ~b3) nextstate = s3;//ie. if holding down b2 still, stay in s3.

s4: if (b3 & ~b0 & ~b1 & ~b2) nextstate = s5;
   else if (~(b3 & ~b0 & ~b1 & ~b2))nextstate = s0;
    else if  ( ~ b2 & ~b3 & ~b1 & ~b0) nextstate=s4;

s5: if (~b2 & ~b1 & ~b0 & ~b3) nextstate = s6;
    else if (b3 & ~ b0 & ~ b1 & ~b2) nextstate=s5;

s6: if (b1 & ~b0 & ~b1 & ~b2 & ~b3) nextstate=s7;
    else if (~ (b1 & ~b0 & ~b1 & ~b2 & ~b3))nextstate=s0;
     else if  ( ~ b2 & ~b3 & ~b1 & ~b0) nextstate=s6;

s7: if (~b2 & ~b1 & ~b0 & ~b3) nextstate = s8;
    else if (b1 & ~b0 & ~b1 & ~b2 & ~b3) nextstate=s7;

s8: if (b0 + b1 + b2 + b3) nextstate = s0; //ie after unlocking, if press any button, return back to reset. 

endcase  

//output logic
assign unlock = (state==s7);

endmodule
PS. Im ersten Fall S0, im Sonst wenn, der nächste Zustand =S0, nicht S1. Entschuldigung. Ich habe das in meinem Code behoben, aber es wird immer noch nicht synthetisiert,
Bitte fügen Sie Ihren Code zur Frage hinzu, anstatt einen Screenshot bereitzustellen. Woher wissen Sie, dass "Synthese versagt"? Wenn Sie keine Syntaxfehler erhalten, erhalten Sie andere Fehler oder Meldungen? Haben Sie eine Testbench geschrieben und überprüft, ob Ihr Design in der Simulation funktioniert?
Hallo. Ich habe meine Testbench ausgeführt, und der Fehler, den ich erhalte, lautet: Wert „3'b000“ für Enum „s8“ wird bereits von Enum „s0“ verwendet

Antworten (1)

Ihre logicAufzählung hat 3 Bits, aber die Aufzählung enthält 9 Werte. Sie müssen mehr Bits für logicdie Enumeration bereitstellen oder die Anzahl der Werte verringern.

Danke schön. Ich habe die Anzahl der Bits geändert und es wurde erfolgreich synthetisiert. Wenn ich jedoch versuche, den Bitstream zu generieren, erhalte ich nur eine Fehlermeldung, die besagt, dass er nicht generiert werden kann. Würde das wieder etwas mit meinem Code zu tun haben?
Wenn es hilft, zeigt mir das Protokoll nur einige Spitzen- und Verstärkungswerte.
Wie immer müssen Sie den genauen Text von Fehlermeldungen angeben.