Au cours de ce TP, vous allez :
Les techniques courantes de transmission de données "compressées" font souvent appel aux codages "à longueur variable" (VLC pour Variable Length Coding). Ces codes utilisent les statistiques d'apparition des symboles du message pour attribuer aux symboles les plus fréquents des codes courts, et aux symboles plus rares des codes longs. Dans le cadre du TP, nous allons considérer un système de transmission dont les caratéristiques sont les suivantes :
Les codes VLC doivent être définis de manière à garantir un décodage sans ambigüité. Pour ce TP, nous utiliserons le codage suivant :
Avec un codage de longueur fixe, il faudrait 3 bits par symbole pour transmettre ces données. Avec notre code à longueur variable vous pouvez aisément vérifier qu'il suffit "statistiquement" de 1,875 bits par symbole, d'où le gain en compression du flux de données.
Vous pourrez également vérifier que toute succession de bits est décodable en une succession de symboles.
Nous désirons réaliser un bloc vld permettant de décoder les codes définis ci-dessus. Ce bloc est constitué d'une machine à états synchrone de Moore. Les caractéristiques de la transmission et les contraintes de traitement sont les suivantes :
Les symboles codés sont envoyés bit à bit par un signal bit_value, en commençant part les poids forts, de manière synchrone avec une horloge clk.
L'émetteur de symboles VLC signale au récepteur la présence d'un bit de symbole à transmettre par l'intermédiaire d'un signal bit_valid.
L'émetteur de symboles peut interrompre temporairement la transmission (bit_valid=0) :
Le décodeur génère un code data_value de 3bits correspondant au symbole décodé.
Le décodeur signale la présence d'un symbole décodé par l'intermédiaire d'un signal data_valid qui ne doit rester à "1" que pendant 1 cycle de clk.
Le décodeur peut être initialisé par l'intermédiaire d'un signal reset_n asynchrone actif à l'état bas.
Les figures et tableaux suivants résument les interfaces du bloc VLD:

|
Nom |
Type |
Utilisation |
|
reset_n |
Entrée |
Initialisation de la machine à état, actif à l'état bas |
|
clk |
Entrée |
Horloge |
|
bit_value |
Entrée |
Bits de code qui entrent |
|
bit_valid |
Entrée |
Indique que le signal "bit_value" est valide |
|
data_value |
Sorties |
symbole décodé, recodé comme un entier sur 3 bits |
|
data_valid |
Sortie |
ne dure qu'un cycle, et indique que les sorties "data_value" portent un symbole décodé |
|
error |
Sortie |
Inutilisée pour le moment |
Dessiner sur papier le schéma électrique de la machine à états, en séparant bien le registre qui mémorise l'état et les parties combinatoires, et en localisant où se connectent les entrées et les sorties,
Dessiner des chronogrammes de ce qui peut se passer dans différents cas, suivant les différentes valeurs possibles prises par les entrées,
Dessiner un graphe d'états de la machine à états vld, en précisant tous les états et toutes les transitions en fonction des valeurs des entrées,
Donner un nom court et clair à chaque état, indiquer la valeur des sorties data_valid et data_value pour chaque état, préciser l'état initial (celui du reset),
On nommera l'état courant EC et l'état futur EF, on définira la table de vérité de EF en fonction de EC et des entrées bit_valid et bit_value. On ne cherchera pas à donner une valeur binaire aux états (la compilation le fera automatiquement), la table de vérité contiendra directement les mnémoniques des états.
Exemple de début de table de vérité :
|
EC |
bit_valid |
bit_value |
EF |
|
DEBUT |
0 |
1 |
A1 |
|
A1 |
1 |
1 |
E2 |
|
... |
... |
... |
... |
Définir de même la table de vérité des sorties data_valid et data_value en fonction de EC :
|
EC |
data_valid |
data_value |
|
A1 |
1 |
1 |
|
E2 |
1 |
3 |
|
... |
... |
... |
Prenez la peine de lire la partie concernant le codage des machines à état en SystemVerilog, qui vous permettra :
Coder la machine à états en langage System Verilog. Pour cela, complétez le fichier vld.sv situé dans le sous-répertoire src (il est normalement déjà ouvert dans un onglet de l'éditeur eVim). Comme indiqué dans les commentaires du fichier, vous devez explicitement écrire 4 séquences de code :
Testez votre code en lançant la commande make simu_vld.
Le bloc vlc est le codeur qui génère les signaux transmis au décodeur que l'on vient de réaliser. Un opérateur humain dispose de 5 boutons numérotés de 1 à 5. Lorsque l'opérateur appuie sur un bouton, cela positionne en entrée de vlc le code du nombre entier de 1 à 5, en parallèle sur 3 fils nommés "code", et cela génère aussi une impulsion longue sur un fil nommé "key_pressed". Le codeur vlc sera réalisé sous forme d'une machine de Moore. Il doit transformer ses signaux d'entrées en signaux respectant le protocole VLC décrit précédemment, avec la donnée en sortie série sur un seul fil "bit_value".
Les figures et tableaux suivants résument les interfaces du bloc VLC :

|
Nom |
Type |
Utilisation |
|
clk |
Entrée |
Horloge |
|
reset_n |
Entrée |
Reset asynchrone, actif à l'état bas |
|
key_pressed |
Entrée |
Indique si une touche est appuyée. Ce signal reste actif au minimum une centaine de cycles |
|
code |
Entrée |
Code sur 3 bits de la touche appuyée. N'est valable que pendant que key_pressed est actif |
|
bit_valid |
Sortie |
indique que le bloc vlc génère sur "bit_value" un bit valide d'un code vlc |
|
vit_value |
Sortie |
valeur du bit de code vlc générée |
Les contraintes sont les suivantes :
vlc génère les séquences de bit dès que possible,
vlc ne génère qu'une seule séquence de bits lorsqu'une touche est appuyée (pas de répétition des symboles).
Réaliser la machine vlc en suivant les mêmes étapes que pour vld, en tentant de minimiser le nombre d'états de la machine: dessin papier des chronogrammes puis du graphe d'état, écriture des tables de vérité des parties combinatoires, codage en langage système vérilog,
Éditez-le fichier vlc.sv en suivant les commentaires et le cadre déjà préparé,
Simulez votre codeur en exécutant la commande make simu_vlc.
Le test du couple (vlc,vld) se fait directement sur la maquette (make syn, make program). Vous utiliserez l'analyseur logique pour vérifier la bonne génération des signaux par vlc. Pour cela, les signaux suivants ont été reliés à l'analyseur logique:
|
clk |
|
code (sur 3 entrées séparées) |
|
key_pressed |
|
bit_value |
|
bit_valid |
|
data_valid |
|
data_value |
L'analyseur logique sera synchronisé sur un front montant du signal key_pressed, de manière à saisir les enchaînements après l'appui sur un bouton.
Le signal key_pressed est relié au bouton KEY 3 de la maquette et le CODE est relié aux switch SW[2:0].
La valeur de data_value après passage dans vos codeur et décodeur est affichée sur l'afficheur sept segments HEX0.
Le code 5 est supprimé de l'ensemble des codes acceptables.