IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Voir le flux RSS

Le blog de f-leb

[FPGA] Créer un circuit logique pour détecter une séquence

Noter ce billet
par , 19/08/2022 à 08h00 (4153 Affichages)
Dans un flux de données binaire tel que 1 0 0 1 1 0 ... , détecter une séquence particulière est un exercice de logique séquentielle que l’on peut résoudre grâce à une approche par machine à états finis (Finite State Machine FSM).

Par exemple, la machine à états finis du graphe ci-dessous permet de détecter la séquence 1 1 0 1 :

Nom : sequence1101.png
Affichages : 2437
Taille : 50,4 Ko

S0, S1, S1 et S3 sont les états de la machine, et les étiquettes au niveau des arcs orientés définissent les transitions (les conditions de passage d’un état à un autre) et l’état de la sortie. L’étiquette de chaque transition est un couple état entrée/état sortie.
Par exemple, (S0)---1/0--->(S1) signifie que l’état passe de S0 à S1 si l’entrée (le bit courant du flux) est égale à 1, et dans ce cas la sortie passe à 0. Pour une description complète, chaque état (Si) a forcément deux arcs qui partent : un pour l’entrée égale à 0, un autre pour l’entrée égale à 1.
Dans une détection de séquence, on veut naturellement que la sortie passe à 1 si la bonne séquence 1 1 0 1 est détectée, ici sur l’arc (S3)---1/1--->(S0).

Remarquez que la machine décrite n’autorise pas de chevauchement dans la séquence. Par exemple dans le flux 1 1 0 1 1 0 1, on pourrait voir la séquence apparaître deux fois :
  • 1 1 0 1 1 0 1
  • 1 1 0 1 1 0 1

Mais dans ce cas, le 1 en 4e position chevaucherait les deux séquences, ce qui n’est pas autorisé d’après le graphe. Seule la 1re séquence sera détectée par notre machine.

Cette description de machine à états finis où la sortie dépend à la fois de l’état courant (Si) et de l’entrée constitue une machine de Mealy.

Voici un exemple de détection obtenu en simulation :

Nom : simul-sequence.png
Affichages : 751
Taille : 37,8 Ko
Simulation : la séquence 1 1 0 1 est détectée deux fois

L’entrée din est asynchrone mais les changements d'états sont opérés sur front montant de l’horloge.
Pour des besoins fonctionnels, la sortie est resynchronisée sur l'horloge (mais ce n'est pas obligatoire).

En logique séquentielle, le traitement s’effectue avec trois processus :
  • un processus combinatoire qui calcule l’état futur à partir de l’entrée et de l’état présent ;
  • un processus séquentiel où l’état présent est mis à jour par l’état futur et mémorisé sur front montant de l’horloge (ou remis à l’état initial (S0) sur un signal Reset asynchrone) ;
  • un processus combinatoire qui calcule la sortie à partir de l’entrée et de l’état présent.



Voici le module complet de détection de la séquence en Verilog avec les trois processus :
Code SystemVerilog : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
module Sequence (  // détection de séquence 1101
	input  logic clk, rst, din,
	output logic dout
	);

	  
	typedef enum logic[1:0] {S0, S1, S2, S3, ERR='X} state_t;
	state_t state, state_next; // état courant, état futur
	logic dout_async;
	 
	 
	/* Combinatoire des états
		Calcul de l’état futur à partir de l'entrée et de l’état présent */
	always_comb begin
		state_next = ERR; // état futur inconnu par défaut
		if (rst)
			state_next = S0;		
		else 
			case (state)    // selon l'état présent
				S0 : state_next = din ? S1 : S0;
				S1 : state_next = din ? S2 : S0;
				S2 : state_next = din ? S2 : S3;
				S3 : state_next = S0;
			endcase
	end
    
	/*  Mise à jour de l’état présent par l’état futur sur les fronts montants d’horloge */
	always_ff @(posedge clk) begin
		state <= state_next;    
	end

	/* Combinatoire de la sortie
	    Calcul des sorties à partir de l'entrée et de l’état présent */
	always_comb begin       
		dout_async = (state == S3) && din; // sortie dépend de l'entrée et de l'état
	end
	
	always_ff @(posedge clk) begin  // resynchronisation de la sortie
		dout <= dout_async;    
	end
  
endmodule

Nom : sequence-netlist-view.png
Affichages : 92
Taille : 39,4 Ko
Le système analysé est bien une machine à états finis


Edit : mise à jour le 20/08/2024

Envoyer le billet « [FPGA] Créer un circuit logique pour détecter une séquence » dans le blog Viadeo Envoyer le billet « [FPGA] Créer un circuit logique pour détecter une séquence » dans le blog Twitter Envoyer le billet « [FPGA] Créer un circuit logique pour détecter une séquence » dans le blog Google Envoyer le billet « [FPGA] Créer un circuit logique pour détecter une séquence » dans le blog Facebook Envoyer le billet « [FPGA] Créer un circuit logique pour détecter une séquence » dans le blog Digg Envoyer le billet « [FPGA] Créer un circuit logique pour détecter une séquence » dans le blog Delicious Envoyer le billet « [FPGA] Créer un circuit logique pour détecter une séquence » dans le blog MySpace Envoyer le billet « [FPGA] Créer un circuit logique pour détecter une séquence » dans le blog Yahoo

Mis à jour 20/08/2024 à 17h45 par f-leb

Tags: fpga, verilog
Catégories
Programmation , FPGA

Commentaires