Réalisation et validation d'une fonction combinatoire dans un circuit logique programmable
Réalisation et validation d'une fonction combinatoire dans un circuit logique programmable
Au cours de ce TP vous allez étudier le fonctionnement d'une unité arithmétique et logique (ALU: Arithmetic and Logic Unit). Cette unité purement combinatoire peut être utilisée dans un petit processeur.
Les tâches que vous devrez effectuer sont:
La maquette est construite autour d'un circuit logique programmable de type FPGA. Elle possède un grand nombre d'entrée/sorties toutes connectées au FPGA:
Une photo de la maquette apparaît ci-dessous. Vous pouvez retrouver le FPGA, les E/S , le connecteur d'alimentation, le connecteur de programmation (via votre PC), ainsi que les connecteurs d'extension. Ces derniers permettront de connecter les sondes d'un analyseur logique de manière à observer les signaux sortants du FPGA.

En annexe, vous trouverez une documentation complète du FPGA et de la maquette.
Les logiciels de CAO électronique aident le concepteur dans toutes les étapes du flot de conception d'un circuit. Les principales étapes pour un FPGA sont :

|
Nom |
Type |
Utilisation |
|
A[3:0] |
entrée |
Premier opérande de l'ALU. Entier non signé codé sur 4 bits |
|
B[3:0] |
entrée |
Deuxième opérande de l'ALU. Entier non signé codé sur 4 bits |
|
CODE[2:0] |
entrée |
Code déterminant l'opération à effectuer, sur 3 bits |
|
CIN |
entrée |
Retenue entrante, utilisée suivant l'opération demandée |
|
S[3:0] |
sortie |
Résultat sortant de l'ALU. Entier non signé codé sur 4 bits |
|
COUT |
sortie |
Eventuelle retenue sortante dont l'interprétation dépend de l'opération effectuée |
Remarques sur la notation vectorielle des données
Le tableau suivant représente les opérations à effectuer en fonction de CODE.
Attention : certains codes ne sont pas utilisés.
|
CODE |
Nom |
Équation |
Description |
|
000 |
AND |
A and B |
ET logique bit à bit |
|
001 |
OR |
A or B |
OU logique bit à bit |
|
010 |
XOR |
A xor B |
XOR logique bit à bit |
|
110 |
ADD |
A + B + CIN |
Addition sur 4 bits (avec propagation de retenue) |
|
111 |
SUB |
A - B - CIN |
Soustraction sur 4 bits (avec propagation de retenue) |
L'addition de 2 mots de N bits peut être réalisée à partir de N cellules élémentaires d'addition sur 1bit.
Par analogie, l'ALU sera conçue de façon hiérarchique à partir d'une cellule élémentaire réalisant les opérations demandées sur 1bit. On mettra ensuite 4 exemplaires de cette cellule élémentaire côte à côte afin de réaliser l'ALU de 4 bits.
On commencera donc par la réalisation de la cellule élémentaire sur 1 bit.
|
Nom |
Type |
Utilisation |
|
Ai |
entrée |
Premier opérande de la cellule. (sur 1bit) |
|
Bi |
entrée |
Deuxième opérande de la cellule. (sur 1bit) |
|
CODE[2:0] |
entrée |
Code déterminant l'opération à effectuer (sur 3 bits) |
|
CIN |
entrée |
Retenue entrante, utilisée ou non, suivant l'opération demandée |
|
Si |
sortie |
Résultat sortant de cellule. (sur 1bit) |
|
COUT |
sortie |
Eventuelle retenue sortante dont l'interprétation dépend de l'opération effectuée |
En vous aidant du cours sur les fonctions logiques de base et les opérateurs arithmétiques, définissez l'architecture de cette cellule. C'est un travail papier, vous pouvez à votre gré faire un shéma, définir des expressions algébriques ou des tables de vérité.
Prenez le temps de lire les deux premières partie de la page décrivant la syntaxe du SystemVerilog.
Enfin, décrivez en SystemVerilog la structure de votre cellule, en complétant le fichier cellule.sv qui est déjà ouvert dans la fenêtre de l'éditeur eVim. Respectez scrupuleusement les noms des signaux (majuscules-minuscules) et les indications. Vous écrirez séparément le code pour Si et le code pour COUT.
Nous avons préparé un environnement de vérification de votre cellule:
Sauvez votre fichier cellule.sv puis simulez votre cellule. Pour cela, exécutez la commande make sim_cell depuis la fenêtre de terminal déjà ouverte.
Si des erreurs sont signalées, vous devez corriger le fichier de code-source de votre cellule, puis relancer la simulation.
L'ALU 4 bits est obtenue en assemblant quatre cellules de base.
Complétez le fichier alu.sv
Vérifiez le bon comportement de votre ALU en utilisant la commande make sim_alu
Pour le moment, nous n'avons fait que des simulations, il reste à intégrer réellement votre ALU dans la maquette. La figure suivante décrit l'interface simplifiée entre votre ALU et les éléments de la maquette. Cette interface existe et vous n'avez pas à la réaliser.

