Question:
Comment un non-FPGA (c'est-à-dire un PC avec CPU, RAM, disque dur) imite-t-il les portes logiques?
user3716057
2014-07-17 20:18:06 UTC
view on stackexchange narkive permalink

Je sais qu'un FPGA utilise des tables de consultation (LUT) pour synthétiser des portes logiques. Une LUT est un bloc de RAM qui est indexé par un certain nombre d'entrées. La sortie est la valeur stockée à cette adresse mémoire. La magie est que la LUT peut être programmée pour afficher tout ce que vous voulez pour une entrée particulière. Ainsi, une LUT peut être programmée avec la table de vérité de n'importe quelle porte logique afin de l'imiter! C'est ainsi qu'un FPGA synthétise les portes logiques que vous spécifiez dans votre code HDL.

Je pensais l'autre jour, comment un ordinateur normal imite-t-il les portes logiques? Pour autant que je sache (ce qui n'est pas loin), si j'écris un programme en C ++, il doit d'abord être compilé en code machine pour que le CPU puisse le lire. Ensuite, lorsque j'appuie sur "run", le code machine va en mémoire pour attendre le traitement par le CPU. Je ne suis pas très clair sur ce qui se passe ensuite, mais à un moment donné, le processeur doit avoir exécuté les opérations logiques que mon programme contient, non? Contrairement à un FGPA, le processeur ne peut pas simplement synthétiser les ressources dont il a besoin. Alors, comment exécute-t-il le programme?

Mes suppositions:

  1. Le CPU a un certain nombre de portes logiques pré-construites. Lorsqu'il rencontre une instruction AND dans le code C ++ qu'il est en cours d'exécution, il utilise l'une de ses ANDgates. S'il voit une instruction OR, il utilise l'une de ses portes OR; s'il voit une instruction IF, il utilise l'une de ses portes IF; etc.

  2. Ou, la logique est implémentée en mémoire d'une manière similaire à une LUT. Cela a plus de sens pour moi car cela ne repose pas sur un nombre limité de ressources de porte. Si mon programme nécessite des tonnes de logique OU par exemple, le processeur ne sera pas goulot d'étranglement par un manque de portes OU.

Alors, à quelle distance suis-je?

Edit: Merci pour les réponses à tous, j'ai beaucoup appris sur les processeurs et les ALU. En outre, la "porte IF" dans ma première hypothèse est une faute de frappe, qui devrait être "porte OU" (bien que ce ne soit qu'un exemple, n'importe quelle porte logique ferait l'affaire). Désolé pour cette confusion.

Recherchez quelque chose comme "CPU 8 bits bricolage" ou quelque chose de similaire sur Google.Cela vous donnera un aperçu de bas en haut, plutôt que de haut en bas.
Je n'ai pas beaucoup d'expérience dans ce domaine, mais je suis presque sûr que c'est à cela que servent les mots d'instructions en langage machine.
Six réponses:
Chris Stratton
2014-07-17 20:51:45 UTC
view on stackexchange narkive permalink

En fait, votre première hypothèse n'est pas aussi lointaine que certains le prétendent.

Un processeur est construit autour de quelque chose appelé "Unité logique arithmétique" (ALU) et une implémentation simpliste de cela est d'avoir le portes logiques mettant en œuvre toutes les opérations de base câblées aux entrées en parallèle. Tous les calculs élémentaires possibles sont ainsi effectués en parallèle, la sortie de celui réellement souhaité étant sélectionnée par un multiplexeur.

Dans un processeur extrêmement simple (modèle de tableau de craie), quelques bits de l'opcode de l'instruction en cours d'exécution sont câblés à ce multiplexeur pour lui indiquer le résultat de la fonction logique à utiliser. (Les autres résultats indésirables sont tout simplement gaspillés)

La technologie réelle utilisée pour implémenter les calculs dans l'ALU varie - il peut s'agir de "vraies" portes logiques, ou de LUT si le CPU est implémenté à l'intérieur un FPGA basé sur LUT (un très bon moyen de comprendre l'essentiel du calcul de programme stocké est de concevoir un processeur simple et de le construire dans un simulateur logique et peut-être ensuite un FPGA).

