当前位置:网站首页>[conception de la machine d'état] Moore, Mealy State Machine, Three - stage, Two - stage, one - stage State Machine Writing Specification

[conception de la machine d'état] Moore, Mealy State Machine, Three - stage, Two - stage, one - stage State Machine Writing Specification

2022-06-28 23:15:00 Linest - 5

Table des matières

Introduction à la machine d'état

Type de machine d'état

Moore Type de machine d'état

Mealy Type de machine d'état

Processus de conception de la machine d'état

Distributeur automatique

Conception de la machine d'état:3 Segment(Recommandations)

Exemple

Exemple

Modification de la machine d'état :2 Segment

Exemple

Modification de la machine d'état :1 Segment(Soyez prudent.)

Exemple

Modification de la machine d'état :Moore Type

Exemple

Exemple


Introduction à la machine d'état

Machine à l'état fini(Finite-State Machine,FSM),Machine d'état abrégée,.Est un modèle mathématique qui représente des états finis et des comportements tels que les transitions et les actions entre ces états. La machine d'état n'est pas seulement un outil de description de circuit , C'est aussi une façon de penser. , Au niveau du système et dans la conception des circuits RTL Les niveaux sont largement utilisés .

Tout le monde dit que la machine d'état est FPGA L'âme du design , Voir son importance ,In Verilog Dans la conception, La machine d'état peut en fait être équivalente à if Déclarations et case Déclarations, Mais parce que dans certains cas, , Les états sont nombreux et complexes , C'est très gênant de sauter dans tous les états. ,Alors... La conception générale de la machine d'état est une méthode fiable et pratique .

Le Code de machine d'état canonique peut grandement améliorer l'efficacité de la conception , Réduire le temps de débogage tout en réduisant la possibilité d'erreurs d'état , Pour concevoir un système robuste .

Lors de la conception de la machine d'état , Il est préférable de satisfaire aux exigences suivantes: :

  • Méthode générale de conception, Conçu pour des machines d'état simples ou complexes ;
  • Les étapes sont claires et faciles à comprendre , Une seule question par étape ;
  • Code de machine d'état strict , Pas facile à faire des erreurs;
  • La machine d'état conçue a une structure simple et stable .

Type de machine d'état

Verilog La machine à l'état moyen est principalement utilisée pour la conception de la logique de synchronisation , L'état d'un circuit séquentiel capable de passer d'un état fini à l'autre selon les besoins et les règles . La direction de commutation de l'état dépend non seulement des valeurs d'entrée individuelles , Dépend également de l'état actuel . Les machines d'état peuvent être divisées en deux catégories :

  • Moore Machine d'état
  • Mealy Machine d'état

Moore Type de machine d'état

Moore La sortie de la machine d'état type n'est liée qu'à l'état actuel , Indépendant de l'entrée courante .

La sortie restera stable pendant un cycle d'horloge complet , Même si le signal d'entrée change , La production ne changera pas non plus . L'effet de l'entrée sur la sortie ne se reflète qu'au prochain cycle d'horloge .Et ça aussi. Moore Une caractéristique importante de la machine d'état type : Les entrées et les sorties sont isolées .

Mealy Type de machine d'état

Mealy Sortie de la machine d'état type , Non seulement par rapport à l'état actuel , Dépend également du signal d'entrée actuel .

Mealy La sortie de la machine d'état type est modifiée immédiatement après le changement du signal d'entrée , Et le changement d'entrée peut se produire dans n'importe quel état du cycle d'horloge .Donc,, Dans la même logique ,Mealy La réponse de sortie de la machine d'état type à l'entrée sera Moore La machine d'état de type a un cycle d'horloge plus tôt .

Processus de conception de la machine d'état

Tracer le diagramme de transfert d'état en fonction des exigences de conception , Déterminer le type de machine d'état d'utilisation , Divers signaux d'entrée et de sortie doivent être marqués simultanément. , Plus facile à programmer .Le plus souvent utilisé est Mealy Type 3 Machine d'état segmentaire, Le processus de conception de la machine d'état est illustré ci - dessous par un exemple concret de conception d'un distributeur automatique .

Distributeur automatique

Les fonctions du distributeur automatique sont décrites comme suit: :

Prix unitaire des boissons 2 Yuan, Le distributeur ne peut accepter que 0.5 Yuan、1 La pièce de yuan. Envisager la mise à zéro et l'expédition . Le processus de mise en pièces et d'expédition est effectué une seule fois , Il n'y aura pas d'entrée unique de plusieurs pièces ou d'expédition unique de plusieurs bouteilles de boissons . Chaque tour du distributeur accepte la monnaie 、Expédition、 Une fois le changement terminé , Pour entrer dans un nouvel état de vente automatique .

Le diagramme de transfert de l'état de fonctionnement du distributeur est le suivant: ,Contient des entrées、 État du signal de sortie .

Parmi eux,coin = 1 Le représentant a donné son avis. 0.5 Pièces de monnaie,coin = 2 Le représentant a donné son avis. 1 Pièces de monnaie.

Conception de la machine d'état:3 Segment(Recommandations)

La machine d'état est conçue comme suit: :

  • (0) Tout d'abord,, Déterminer le Code de la machine d'état en fonction du nombre de machines d'état . Assigner une valeur au registre d'état en utilisant le codage ,Meilleure lisibilité du Code.
  • (1) Premier segment de la machine d'état ,Logique temporelle,Affectation non bloquante, État du registre de passage .
  • (2) Deuxième section de la machine d'état ,Logique combinatoire,Affectation des blocs, Selon l'état actuel et l'entrée actuelle , Déterminer l'état de la prochaine machine d'état .
  • (3) Troisième section de la machine d'état ,Logique temporelle,Affectation non bloquante,Parce que oui. Mealy Type de machine d'état, Selon l'état actuel et l'entrée actuelle , Déterminer le signal de sortie .

Exemple

module  vending_machine_p3  (
    input           clk ,
    input           rstn ,
    input [1:0]     coin ,     

    output [1:0]    change ,     //Change.
    output          sell         //Boissons de sortie
    );

    //machine state decode
    parameter           IDLE   = 3'd0 ;
    parameter           GET05  = 3'd1 ;
    parameter           GET10  = 3'd2 ;
    parameter           GET15  = 3'd3 ;

   
     
    reg  [2:0]          st_next ;
    reg  [2:0]          st_cur ;
    reg  [1:0]          change_r ;
    reg           	sell_r ;

    // Machine d'état du premier segment ,Logique temporelle Affectation non bloquante
    always @(posedge clk or negedge rstn) begin
        if (!rstn) begin
            st_cur <= 'b0 ;
        end
        else begin
            st_cur <= st_next ;
        end
    end

    // Machine d'état du deuxième segment  ,Logique combinatoire Affectation des blocs  
    always @(*) begin
        st_next = st_cur ;        // Si les options conditionnelles ne sont pas prises en compte , Peut assigner l'annulation initiale latch
        case(st_cur)
            IDLE:
                case (coin)
                    2'b01:     st_next = GET05 ;
                    2'b10:     st_next = GET10 ;
                    default:   st_next = IDLE ;
                endcase
            GET05:
                case (coin)
                    2'b01:     st_next = GET10 ;
                    2'b10:     st_next = GET15 ;
                    default:   st_next = GET05 ;
                endcase

            GET10:
                case (coin)
                    2'b01:     st_next = GET15 ;
                    2'b10:     st_next = IDLE ;
                    default:   st_next = GET10 ;
                endcase
            GET15:
                case (coin)
                    2'b01,2'b10:
                               st_next = IDLE ;
                    default:   st_next = GET15 ;
                endcase
            default:  st_next = IDLE ;
        endcase
    end

    // Machine d'état du troisième segment ,Logique temporelle Affectation non bloquante
	always @(posedge clk or negedge rstn) begin
		if (!rstn) begin
            change_r <= 2'b0 ;
            sell_r   <= 1'b0 ;			
		end
		else begin
			case (st_cur)
				IDLE:
					begin
						change_r <= 2'b0 ;
						sell_r   <= 1'b0 ;
					end
				GET05:
					begin
						change_r <= 2'b0 ;
						sell_r   <= 1'b0 ;
					end
				GET10:
					begin
						if (coin ==2'd2) begin
							change_r <= 2'b0 ;
							sell_r   <= 1'b1 ;	
						end
						else begin
							change_r <= 2'b0 ;
							sell_r   <= 1'b0 ;
						end
					end
				GET15:
					begin
						if (coin ==2'h1) begin
							change_r <= 2'b0 ;
							sell_r   <= 1'b1 ;
						end
						else if (coin == 2'h2) begin
							change_r <= 2'b1 ;
							sell_r   <= 1'b1 ;
						end
						else begin
							change_r <= 2'b0 ;
							sell_r   <= 1'b0 ;
						end
					end
				default:
					begin
						change_r <= 2'b0 ;
						sell_r   <= 1'b0 ;
					end
			endcase
		end
	end

    assign  sell = sell_r ;
    assign  change = change_r ;

endmodule

testbench Conçu comme suit:. Dans la simulation, 4 Scénario,Respectivement.:

case1 Correspond à une entrée continue 4 - Oui. 5 Pièce d'angle;case2 Correspondant à 1 Yuan - 5 Angle - 1 Ordre de placement des dollars ;case3 Correspondant à 5 Angle - 1 Yuan - 5 Ordre de mise des coins ;case4 Correspond à la continuité 3 - Oui. 5 Puis un coin. 1 Ordre de placement des dollars .

Exemple

`timescale 1ns/1ps
module test ;
    reg          clk;
    reg          rstn ;
    reg [1:0]    coin ;
    wire [1:0]   change ;
    wire         sell ;

    //clock generating
    parameter    CYCLE_200MHz = 10 ; 
    always begin
        clk = 0 ; #(CYCLE_200MHz/2) ;
        clk = 1 ; #(CYCLE_200MHz/2) ;
    end

    //motivation generating
    reg [9:0]    buy_oper ;
    initial begin
        buy_oper  = 'h0 ;
        coin      = 2'h0 ;
        rstn      = 1'b0 ;
        #8 rstn   = 1'b1 ;
        @(negedge clk) ;

        //case(1) 0.5 -> 0.5 -> 0.5 -> 0.5
        #16 ;
        buy_oper  = 10'b00_0101_0101 ;
        repeat(5) begin
            @(negedge clk) ;
            coin      = buy_oper[1:0] ;
            buy_oper  = buy_oper >> 2 ;
        end

        //case(2) 1 -> 0.5 -> 1, taking change
        #16 ;
        buy_oper  = 10'b00_0010_0110 ;
        repeat(5) begin
            @(negedge clk) ;
            coin      = buy_oper[1:0] ;
            buy_oper  = buy_oper >> 2 ;
        end

        //case(3) 0.5 -> 1 -> 0.5
        #16 ;
        buy_oper  = 10'b00_0001_1001 ;
        repeat(5) begin
            @(negedge clk) ;
            coin      = buy_oper[1:0] ;
            buy_oper  = buy_oper >> 2 ;
        end

        //case(4) 0.5 -> 0.5 -> 0.5 -> 1, taking change
        #16 ;
        buy_oper  = 10'b00_1001_0101 ;
        repeat(5) begin
            @(negedge clk) ;
            coin      = buy_oper[1:0] ;
            buy_oper  = buy_oper >> 2 ;
        end
    end

   //(1) mealy state with 3-stage
    vending_machine_p3    u_mealy_p3     (
        .clk              (clk),
        .rstn             (rstn),
        .coin             (coin),
        .change           (change),
        .sell             (sell)
        );

   //simulation finish
   always begin
      #100;
      if ($time >= 10000)  $finish ;
   end

endmodule 

Les résultats de la simulation sont les suivants::

Comme le montre la figure, Signal représentant l'action d'expédition sell Peut normalement être élevé après la fin de la pièce , Et le signal qui représente l'action de mise à zéro change Peut également produire un signal de mise à zéro correct en fonction de la scène de pièce d'entrée .

Modification de la machine d'état :2 Segment

Oui. 3 Machine d'état segmentaire 2、3 Fusion de la description du segment ,Les autres parties restent inchangées, La machine d'état devient 2 Description du segment .

Modifier comme suit::

Exemple

reg  [1:0]   change_r ;
reg          sell_r ;
always @(*) begin 
    case(st_cur)
        IDLE: begin
            change_r     = 2'b0 ;
            sell_r       = 1'b0 ;
            case (coin)
                2'b01:     st_next = GET05 ;
                2'b10:     st_next = GET10 ;
                default:   st_next = IDLE ;
            endcase 
        end
        GET05: begin
            change_r     = 2'b0 ;
            sell_r       = 1'b0 ;
            case (coin)
                2'b01:     st_next = GET10 ;
                2'b10:     st_next = GET15 ;
                default:   st_next = GET05 ;
            endcase 
        end

        GET10:
            case (coin)
                2'b01:     begin
                    st_next      = GET15 ;
                    change_r     = 2'b0 ;
                    sell_r       = 1'b0 ;
                end
                2'b10:     begin
                    st_next      = IDLE ;
                    change_r     = 2'b0 ;
                    sell_r       = 1'b1 ;
                end
                default:   begin
                    st_next      = GET10 ;
                    change_r     = 2'b0 ;
                    sell_r       = 1'b0 ;
                end
            endcase 
        GET15:
            case (coin)
                2'b01: begin
                    st_next     = IDLE ;
                    change_r    = 2'b0 ;
                    sell_r      = 1'b1 ;
                end
                2'b10:     begin
                    st_next     = IDLE ;
                    change_r    = 2'b1 ;
                    sell_r      = 1'b1 ;
                end
                default:   begin
                    st_next     = GET15 ;
                    change_r    = 2'b0 ;
                    sell_r      = 1'b0 ;
                end
            endcase
        default:  begin
            st_next     = IDLE ;
            change_r    = 2'b0 ;
            sell_r      = 1'b0 ;
        end

    endcase
end

Instancier le nouveau module modifié ci - dessus à 3 Segmental testbench Peut simuler ,Les résultats sont les suivants::

Comme le montre la figure, Signal d'expédition sell Et Signal de mise à zéro change Par rapport à 3 La sortie de la machine d'état de segment a un cycle d'horloge avancé , Ceci est dû au fait que les signaux de sortie sont tous des assignations de blocage .

Comme indiqué dans le cercle rouge , Les signaux de sortie ont des impulsions d'interférence , C'est parce que les signaux d'entrée sont asynchrones , Et le signal de sortie est une sortie Logique combinatoire , Pas de lecteur d'horloge .

Dans la pratique, Si les signaux d'entrée sont synchronisés avec l'horloge , Cette impulsion de brouillage ne se produira pas . S'il s'agit d'un signal d'entrée asynchrone , Le signal doit d'abord être synchronisé .

Modification de la machine d'état :1 Segment(Soyez prudent.)

Oui. 3 Machine d'état segmentaire 1、 2、3 Fusion de la description du segment , La machine d'état devient 1 Description du segment .

Modifier comme suit::

Exemple

    reg  [1:0]   change_r ;
    reg          sell_r ;
    always @(posedge clk or negedge rstn) begin
        if (!rstn) begin
            st_cur     <= 'b0 ;
            change_r   <= 2'b0 ;
            sell_r     <= 1'b0 ;
        end
        else begin
            case(st_cur)

            IDLE: begin
                change_r  <= 2'b0 ;
                sell_r    <= 1'b0 ;
                case (coin)
                    2'b01:     st_cur <= GET05 ;
                    2'b10:     st_cur <= GET10 ;
                endcase
            end
            GET05: begin
                case (coin)
                    2'b01:     st_cur <= GET10 ;
                    2'b10:     st_cur <= GET15 ;
                endcase
            end

            GET10:
                case (coin)
                    2'b01:     st_cur   <=  GET15 ;
                    2'b10:     begin
                        st_cur   <= IDLE ;
                        sell_r   <= 1'b1 ;
                    end
                endcase

            GET15:
                case (coin)
                    2'b01:     begin
                        st_cur   <= IDLE ;
                        sell_r   <= 1'b1 ;
                    end
                    2'b10:     begin
                        st_cur   <= IDLE ;
                        change_r <= 2'b1 ;
                        sell_r   <= 1'b1 ;
                    end
                endcase

            default:  begin
                  st_cur    <= IDLE ;
            end

            endcase // case (st_cur)
        end 
    end

Instancier le nouveau module modifié ci - dessus à 3 Segmental testbench Peut simuler ,Les résultats sont les suivants::

Comme le montre la figure, Signaux de sortie et 3 La machine d'état de segment est entièrement cohérente .

1 L'inconvénient des machines d'état segmentées est qu'il y a beaucoup de logique qui s'assemblent , Entretien ultérieur difficile . Lorsque la machine d'état et le signal de sortie sont faibles , Vous pouvez essayer cette description .

Modification de la machine d'état :Moore Type

Si vous utilisez Moore Description du flux de travail du distributeur , Il faut donc en ajouter d'autres. 2 Codes d'état ,Pour décrire Mealy Signal d'entrée à la sortie de la machine d'état et état de la machine d'état .

3 Segment Moore Distributeur automatique décrit par la machine d'état type Verilog Les codes sont les suivants::

Exemple

module  vending_machine_moore    (
    input           clk ,
    input           rstn ,
    input [1:0]     coin ,     

    output [1:0]    change ,
    output          sell    
    );

    parameter            IDLE   = 3'd0 ;
    parameter            GET05  = 3'd1 ;
    parameter            GET10  = 3'd2 ;
    parameter            GET15  = 3'd3 ;

    parameter            GET20  = 3'd4 ;
    parameter            GET25  = 3'd5 ;

    reg [2:0]            st_next ;
    reg [2:0]            st_cur ;

    //(1) state transfer
    always @(posedge clk or negedge rstn) begin
        if (!rstn) begin
            st_cur      <= 'b0 ;
        end
        else begin
            st_cur      <= st_next ;
        end
    end

    always @(*) begin //all case items need to be displayed completely
        case(st_cur)
            IDLE:
                case (coin)
                    2'b01:     st_next = GET05 ;
                    2'b10:     st_next = GET10 ;
                    default:   st_next = IDLE ;
                endcase
            GET05:
                case (coin)
                    2'b01:     st_next = GET10 ;
                    2'b10:     st_next = GET15 ;
                    default:   st_next = GET05 ;
                endcase

            GET10:
                case (coin)
                    2'b01:     st_next = GET15 ;
                    2'b10:     st_next = GET20 ;
                    default:   st_next = GET10 ;
                endcase
            GET15:
                case (coin)
                    2'b01:     st_next = GET20 ;
                    2'b10:     st_next = GET25 ;
                    default:   st_next = GET15 ;
                endcase
            GET20:         st_next = IDLE ;
            GET25:         st_next = IDLE ;
            default:       st_next = IDLE ;
        endcase
    end 

    reg  [1:0]   change_r ;
    reg          sell_r ;
    always @(posedge clk or negedge rstn) begin
        if (!rstn) begin
            change_r       <= 2'b0 ;
            sell_r         <= 1'b0 ;
        end
        else if (st_cur == GET20 ) begin
            sell_r         <= 1'b1 ;
        end
        else if (st_cur == GET25) begin
            change_r       <= 2'b1 ;
            sell_r         <= 1'b1 ;
        end
        else begin
            change_r       <= 2'b0 ;
            sell_r         <= 1'b0 ;
        end
    end
    assign       sell    = sell_r ;
    assign       change  = change_r ;

endmodule

Modifier comme indiqué ci - dessus Moore Machine d'état instanciée à 3 Segmental testbench Peut simuler ,Les résultats sont les suivants::

Comme le montre la figure, Signaux de sortie et Mealy Type 3 La machine d'état segmentée retarde un cycle d'horloge par rapport à , C'est parce qu'un délai d'un cycle d'horloge est nécessaire pour entrer dans la nouvelle machine d'état d'encodage .En ce moment, L'assignation de la sortie à une valeur non bloquante retardera le signal de sortie final d'un cycle d'horloge .C'est la même chose. Moore Caractéristiques de la machine d'état type .

Lors de l'attribution du signal de sortie , Assigner une valeur avec un bloc , Vous pouvez avancer d'un cycle d'horloge .

La logique de sortie est modifiée comme suit: .

Exemple

    reg  [1:0]   change_r ;
    reg          sell_r ;
    always @(*) begin
        change_r  = 'b0 ;
        sell_r    = 'b0 ; //not list all condition, initializing them
        if (st_cur == GET20 ) begin
            sell_r         = 1'b1 ;
        end
        else if (st_cur == GET25) begin
            change_r       = 2'b1 ;
            sell_r         = 1'b1 ;
        end
    end

Les résultats de la simulation de l'assignation du blocage du signal de sortie sont les suivants: :

Comme le montre la figure, Le signal de sortie a été 3 Segment Mealy La machine d'état de type est cohérente .

原网站

版权声明
本文为[Linest - 5]所创,转载请带上原文链接,感谢
https://yzsam.com/2022/179/202206282311477808.html