Ecole polytechnique de l'Université de Nantes
Département Système Electronique et Informatique Industrielle
Rue Christian Pauc - BP 50609
44306 Nantes Cedex 3
P. Bakowski

Modèle VHDL synthétisable du 8051

Le 8051 d'Intel est un microcontrôleur 8 bits. Ce microcontrôleur est capable d'adresser 64Ko de programme et 64Ko de données mémoire. L'implémentation ci-dessous est écrite en VHDL synthétisable (au moins pour Synopsys et Xilinx) et modélise très fidèlement l'actuelle implémentation d'Intel, c'est-à-dire qu'il est compatible avec 100% des instructions. Visitez cette page pour les dernières informations et versions, et gardez à l'esprit que nous tenterons de faire de fréquentes révisions. N'hésitez pas à nous contacter concernant vos questions et commentaires. Inutile de vous dire que nous ne fournissons aucune garantie, pas plus que l'Université de Californie à Riverside, pour tout ce que vous aurez lu ou téléchargé de cette page.

Diagramme bloc


Limitations

Nous projetons, petit à petit, de supprimer toutes les limitations ci-dessus. Nous apprécierions aussi toute aide de personnes volontaires pour contribuer à cette conception. Merci de nous contacter.

Description des fichiers sources

Ici est donnée une courte description des fichiers rattachés.
Fichier
Description
i8051_lib.vhd Définit un paquetage qui est utilisé dans tous les fichiers VHDL du modèle du 8051. Ce paquetage définit les constantes communément utilisées.
i8051_alu.vhd Modèle de l'Unité Arithmétique et Logique (ALU) qui exécute les calculs spécifiques du 8051. Ce modèle est décrit de manière comportementale comme un bloc logique combinatoire.
i8051_dec.vhd Modèle du décodeur qui décode les instructions 8051 non-uniformes en représentations uniformes, c'est-à-dire en codes énumérés. Ce modèle est décrit comme un flot de données implémentant un bloc logique combinatoire.
i8051_ram.vhd Modèle de 128 octects de RAM, spécifique au 8051, c'est-à-dire adressable par bit. Ce modèle est décrit de manière comportementale comme un bloc logique séquentiel.
i8051_rom.vhd* Modèle d'une ROM atteignant jusqu'à 64K octets, spécifique au 8051. Ce modèle est généré automatiquement et de manière comportementale, comme un bloc logique séquentiel, en utilisant i8051_mkr.c.
i8051_ctr.vhd Modèle du noyau processeur du 8051. Ce modèle est décrit de manière comportementale comme un bloc logique séquentiel.
i8051_dbg.vhd Cette entité est donnée uniquement pour débugger. Actuellement, elle ressort une trace de chaque instruction exécutée.
i8051_all.vhd Modèle du microcontrôleur 8051 complet. Ce modèle combine structurellement les blocs logiques ci-dessus.
i8051_xrm.vhd Modèle d'une SRAM externe qui s'interfacera à ce microcontrôleur 8051. 
i8051_tsb.vhd Modèle d'un banc de test pour le microcontrôleur 8051. Ce modèle est décrit de manière comportementale comme un bloc logique sans entrée/sortie. Il est simplement initialisé (RESET), puis stimulé indéfiniment par l'horloge.
i8051_mkr.c Programme pour convertir un fichier au format HEX 8051 d'Intel en un modèle de ROM, c'est-à-dire qui génère le fichier i8051_rom.vhd. Vous aurez besoin de compiler ce fichier C/C++ avec la commande gcc -o mkr i8051_mkr.c, puis de l'exécuter avec un fichier HEX comme argument dans la ligne de commande : mkr myfile.hex.
syn_alu.inc,syn_dec.inc,syn_ram.inc,syn_rom.inc,syn_ctr.inc  Fichiers Include, spécifiques à dc_shell, qui permettront la synthèse des modèles ci-dessus jusqu'aux portes logiques.
zsim.scr,zsyn.scr Fichiers script qui simulent/synthétisent tout.
* supérieur au modèle de ROM de 4 Ko du programme sort.c.