Oui, c'est ce à quoi je voulais en venir dans ma première supposition.Ainsi, lorsque le CPU a besoin de faire de la logique, il utilise les portes (ou les LUT ou toute autre technologie) de son ALU pour effectuer l'opération.Est-il possible que le processeur soit bloqué par son ALU en raison de ressources de calcul limitées?Par exemple, à chaque cycle d'horloge, l'ALU ne peut effectuer qu'un nombre de calculs limité par le nombre de portes pertinentes dont il dispose.Tant que le FPGA a de la place, il peut simplement construire plus de portes pour aller plus vite.Je me rends compte que la logique est exécutée en parallèle sur le FPGA vs séquentiellement pour le CPU, mais là
doit être un avantage au nombre brut de portes, non?
Un CPU classique n'exécute qu'un seul calcul * utile * par horloge (au plus, souvent moins) puisque de tous les calculs possibles exécutés en parallèle, un seul est réellement * désiré *.Cependant, les techniques modernes incorporent souvent plusieurs unités d'exécution parallèles, soit en faisant la même chose à plusieurs ensembles de données (en particulier les GPU sur une carte graphique), soit en poursuivant deux possibilités avec la mauvaise mise au rebut (la branche conditionnelle sera-t-elle prise ou non?), ou en tant que cœurs distincts exécutant différents threads de programme.Mais ce n'est pas anodin de rendre quelque chose plus rapide simplement en lui jetant plus de portes.
Je vois.Ainsi, si un CPU avait besoin d'exécuter de nombreux XOR, par exemple, une ALU avec un grand nombre de portes XOR ne ferait pas nécessairement que cela se produise plus rapidement qu'une ALU avec un nombre inférieur.Alors, qu'est-ce qui dicte le nombre optimal d'un type particulier de porte sur une ALU?
Aussi, vouliez-vous dire "tous les calculs possibles s'exécutent séquentiellement", au lieu de "en parallèle"?
Non, ils s'exécutent en parallèle, mais tous les résultats sont ignorés sauf celui qui correspond au calcul qui a été réellement demandé par l'opcode.Le nombre de portes dans chaque étage de pipeline de chemin de données distinct * est essentiellement déterminé par la largeur du mot et la complexité de l'opération combinatoire effectuée.
@user3716057: Cela dépend de l'architecture de votre processeur.x86 a des instructions SIMD qui permettent plusieurs opérations en parallèle, et divers [processeurs vectoriels] (http://en.wikipedia.org/wiki/Vector_processor) ont été utilisés pour traiter de grandes quantités de données en parallèle.Les GPU sont l'une de ces incarnations d'une idée similaire, d'une puce conçue pour des calculs hautement parallèles.
@user3716057: La plupart des processeurs haut de gamme modernes sont livrés avec plus d'un ALU.C'est ainsi qu'ils peuvent faire plus d'une opération mathématique / logique à la fois.De plus, les processeurs sont parfois livrés avec des ALU complexes séparées qui peuvent multiplier / diviser / ajouter / ou / xor etc. et des ALU simples qui ne peuvent ajouter que / ou / et / xor afin de pouvoir planifier des opérations complexes et simples ensemble.
Dave Tweed
2014-07-17 20:40:36 UTC
view on stackexchange narkive permalink

Assez loin.

Un CPU est composé de vraies portes (LUT non programmables). Les opérations clés sur les données sont effectuées dans un bloc de logique souvent appelé ALU (unité arithmétique-logique). À l'intérieur de ce bloc se trouve un ensemble de portes qui peuvent, par exemple, ET deux opérandes ensemble, bit par bit. Il existe un autre ensemble de portes qui peuvent les additionner, et ainsi de suite.

Lorsque vous exécutez des instructions sur le CPU, les instructions sont décodées une par une, et la logique associée à cette instruction est activée dans le ALU.

La différence est un compromis entre le temps et la zone. Si vous avez beaucoup de AND à faire, vous pouvez les faire dans un FPGA en utilisant plusieurs LUT en parallèle et les faire en peu de temps. Si vous les faites dans un processeur, elles seront exécutées une par une (séquentiellement) dans le petit bloc de logique conçu pour cette tâche.

