2.5) Verilog - Autres périphériques
Rom de Boot :
C’est
en fait une RAM de 2ko interne au FPGA, qui contient initialement le
programme Bootloader. C’est le premier périphérique que j’ai utilisé.
C’est avec cette RAM que j’ai codé les premiers programmes,
sans
aucun autre périphérique. L’outil « in system memory content editor »
d’ALTERA permet d’écrire et de lire dans cette RAM à la volée, à la
façon d’un « émulateur de RAM / EPROM ». Ca m’a permis de débugger les
premiers programmes, en les exécutant dans cette RAM, et en leur
faisant manipuler des données dans cette RAM.
Interface
PS/2 :
Là
encore, j’ai fait des erreurs, vu mon inexpérience, mais ça fonctionne.
J’aurais pu coder quelque chose de beaucoup plus simple.
Remarque
: comme le CPU ne sait pas gérer les interruptions (c’est volontaire
pour simplifier le CPU), je suis obligé d’introduire une petite FIFO
entre l’interface PS/2 et le CPU, pour être certain de ne rater aucune
information issue du clavier.
J’ai donc en sortie du PS/2 :
1 flag pour indiquer que la FIFO contient des données, et la lecture
des données de la FIFO en elle-même.
Interface
série :
Je
n’ai pas d’interface série à proprement parler. Juste 2 bits d’entré et
2 bits de sortie du style GPIO. J’émule par logiciel l’interface série
: c’est du bit-banging. Je n’ai codé que la partie RX, pour télécharger
des données depuis le PC de développement vers A2Z.
Le choix du
bit-banging est très discutable, il limite fortement le débit. Je ne
peux pas dépasser 56kBauds, c’est quand même bien lent quand je veux
charger 1Mo de donnée ou plus (j’ai du télécharger 6Mo pour Map
Viewer). En hardware, j’aurais pu facilement faire 10 fois plus rapide.
Interface SPI
:
L’interface SPI maitre sert (pour l’instant) uniquement à raccorder la
mémoire Flash 16Mo externe au FPGA.
La
configuration de l’interface est volontairement fixe, pour des raisons
de simplification : les transferts se font sur obligatoirement sur 8
bits, et la fréquence est de 12.5MHz.
J’utilise naturellement 2 shift registers, un pour la lecture (MISO) un
pour l’écriture (MOSI).
L’adresse
mémoire est volontairement identique pour la lecture (MISO) et pour
l’écriture (MOSI) sur le port SPI, même si les buffers sont
physiquement différents ; ça permet d’économiser des instructions de
changement d’adresse dans le code exécutable, et donc d’accélérer le
tout.
Chaque écriture du CPU vers le périphérique SPI déclenche
une « transaction » de 8 bits automatiquement sur le port SPI sans
autre intervention (ça réduit le nombre d’instructions nécessaires).
Donc le shift register de lecture se remplit aussi à chaque transaction
8 bits.