This is an old revision of the document!
Prin asamblarea pașilor de mai sus obținem un schelet de cod minimal pentru un FSM
Prin asamblarea pașilor de mai sus obținem un schelet de cod minimal pentru un FSM
module BasicFsm ( // ------------------------------------------------------------ // Ieșiri // ------------------------------------------------------------ output wire Output1 , output wire Output2 , output reg [2:0] Status // ------------------------------------------------------------ // Intrări // ------------------------------------------------------------ input wire Clock , input wire Reset , input wire A , input wire B , // ------------------------------------------------------------ ); // -------------------------------------------------------------------- // Codificarea stărilor // -------------------------------------------------------------------- localparam STATE_Initial = 3’d0 , STATE_1 = 3’d1 , STATE_2 = 3’d2 , STATE_3 = 3’d3 , STATE_4 = 3’d4 , STATE_5_PlaceHolder = 3’d5 , STATE_6_PlaceHolder = 3’d6 , STATE_7_PlaceHolder = 3’d7; // -------------------------------------------------------------------- // -------------------------------------------------------------------- // Regiștri pentru memorarea stărilor // -------------------------------------------------------------------- reg [2:0] CurrentState ; reg [2:0] NextState ; // -------------------------------------------------------------------- // -------------------------------------------------------------------- // Ieșiri // -------------------------------------------------------------------- // ieșiri pe 1 bit assign Output1 = ( CurrentState == STATE_1 ) | ( CurrentState == STATE_2 ); assign Output2 = ( CurrentState == STATE_2 ); // ieșiri pe mai mulți biți (aici doar Status) always@ ( * ) begin Status = 3’b000 ; case ( CurrentState ) STATE_2 : begin Status = 3’b010 ; end STATE_3 : begin Status = 3’b011 ; end endcase end // -------------------------------------------------------------------- // -------------------------------------------------------------------- // Tranziție sincrona: bloc always@(posedge Clock) // -------------------------------------------------------------------- always@ ( posedge Clock ) begin if ( Reset ) begin CurrentState <= STATE_Initial ; else begin CurrentState <= NextState ; end end // -------------------------------------------------------------------- // -------------------------------------------------------------------- // Tranziție condiționată: bloc always@ ( * ) // -------------------------------------------------------------------- always@ ( * ) begin NextState = CurrentState ; case ( CurrentState ) begin STATE_Initial : begin NextState = STATE_1 ; end STATE_1 : begin if (A & B) begin NextState = STATE_2 ; end end STATE_2 : begin if (A) begin NextState = STATE_3 ; end end STATE_3 : begin if (!A & B) begin NextState = STATE_Initial ; end else begin if (A & !B) begin NextState = STATE_4 ; end end end STATE_4 : begin // ---------------------------------------------------------------------------- //In mod normal ar trebui ca aici sa existe macar o tranzitie inapoi in STATE_4 //sau in STATE_INITIAL //dar am lasat gol pentru a reflecta diagrama pe care o modelam //!!!BAD EXAMPLE!!! Asigurati-va ca exista tranzitii din fiecare stare // ---------------------------------------------------------------------------- end //Stări pentru tratarea erorilor //Dacă automatul ajunge în aceste stări se va reseta. STATE_5_PlaceHolder : begin NextState = STATE_Initial ; end STATE_6_PlaceHolder : begin NextState = STATE_Initial ; end STATE_7_PlaceHolder : begin NextState = STATE_Initial ; end endcase end // -------------------------------------------------------------------- endmodule