Executez la commande make syn_alu qui permet de réaliser la synthèse de l'ensemble du projet, et de générer la netlist pour la future programmation du FPGA.
Cette étape prend un certain temps de calcul pour s'exécuter, d'où l'intérêt de corriger les erreurs avant, en faisant des simulations. Le synthétiseur peut détecter des erreurs que la simulation n'a pas mises en évidence. Si tel est le cas, faites vous aider par votre encadrant pour en déterminer l'origine.
Avant de passer aux phases suivantes qui utuilisent le FPGA de la maquette ALTERA, vérifiez que la maquette est connectée, alimentée, et mise en marche (LEDs allumées).
Envoyez le programme au FPGA de la maquette, grâce à la commande make prg_alu.
Une fois le téléchargement effectué, vous pouvez tester le fonctionnement de votre ALU (électronique cette fois, non simplement simulé), en jouant sur les interrupteurs et les bouton-poussoirs. Le tableau suivant donne la correspondance des entrées/sorties sur la maquette:
|
Signal |
type |
correspondance |
type |
|
A |
entrée |
SW[17:14] |
interrupteurs |
|
B |
entrée |
SW[13:10] |
interrupteurs |
|
CODE |
entrée |
SW[9:7] |
interrupteurs |
|
CIN |
entrée |
Key[0] |
bouton poussoir |
|
S |
sortie |
Hex0 |
Aff. 7 segments |
|
COUT |
sortie |
Hex1 |
Aff. 7 segments |
Mesure des temps de propagation en mode addition
Pour mesurer les temps de calcul en mode additionneur de votre ALU 8bits, nous avons préparé une configuration où le code est forcé à la valeur correspondant à l'addition:
L'entrée A est forcée à 11111111
L'entrée B est forcée à 00000000
La retenue entrante CIN a été reliée à un signal d'horloge lclk qui prend à intervale régulier les valeurs 1 et 0.

4. Synthétisez l'alu 8 bits par la commande make syn_8bits
Programmez le FPGA par la commande make prg_8bits
Quand la retenue entrante passe de 0 à 1, le changement de S n'est pas instantané, c'est ce que vous devez observer. Pour cela nous avons connecté les sondes de l'analyseur logique. Les sorties suivantes sont visualisables:
|
lclk |
|
S0 à S7 : les 8 sorties de l'ALU |
|
Cout |
Nous désirons additionner 3 mots A,B et C codés sur 8bits. Le résultat attendu est codé sur 8 bits.
L'équation attendue est donc : S = A + B + C + Cin
Nous allons déterminer la vitesse de calcul de votre structure en utilisant le shéma suivant:

AVANT DE PROGRAMMER votre alu, répondez au mini qcm suivant, et justifiez votre réponse (jouez le jeu SVP...)
Programmez votre FPGA par la commande make prg_abc
Le shéma suivant représente une variante d'additionneur 8bits utilisant votre ALU 4 bits (celle du paragraphe 4.2)
