Étape 14 : microprogrammation
NOP : Aucune opération. (0000)
LDA : Charger l’accumulateur avec la valeur à cette adresse. (0001)
ADD: Ajouter de la valeur à l’adresse spécifiée à la valeur dans l’accumulateur. (0010)
SUB : Soustraire la valeur à l’adresse spécifiée par la valeur dans l’accumulateur. (0011)
STO : Stocker le contenu de l’accumulateur à l’adresse spécifiée. (0100)
OUT : Stocker le contenu de l’accumulateur dans le registre de sortie afin que l’opérateur puisse le voir. (0101)
JMP : Sauter à une certaine instruction en mémoire à l’adresse spécifiée. (0110)
HLT : Arrêter le fonctionnement de l’ordinateur. (0111)
Pour déterminer quel contrôle mots doivent être envoyés pour chaque OP, il faut savoir ce que doivent être actif pendant chaque État T bits. Pour mon ordinateur, j’ai organisé les bits comme suit (un trait de soulignement dénote un peu basse active) :
CE CO J MI RO II IO OI BI EO SU AO AI RI HLT X
CE - Count Enable (permet l’entrée horloge du compteur programme)
CO - horloge sur enable
J - jump enable
MI - MAR entrée
RO - de mémoire programme
II - registre d’Instruction en
IO - registre d’Instruction sur
OI - Registre de sortie en
BI - Registre B dans
EO - ALU sortie activer
SU - soustraire
AI - accumulateur dans
AO - accumulateur sortie activer
RI - mémoire de programme dans
HLT - Halt
X - non utilisé
Voici ce que bits doivent être active pour chaque État de T pour une instruction donnée ainsi que l’adresse qu’ils devraient être dans le contrôle de ROM :
Fetch :
0: CO, MI - le compteur de programme sorties dans la MAR
1: CE - le compteur est activé pour le prochain signal de synchronisation
2: RO, II - l’octet adressé est émise par la RAM dans le registre d’instruction
NOP :
3: X
4: X
5: X
LDA :
6: IO, MI - l’adresse dans le registre d’instruction est transférée à la MAR (le plus bas quatre bits)
7: RO, AI - l’octet adressé est sortie de la mémoire dans l’accumulateur
8: X
AJOUTER :
9: IO, MI - l’adresse dans le registre d’instruction est transférée à la MAR (le plus bas quatre bits)
10 : RO, BI - l’octet adressé est sortie de la mémoire dans l’accumulateur
11: EO, AI - la somme de l’accumulateur et le registre B est chargée dans l’accumulateur
VOID :
12 : IO, MI - l’adresse dans le registre d’instruction est transférée à la MAR (le plus bas quatre bits)
13 : RO, BI - l’octet adressé est sortie de la mémoire dans l’accumulateur
14: AI, SU, EO - la différence entre l’accumulateur et le registre B est chargée dans l’accumulateur
STO :
15 : IO, MI - l’adresse dans le registre d’instruction est transférée à la MAR (le plus bas quatre bits)
16 : AO, RO, RI - l’accumulateur sorties dans la mémoire de programme à l’emplacement dédié (RO et RI doivent être actifs pour une écriture sur la puce que j’ai utilisé)
17: X
DÉPARTS :
18 : OI, AO - les sorties de l’accumulateur dans le registre de sortie
19: X
20: X
JMP :
21: J, IO - le registre d’instruction charge le compteur de programme avec ses quatre bits le plus bas
22: X
23: X
HLT :
24 : HLT - un signal d’arrêt est envoyé à l’horloge
25: X
26: X
Votre ROM OP contient multiples de trois à chaque emplacement de mémoire. Bien sûr, c’est parce que chaque cycle prend trois États d’exécution. Par conséquent, les données traitées pour votre ROM OP sera :
0 - 3
1 - 6
2 - 9
3 - 12
4 - 15
5 - 18
6 - 21
7 - 24
Pour programmer la puce de votre choix, vous avez beaucoup d’options différentes. Vous pourriez acheter un programmateur d’EEPROM et EPROM, mais ils coûtent généralement une somme d’argent considérable. J’ai construit un programmeur de maquette pour ma ROM qui est exploité par déplacer le fils et le contrôle de l’écriture et lecture activez épingles par boutons poussoirs. Plus tard, j’ai simplifié le processus et conçu un programmeur Arduino pour mon mémoire NVRAM spécifiquement. Je vais joindre le code tel qu’il peut être facilement modifié pour programme puce de presque n’importe quelle mémoire parallèle que vous utiliseriez pour ce projet.