Statistiques

Ici sont données quelques statistiques qui peuvent vous intéresser. Celles-ci ont été obtenues en synthétisant le modèles jusqu'au portes en utilisant un mapping de complexité moyenne. La librairie attachée est lsi_10k, fournie par Synopsys. Aucune contrainte d'espace et de délais n'a été spécifiée. La machine d'utilisation est similaire à un processeur Ultra Sparc II 200MHz.
Modèle
Ports E/S
(bit)
Surface de la partie Combinatoire
(portes NON ET)
Surface de la partie Séquentielle
(portes NON ET)
Longueur du Chemin Critique
(ns)
Vitesse d'Horloge Maximum
(MHz)
Temps de Synthèse (min)
I8051_ALU
50
2191
0
178
5.63
3
I8051_DEC
18
590
0
46.3
21.6
2
I8051_RAM
31
5237
8663
1.41
709
28
I8051_ROM*
23
1050
56
1.40
714
15
I8051_CTR
118
2202
998
1.77
565
17
* supérieur au modèle de ROM de 4 Ko du programme sort.c.

Fichiers de test

Ci-dessous est donnée un ensemble de fichiers de test, en format C. Notre stratégie de test a été d'écrire des programmes (C), de les compiler en fichier binaires Intel 8051 (HEX), de les convertir en un modèle de ROM en VHDL, puis de simuler et d'observer le comportement

Toutes les instructions

testall.c
testall.hex

Ce programme testera toutes les instructions exceptées ACALL, LCALL, RET, RETI et MOVX(1-4). Chaque instruction est testée à un niveau très rudimentaire (1 à 3 tests par instruction). S'il est pertinent, le flag de retenue est aussi testé. Si une instruction échoue, le programme sortira le numéro de l'instruction sur le port P1 et puis s'arrêtera. Sinon, 127 sera sorti sur P1 quand toutes les instructions auront été exécutées.

Chaque instruction de test est séparée à l'intérieur du programme pour permettre une compréhension facilité si désirée. La RAM de la puce et le PSW sont nettoyés avant le test de chaque instruction.

Le programme utilise la directive ASM pour écrire le texte source dans le fichier .SRC, similaire à un assemblage directe. Cependant, pour créer le fichier HEX il faut utiliser le compilateur KEIL, les étapes étant :

Pour utiliser le fichier HEX suivre les instructions fournies dans les pages d'aide référencées ci-dessous.

Fichiers de test additionnels

Voici quelques fichiers de tests additionnels qui pourront être utiles pour tester le 8051. Regardez cette table pour voir comment ces programmes de test stimulent bien le 8051!
C
HEX
Taille (octets)
Temps de Simulation (ns)
Signal de Trace (déboguage)
negcnt.c negcnt.hex
39
270,000
P0 = 64, 65, 66, 67, 68, 69, 70, 71, 72, 73
gcd.c gcd.hex
51
327,000
P0 = 36, 25, 14, 3, 1
int2bin.c int2bin.hex
60
500,000
P0 = 0, 1, 0, 1, 0, 1, 0, 1
cast.c cast.hex
127
870,000
P0 = 01H, P1 = 23H, P2 = 45H, P3 = 67H
divmul.c divmul.hex
210
370,000
P0 = 10, 4, 134
fib.c fib.hex
305
1,042,000
P0 = 1, 1, 2, 3, 5, 8, 13, 21, 34, 55
sort.c sort.hex
544
3,600,000
P0 = 0, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19
sqroot.c sqroot.hex
1121
4,000,000
P0 = 9, P1 = 16, P2 = 25, P3 = 5
xram.c xram.hex
67
37,000,000
/I8051_XRM/XRAM(...) = 1, 2, 3, 4, ... 

