Comment savoir si un nombre binaire est nul

16

J'implémentais l'ALU à partir des spécifications données dans mon livre The Elements of Computing Systems. Je suis coincé sur un seul problème. Comment savoir si un nombre donné est nul ou non. Une chose que je peux faire est ou tout dans le bus, puis appliquer un pas de porte sur cela. Mais il doit y avoir une autre solution élégante.

Rick_2047
la source
6
ça ne sonne pas comme si vous étiez vraiment coincé - plutôt comme si vous
n'étiez
7
une entrée X NOR est la solution élégante. Afin de déterminer si le registre contient zéro, chaque bit doit être examiné pour voir s'il contient un 0 logique. Vous avez spécifié que vous avez besoin d'une sortie à un seul bit. Par conséquent, vous avez besoin d'une fonction avec des entrées X et une sortie, comme un NOR.
W5VO

Réponses:

14

Il n'y a tout simplement aucun moyen de contourner OU tous les bits, aussi insatisfaisant que cela puisse paraître. Cependant, vous n'êtes pas non plus limité à deux portes d'entrée en silicium. Vous pouvez créer une porte NOR à 4 entrées dans la logique CMOS en plaçant 4 transistors de type p de série dans le réseau de pullup et 4 transistors de type n parallèles dans le réseau de conversion. Cela réduit la profondeur de votre topologie d'arbre et donc votre retard de propagation. Vous ne pouvez pousser cette théorie jusqu'à présent qu'avant que la chute de tension cumulée à travers les transistors de la série ne fasse que le pull-up ne soit pas assez "1" ... quatre est une bonne règle si je me souviens bien.

vicatcu
la source
Pour un plus grand nombre de bits, l'utilisation de portes NOR et NAND alternées aurait-elle du sens? Par exemple, avec un fan-in de 4 portes, un test de zéro 64 bits pourrait utiliser 16 portes NOR alimentant un résultat de 1 si les 4 bits sont de zéro à 4 portes NON-ET qui alimentent un résultat de 0 si tous les 4 bits sont 1 (tous 16 bits d'origine valaient 0), ces quatre résultats seraient ensuite envoyés à une porte NOR finale. (Je ne suis pas un EE, mais cela semble être mieux que d'utiliser des onduleurs intermédiaires - pour ramener le résultat zéro à 0 - et d'utiliser uniquement des portes NOR.)
Paul A. Clayton
Il peut également exister des moyens de replier partiellement la latence de la détection zéro dans la latence d'addition.
Paul A. Clayton
Qu'en est-il de l'utilisation de NMOS: une résistance de rappel et des transistors X pour ramener le niveau à 0 si une entrée est 1?
Oskar Skog
13

La fonction logique est la porte NOR. C'est la fonction logique la plus simple qui existe.

Rex Logan
la source
8

La solution typique avec les machines à 8 bits était que l'ALU produirait un certain nombre de bits «indicateurs» qui représenteraient le résultat de l'opération la plus récente. Bien qu'il soit possible d'avoir un nombre quelconque de bits de drapeau autour (c'est-à-dire que vous pourriez avoir un drapeau 'Z' pour chaque registre de votre CPU), c'est généralement la chose que vous venez de calculer qui vous intéresse le plus, donc il est logique de procéder ainsi.

Certains de ces anciens processeurs définiraient automatiquement des bits de drapeau pour presque tous les mouvements de données, tandis que d'autres vous obligeraient à coller une instruction de `` comparaison '' spécifique dans votre code si vous avez soudainement besoin de savoir si un certain registre était nul. Et que vous fournissiez une vérification de zéro pour chaque registre ou simplement pour ce qui vient d'être calculé, il n'y a vraiment pas de moyen plus simple de vérifier «si ce mot est zéro» que de simplement OU tous les bits ensemble.

JustJeff
la source
1
Cela est également typique des puces ARM 32 bits et peut être typique de la plupart des architectures. Pour l'ARM, l'APSR (Application Program Status Register) contient N, Z, C, V et Q bits (Negative, Zero, Carry, oVerflow, saturateQ) bits pour fournir d'autres fonctions en plus du bit zéro que vous recherchez. . Ceux-ci peuvent ou non être utiles à votre machine.
Kevin Vermeer
J'ai bien trouvé la solution ou, mais cela me dérange, je dois utiliser tellement de logique pour obtenir un seul bit. Il doit y avoir une solution élégante.
Rick_2047
@ Rick_2047 - vous n'avez pas mentionné avec quoi vous implémentez cela, mais je suppose un FPGA? Cela me dérangerait aussi, d'avoir à attacher n'importe quel nombre de blocs logiques juste pour faire une porte de fan-in élevée. C'est une bonne raison de n'en mettre qu'un seul.
JustJeff
pas exactement un FPGA mais un simulateur HDL et matériel.
Rick_2047
3

Certains processeurs, MIPS par exemple, ont un registre qui contient toujours zéro, ce qui rend le test d'un autre registre à zéro très rapide.

Leon Heller
la source
Comment vérifier le numéro si j'ai un registre contenant zéro? Je veux également générer un seul bit qui est vrai ou faux selon que le bus de 16 bits est nul ou non
Rick_2047
1
un comparateur ... qui dégénère en une porte NOR glorifiée ...
vicatcu
Il pourrait gagner quelque chose de cette façon si les registres sont bon marché (ils sont dans un bloc SRAM dans un FPGA) et il a quand même besoin d'une instruction de comparaison de registres pour d'autres raisons.
jpc
@vicatu - en fait, si vous voulez comparer deux nombres à N bits, vous aurez besoin de N portes XOR à 2 entrées. La chose OR / NOR n'est bonne que pour les tests zéro.
JustJeff
mais finalement j'aurais besoin d'utiliser autant de portes que j'ai de bits d'entrée ou au moins autant de transistors.
Rick_2047
0

Je suis un grand fan de or_reduce- la plupart des outils de synthèse l'optimiseront pour la meilleure implémentation car ils savent exactement ce que vous faites.

Aaron D. Marasco
la source