N'est-ce pas à peu près ma première hypothèse?
@user3716057, non, pas tout à fait.Par exemple, il n'y a pas de porte «si».Votre code est décomposé en un tas d'instructions individuelles (limité à la largeur des bus CPU, etc.).Cela peut être des centaines d'instructions pour très peu de code de niveau supérieur.Comme Dave l'a dit, l'ALU effectue des opérations logiques, comme AND, OR et des opérations arithmétiques, comme ADD, SUB.Une instruction "if" dans votre code C ++ peut être de nombreuses instructions machine.
La partie porte ET était bien, mais vous avez déraillé avec la porte IF, qui n'existe pas.Une instruction IF est transformée en une * série * d'instructions qui comparent des valeurs, tandis que la simulation présente le résultat comme si elle * avait * été effectuée en parallèle.
Oups faute de frappe, c'était censé être OR.Ou vraiment n'importe quelle porte.A part ça, je ne sais pas comment ma réponse est "assez éloignée" de la réponse de Dave.
@user3716057: C'est assez loin dans le sens où il n'utilise pas "l'une de" ses portes ET mais déclenche plutôt l'opération ET de l'ALU qui ** toujours ** opère sur la longueur du mot (8/16/32/68 bits)à la fois à ET deux registres ensemble.Si vous souhaitez opérer sur un seul bit, vous devez utiliser de manière créative les opérations AND, OR, XOR, Left / Right Shift pour obtenir ce que vous voulez.
whatsisname
2014-07-17 20:45:33 UTC
view on stackexchange narkive permalink

Le CPU n'a pas seulement «un certain nombre» de portes logiques pré-construites. Un processeur moderne compte entre 50 millions et plusieurs milliards de transistors, ce qui correspond à plusieurs millions de portes.

Le CPU a déjà toutes les ressources nécessaires pour exécuter votre programme C ++. Les ressources fournies remplissent le jeu d'instructions défini par cette plate-forme matérielle, que ce soit x86, ARM, MIPS, etc. Ces instructions incluent toutes les instructions arithmétiques, le déplacement de la mémoire, les conditions, etc. Regardez les jeux d'instructions de votre plate-forme pour comprendre du fonctionnement réel du CPU.

Quand le CPU effectue une opération "ET", alors qu'il utilise quelque part une porte ET, il y a des millions de portes ET dans le CPU pour toutes sortes d'opérations.

Ces instructions sont toutes implémentées dans la disposition des transistors dans la puce. Pour voir comment certains d'entre eux fonctionnent, recherchez des éléments tels que des bascules, des ajouts ou d'autres logiques numériques.

Mais c'est un nombre limité de portes.Ce à quoi je veux en venir avec ma question, c'est l'idée suivante: si un FPGA a besoin de faire beaucoup de XOR par exemple, il peut le faire plus rapidement en synthétisant plus de portes XOR et en faisant toute la logique en parallèle.Tant qu'il reste de l'espace sur le FPGA, d'autres portes peuvent être construites.Le CPU doit être préparé à toute logique possible, il ne peut pas créer uniquement la logique dont il a besoin.Donc, si mon programme utilise des tonnes de logique XOR mais rien d'autre, le processeur ne pourra pas exploiter toutes ses ressources.
@user3716057: Tout est question de compromis.Il existe des processeurs spéciaux capables de faire de nombreux XOR en parallèle si c'est ce dont une application particulière a besoin.Les x86 populaires ont des instructions SIMD pour ce genre de chose.Les FPGA conviennent à de nombreuses applications et les processeurs à usage général sont bons pour beaucoup d'autres.
Votre première phrase est totalement erronée.Bien sûr, le CPU a un certain nombre de portes.Vous semblez vous opposer à cela parce que c'est un grand nombre, ce qui est ... étrange.
@OllieFord: J'ai dit que pour deux raisons, une, c'est que dire qu'un CPU a juste "un certain nombre de portes" donne une mauvaise idée, comme dire que le logiciel est juste "des uns et des zéros".Bien sûr, les deux sont vrais, mais ils confondent l'idée.Deuxièmement, les processeurs d'aujourd'hui ne sont pas vraiment conçus porte par porte, ils sont conçus par des blocs fonctionnels composés de quelques à plusieurs milliers de portes et de transistors, disposés par des logiciels spécialisés.Se concentrer sur les portes, c'est se concentrer sur le mauvais niveau.
Je ne suis pas d'accord - je pense que pour une bonne compréhension, c'est une excellente idée de savoir ce qu'est réellement une porte logique, comment ils forment certains de ces blocs fonctionnels, et ainsi de suite jusqu'au fonctionnement de votre compilateur.
RBerteig
2014-07-18 02:22:50 UTC
view on stackexchange narkive permalink

