Conception CPU très simple dans LogiSim


8

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

1
Êtes-vous prêt à partager votre fichier .circ Logisim CPU existant? Et pour rendre la vie un peu plus compliquée, vous devez lire attentivement et comprendre l'aide de Logisim, sous la rubrique "Propagation de la valeur". Si vous ne l'avez pas déjà fait. (Vous l'avez peut-être, compte tenu de tout le travail que vous avez déjà appliqué. Très heureux de vous entendre prendre cela!)
jonk

@jonk merci pour les belles paroles. Modification de la publication avec les fichiers .circ associés.
Will Hodges

S'agit-il alors de 6 fichiers? (Je suppose que c'est pour LogiSim 2.7.1, 2011?)
jonk

@jonk oui, c'est le cas, sur les deux questions
Will Hodges

Comment gérez-vous la soustraction? Utilisez-vous le / Q d'un verrou d'entrée vers l'une des entrées A / B de votre ALU et modifiez-vous le report? Ou une autre méthode?
jonk

Réponses:


3

Je déteste publier un "lien uniquement" comme réponse, mais je pense que vous devriez être informé du travail de Warren Toomey avec les processeurs dans Logisim, car c'est probablement exactement ce que vous recherchez.

Il a quelques tutoriels construisant jusqu'à un processeur raisonnablement simple ici ...

http://minnie.tuhs.org/CompArch/Tutes/

Et si cela ne fait pas flotter votre bateau, il a un processeur plus sophistiqué ici ...

http://minnie.tuhs.org/Programs/UcodeCPU/

... Tout cela est bien expliqué et peut être téléchargé dans des fichiers .circ.


Un autre grand processeur / ordinateur DIY, et sans doute plus fonctionnel, est Magic-1, disponible sur http://www.homebrewcpu.com/ . Bien que cela ne soit pas fait dans Logisim, il est assez bien documenté, y compris des photos, un schéma, une description. C'est aussi plus qu'un simple processeur dans un simulateur. Il dispose d'un compilateur ANSI C, d'un système d'exploitation et de certains logiciels. Il a également l'avantage distinct d'avoir été intégré au matériel. En fait, il est actuellement opérationnel et sert des pages Web!


Enfin, The Elements of Computing Systems et le site associé nand2tetris.org se présentent comme la ressource d'information n ° 1 recommandée pour construire votre propre ordinateur à partir de zéro chaque fois que je l'examine. Beaucoup (tout?) Le contenu est gratuit je crois. YouTube serait d'accord; de nombreuses personnes ont réalisé des projets à partir de cette seule source.


1
La vidéo Youtbue de Ben Eater sur la construction d'un ordinateur de planche à pain 8 bits est également très utile!
Francis Cugler

1

Je pense que vous manquez un aspect clé du fonctionnement des ALU. Habituellement, chaque bit de l'accumulateur est connecté à chacun des différents blocs fonctionnels via un démultiplexeur. En utilisant un octet de commande, la fonction est sélectionnée et chaque bit de l'accumulateur est connecté à l'entrée appropriée du bloc fonction. La taille du démultiplexeur détermine le nombre de fonctions que l'ALU peut gérer. Dans mon exemple très grossier montré ci-dessous, une ALU avec une entrée 4 bits pourrait référencer 16 fonctions différentes en utilisant le démultiplexeur:

Connexion de l'accumulateur à différents blocs fonctionnels au sein d'une ALU

Notez que dans la plupart des processeurs, cette conception est optimisée en un gâchis de portes pour réduire le nombre de transistors.

Plus de fonctions peuvent être utilisées en ayant un registre de commande plus grand, mais cela nécessiterait également plus de cycles d'horloge pour charger la commande.

Je recommande fortement de lire le livre suivant si vous souhaitez en savoir plus sur la conception numérique: Fundamentals of Logic Design 7th ed.


Cette réponse confond les instructions avec les opérations ALU. Plus précisément, ce démultiplexeur serait juste utilisé pour sélectionner quelle opération arithmétique choisir pour une instruction arithmétique. Vous alimenteriez le démultiplexeur avec, disons, 3 bits sur une instruction de 8 bits, pour choisir quelle opération arithmétique. Vous avez besoin d'un mécanisme entièrement séparé pour décoder et séquencer les instructions en général. En passant, la plupart des processeurs que j'ai examinés n'utilisent pas un démultiplexeur comme celui-ci dans l'ALU, mais utilisent un désordre de portes optimisé pour effectuer la bonne opération.
Ken Shirriff

1
@KenShirriff J'ai apporté quelques modifications pour plus de clarté. N'hésitez pas à apporter quelques modifications comme bon vous semble.
Takide

1

Il semble que vous soyez sur la bonne voie.

Lorsque vous planifiez vos micro-instructions, vous devrez définir clairement dans votre esprit le modèle de "trafic" pour votre mouvement de données à travers vos différents blocs. La réalisation d'un ADD nécessitera plusieurs étapes. Si vous avez des registres de maintien pour vos deux opérandes ALU, ceux-ci devront être chargés à partir de la RAM, ou d'un registre ou d'un bus. Si vous avez un bus interne partagé, vous devrez peut-être charger un opérande à la fois. Une fois que vous savez quels octets (adresse, littéral immédiat, données RAM, pointeur) doivent se déplacer où, planifiez l'ordre du mouvement des octets à travers le ou les bus dans et hors des différents registres. Vous pouvez rester bloqué et avoir besoin d'ajouter un registre de maintien interne car une valeur intermédiaire doit être conservée jusqu'à la prochaine étape de micro-instruction.

Je pense que la chose que vous soupçonnez de manquer est la complexité requise pour que la logique prenne l'instruction ou l'opcode et la traduise en plusieurs états à l'intérieur de votre CPU. Cela peut être complexe, mais il est possible de créer une machine à états quelque peu simple puis de l'étendre avec des concepts logiques de base.

Par exemple, supposons que vous créez les étapes de micro-instruction pour une opération MOVE. Cela pourrait être décrit de manière approximative en 3 étapes: 1) Assert le contenu du registre source sur le bus interne, 2) stroboscopique l'horloge d'écriture du registre cible, 3) Désaffirmez le contenu du registre source du bus interne. Les étapes 1) à 3) décrivent la synchronisation pour une autorisation de sortie de registre (OE) et une autorisation d'écriture de registre (WE) qui pourraient être sélectivement distribuées à tout registre source et tout registre cible connecté au bus interne partagé avec des démultiplexeurs.

Si vous n'avez pas l'habitude de créer des machines à états finis, il peut être utile d'examiner les différentes approches pour vous donner un autre élément de base pour générer les signaux de contrôle à partir de votre micro-séquenceur.

Restez avec elle. La quantité de connaissances que vous acquerrez sera phénoménale. Et j'espère que vous vous amuserez beaucoup.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.