Je suis actuellement junior au lycée et je m'intéresse à l'ingénierie informatique / électrique, en particulier la conception de microprocesseurs. J'ai lu Code par Charles Petzold , et j'ai commencé à lire le Wikibook Microprocessor Design (qui semble être incomplet.) En lisant Code , je comprends la logique de base derrière un CPU, et j'ai commencé à en construire un dans LogiSim. Le chapitre 17 du Code détaille le CPU que je veux construire, mais les circuits manquent de composants clés - signaux d'horloge et décodage des instructions. Certains des signaux d'horloge semblent être assez évidents (le PC semble avoir besoin d'un signal d'horloge stable) mais d'autres (comme la façon de verrouiller les valeurs RAM), j'ai dû réfléchir et essayer de travailler.
Je peux construire un accumulateur fonctionnel (on ne peut pas l'appeler avec précision ALU, je pense, car il manque la partie L) qui bascule entre l'addition et la soustraction avec une seule entrée, et je comprends que c'est tout ce dont j'ai besoin pour la partie arithmétique - une fois que j'ai obtenu les opcodes de saut, je peux implémenter la multiplication et la division dans le code. La partie avec laquelle je me bats est le décodage des instructions. À travers certaines recherches sur Google, je vois que chaque opcode doit être interprété comme plusieurs micro-instructions, mais je ne sais pas comment j'en ai besoin pour fonctionner. Actuellement, mon décodeur d'instructions n'est qu'un circuit d'analyse combinatoire avec une seule sortie binaire pour chaque opcode - 13 en tout.
La façon dont le code fonctionne est qu'il a une valeur de code 8 bits (j'utilise uniquement l'octet bas de gamme), puis deux valeurs d'adresse 8 bits distinctes que je combine ensuite pour être l'adresse 16 bits entrée dans la RAM. Afin de verrouiller les valeurs, j'ai un compteur séparé qui compte jusqu'à 10b, puis réinitialise à 00b. C'est l'entrée d'horloge pour chaque verrou à tour de rôle (pour les trois verrous, il y a a, b et c. Les secondes horloges ont un be 1 tandis que b & c sont 0, puis b est 1 et 1 & c sont 0, puis c est un et 1 & b sont 0, puis il se réinitialise). Mais sur des instructions telles que ADD 000Ah, le PC passe à 000AH ... qui est censé être ajouté à l'accumulateur, mais est en fait verrouillé dans le verrou de code, puis est interprété comme le prochain opcode, ce qui fait que tout se déroule fou.
J'ai l'impression de manquer de grandes informations concernant le décodage des instructions et la façon dont je dois faire les signaux d'horloge ...
Voici les fichiers LogiSim .circ: https://dl.dropboxusercontent.com/u/61676438/PetzoldMk5/8BitAdder.circ https://dl.dropboxusercontent.com/u/61676438/PetzoldMk5/8BitAdderSubtractor.circ https: // dl.dropboxusercontent.com/u/61676438/PetzoldMk5/8BitInverter.circ https://dl.dropboxusercontent.com/u/61676438/PetzoldMk5/8BitLatch.circ https://dl.dropboxusercontent.com/u/61676438/PetzoldMk5/ ID.circ https://dl.dropboxusercontent.com/u/61676438/PetzoldMk5/PetzoldMk5.circ
PetzoldMk5 est le processeur principal, reposant sur les autres fichiers à importer en tant que bibliothèques.
Voici une liste d'opcodes (tous binaires):
Load 0001
Add 0010
Add w/ Carry 0011
Sub 0100
Sub w/ Borrow 0101
Jump 0110
Jump w/ Carry 0111
Jump W/ 0 1000
Jump w/o C 1001
Jump W/o 0 1010
Store 1011
Halt 1100
Reset 1101