D'autres réponses ont abordé les questions spécifiques à un niveau de détail des écrous et boulons, mais je pense qu'il y a ici une opportunité de regarder les choses sous un angle différent. Les processeurs ont aujourd'hui plusieurs millions (des milliards de processeurs de bureau de la génération actuelle) de transistors mettant en œuvre un nombre comparativement élevé de portes. Bien que seules quelques-unes de ces portes soient réellement utilisées pour implémenter le calcul XOR , il est difficile de les voir dans l'immense forêt de fonctions de support.

Les anciens ici ( Je pense que je peux admettre avoir aussi gagné cette étiquette) regardé cette forêt grandir, mais il est facile de voir comment un nouveau venu sur le terrain avec juste une petite expérience de conception numérique pourrait avoir du mal à voir les parallèles entre un pur-matériel calcul et un processeur multicœur moderne avec de nombreuses couches de cache, prédiction de branche et exécution en pipeline.

Je vous recommanderais de trouver les fiches techniques et le matériel de référence du programmeur pour plusieurs (mais un à la fois) des anciens microprocesseurs 8 bits des années 70 et 80. Dans de nombreux cas, vous pouvez même en trouver des implémentations open source sous la forme d'émulateurs logiciels purs ainsi que Verilog ou VHDL pour une utilisation dans un FPGA.

