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
soc/laboratoare/04/dfa_skel.1709210248.txt.gz · Last modified: 2024/03/10 22:20 (external edit)
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0