Archives du code source complet

Ici se trouve la dernière version du code source (du plus récent au plus vieux) au format tar/gzip.
Archive
Version
Date
Notes
source_2.7.tar.gz
2.7
16/11/2000 Implémentation fonctionnelle d'une mémoire externe. Ajout d'un modèle de SRAM. Le banc de test est  maintenant connectés au noyau du 8051 avec 2048 octets de mémoire externe qui peut être écrite et lue via les instructions MOVX.
source_2.6.tar.gz
2.6
01/08/2000 Correction d'un problème avec les instructions INC_4 et DEC_4. (Remerciements à Shu-Yi Yu pour nous avoir fait connaître ce problème et nous avoir envoyé un code source de test très utile.)
source_2.5.tar.gz
2.5
14/07/2000 Ajout de commentaires sur les signaux des ports utilisés par cette implementation.
source_2.4.tar.gz
2.4
23/11/1999 Correction d'un bogue dans i8051_mkr.c qui entrainait un problème lorsque les fichiers HEX venaient d'un autre compilateur que ceux de KEIL. (Remerciements à Lars Wehmeyer qui a trouvé et corrigé cette erreur et qui nous a envoyé un correctif.)
source_2.3.tar.gz
2.3
19/11/1999 Conversion du fichier i8051_mkr.cc en i8051_mkr.c, c'est-à-dire, un pur fichier C pour une meilleure portabilité. Correction d'un bogue dans l'entité I8051_ALU, plus précisément, l'unité "division". Retrait de la référence à I8051_LIB dans le testbench (non requis ici).
source_2.2.tar.gz
2.2
15/09/1999 Correction d'un harmless warning lors de la compilation de i8051_mkr.cc. Pour une homogénéité des ressources de cette page, création d'un programme sort.hex par défaut dans i8051_rom.vhd.
source_2.1.tar.gz
2.1
15/08/1999 Première version disponible.

Dalton Project
University of California
Dept. of Computer Science
Riverside, CA 92521
dalton@cs.ucr.edu
La partie précédente a été traduite, adaptée et remise en forme par Arnaud Depaigne et Nicolas Jourdan, à partir des documents publics originaux issus de l'université ci-dessus. Ces deux élèves vous proposent également une partie de leur compte-rendu de TP, ci-dessous.
Dernière mise-à-jour, le 22 décembre 2000.

Aide concernant l'utilisation du Compilateur/Designer ModelTech et de leurs Outils Associés

Notes de TP

Le test de notre ram générique a permit de mettre en évidence un défaut du modèle du 8051. Lorsque celui-ci veut lire dans une valeur dans la mémoire externe, il valide le composant RAM et ne lit effectivement la valeur du bus de données que lorsque la sélection du composant est terminée. L'instruction OutData <= Memory(i) a pour effet que la valeur de OutData garde la dernière valeur donnée par Memory(i). Le signe "<=" a un rôle de bascule D. Ainsi on peut observer sur les chronogrammes de test de la ram i8051_xrm.vhd une persistance des valeurs sur le bus in_data du contrôleur.
 

Le fichier GENERIC_RAM.vhd fixe le port OutData à l'état tri-state lorsque le composant n'est pas sélectionner. Ceci implique que les données ne sont valides seulement durant la sélection effective de la ram générique. Comme la lecture de la valeur du bus in_data, se fait plus tard, le contrôleur lit des signaux sans signification. En conséquence la valeur à écrire la fois d'après est elle aussi sans aucun sens.
 

Pour créer une ram adaptée au composant il faut ajouter au composant Générique : un multiplexeur de bus de données entre les cellules de la ram. C’est l’objet du composant GENERIC_RAM_2.vhd. Le multiplexeur est modélisé par le tableau All_Int_Data_Bus. En utilisant la propriété du signe "<=", les données voulues persistent sans entrer en conflit avec celles des autres cellules ram.