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
Ihre logic
Aufzählung hat 3 Bits, aber die Aufzählung enthält 9 Werte. Sie müssen mehr Bits für logic
die Enumeration bereitstellen oder die Anzahl der Werte verringern.
Michel
Elliot Alderson
Michel