Je recommande de commencer ici car le 8080 (utilisé dans l'Altair 8800 de 1975 qui a lancé le marché informatique le plus moderne), MC6800 (est apparu dans de nombreux petits ordinateurs à la fin des années 70), 6809 (RadioShack Coco et autres), 6502 (Apple 1, Apple] [et bien d’autres) et bien d’autres comme eux étaient en grande partie conçu et mis en œuvre par des ingénieurs uniques ou de très petites équipes et devait donc être pleinement compris par une très petite équipe. Ils démontrent également le nombre minimum de fonctionnalités nécessaires pour un processeur commercialement réussi sans ajouter de mémoire supplémentaire, de cache ou de périphériques.

Une grande partie du patrimoine 8080 est préservée sur la page de la famille Z80. Le Z80 était l'extension Zilog de la plate-forme Intel 8080, et les cœurs qui l'implémentent peuvent encore être trouvés aujourd'hui. Un Verilog 8080 est disponible sur OpenCores.org, ainsi que plusieurs autres implémentations 8080 et Z80. Une richesse de documentation, de systèmes d'exploitation, d'assembleurs et de compilateurs existe pour l'architecture MCS80 et sa vaste famille.

OpenCores a un grand nombre de cœurs open source. Il existe près de 100 processeurs purs, ainsi qu'une cinquantaine de SOC supplémentaires qui pourraient servir de base à une exploration plus approfondie.

Par curiosité, avez-vous une idée de la mesure dans laquelle les caractéristiques architecturales des premiers micro-ordinateurs ressemblaient à des ordinateurs (non "micro") antérieurs?Je pense que la plupart des non-micro-ordinateurs fonctionnaient généralement sur des mots de plus grande taille, mais je peux certainement imaginer que pour certaines applications, un ordinateur 8 bits ou même 4 bits aurait pu être utile.
Par exemple, je pense que même un ordinateur 4 bits pourrait probablement exploiter un système de score automatisé à temps partagé pour 16 pistes de bowling s'il pouvait assembler trois registres de quatre bits pour former des adresses de 12 bits;construire un ordinateur 4 bits à partir de pièces distinctes semblerait être moins cher que d'essayer de concevoir un système de notation automatisé d'une autre manière.
@supercat Certaines calculatrices de poche étaient basées sur un processeur 4 bits, qui convenait assez bien à l'arithmétique BCD en utilisant un chiffre décimal à la fois.Les résultats à 12 chiffres décimaux étaient courants.Il y avait des premières machines qui utilisaient une ALU 1 bit en série pour effectuer des calculs utiles sur des nombres plus importants.De nombreuses machines anciennes avaient des tailles distinctes pour l'ALU, l'adresse et le mot d'instruction.Le 8080 avait un bus d'adresse 16 bits avec une ALU 8 bits et un accumulateur, par exemple.
Des "calculatrices de poche" sont-elles antérieures à l'invention du microprocesseur?Est-ce que l'un de ceux qui ont utilisé une forme quelconque de CPU «documenté» qui a extrait du code d'un magasin de code adressable (ROM), par opposition à simplement utiliser la logique séquentielle pour déclencher diverses actions?
Simon Richter
2014-07-17 21:05:58 UTC
view on stackexchange narkive permalink

Comme vous l'avez observé, le contenu de la table de recherche détermine si une certaine LUT est une porte OU (0, 1, 1, 1) et une porte ET (0, 0, 0, 1), un XOR (0 , 1, 1, 0) etc.

La table de recherche elle-même est implémentée en utilisant des portes codées en dur, c'est-à-dire que le résultat est

  (lut [0] AND NOT a AND NOT b) OR (lut [1] AND a AND NOT b) OR (lut [2] AND NOT a AND b) OR (lut [3] AND a AND b)  

Si vous regardez cette ligne par ligne, vous pouvez voir qu'une seule de ces lignes peut jamais avoir une ligne logique, donc cela sélectionne l'une des entrées LUT. De la même manière, vous pouvez également choisir entre plusieurs sources de données:

Si op1 est le numéro de registre à deux bits, l'opérande lhs peut être sélectionné comme

  (reg0 AND NOT op1 [0] AND NOT op1 [1]) OR (reg1 AND op1 [0] AND NOT op1 [1]) OR (reg2 AND NOT op1 [0 ] AND op1 [1]) OR (reg3 AND op1 [0] AND op1 [1])  

Ensuite, opcode peut sélectionner l'opération à effectuer:

  ((lhs AND rhs) AND NOT opcode [0] AND NOT opcode [1]) OR ((lhs OR rhs) AND opcode [0] AND NOT opcode [1]) OR ( (lhs + rhs) AND NOT opcode [0] AND opcode [1]) OR ((lhs - rhs) AND opcode [0] AND opcode [1])  

res = (lhs + rhs) est défini comme

  res [0] = lhs [0] XOR rhs [0]; res [1] = lhs [1] XOR rhs [1] XOR (lhs [0] AND rhs [0]); ...  

Donc à la fin, je peux tout réduire à des portes fixes, ne laissant que la variable d'entrées. Un FPGA est l'une de ces variantes, où les portes sont disposées de manière à effectuer une recherche de table.

Dans un système réel, j'optimiserais en plus, par exemple combiner des signaux équivalents et tenter de minimiser la commutation des portes lorsque ce signal est ensuite éliminé par une porte ET et n'aura aucun effet sur le résultat:

  is_and_op = NOT opcode [0] AND NOT opcode [1];  

Plusieurs éléments de circuit veulent savoir si nous exécutons actuellement une opération "et".

  lhs_and = lhs AND is_and_op; rhs_and = rhs AND is_and_op;  

Sinon, nous passons des zéros dans les portes effectuant l'opération.

  res_and = lhs_and AND rhs_and;  

Ceci est l'opération réelle, comme auparavant.

  res = res_and AND is_and_op OR ...;  

La sélection peut également utiliser notre raccourci.

Ma question portait davantage sur la manière dont un processeur effectue des opérations logiques.Je sais comment les FPGA utilisent les LUT pour construire la logique.Comme l'a souligné une autre affiche, les processeurs n'utilisent pas les LUT de cette manière.
Mon point est qu'une LUT est juste un tas de portes fixes qui implémentent une logique de sélection qui peut ensuite être utilisée pour implémenter une «porte» en fournissant certaines entrées au processus de sélection.Autrement dit, tout ce que vous avez à faire est de fournir des entrées, pendant que le matériel est fixe.
John
2014-07-18 16:42:57 UTC
view on stackexchange narkive permalink

La différence entre un CPU et un FPGA est le parallélisme. Les FPGA sont très bons pour effectuer un certain nombre de tâches (logiquement) plus simples à la fois avec un délai minimal. Une logique et des séquences d'opérations plus complexes sont mieux prises en charge par l'ALU (unité arithmétique et logique) du CPU.

Si vous êtes intéressé par une émulation logicielle commune de conception de portes, qui est généralement (si naïvement) utilisée pour simplifier les fonctions logiques booléennes, jetez un œil à l ' algorithme Quine – McCluskey. Je l'ai utilisé pour concevoir mon propre logiciel de synthèse à Uni lorsque je ne pouvais pas transférer les studios coûteux, et pour le plaisir.



Ce Q&R a été automatiquement traduit de la langue anglaise.Le contenu original est disponible sur stackexchange, que nous remercions pour la licence cc by-sa 3.0 sous laquelle il est distribué.
Loading...