J'ai une question d'examen que je n'ai pas réussi à résoudre:
J'ai besoin de construire un circuit logique numérique qui reçoit un numéro de 4 bits et de revenir true
si le numéro est 0
, 7
ou 14
. Je n'ai qu'une seule XOR
porte (2 entrées), une NOR
(3 entrées), une NAND
(2 entrées) et un décodeur 3 à 8.
Je pense que cette question est insoluble, je n'ai trouvé aucune combinaison qui puisse le faire. Une idée de comment le résoudre?
Réponses:
J'ai écrit un algorithme en C # qui essaie toutes les combinaisons possibles de ceux-ci
Nor 3->1
Xor 2->1
Nand 2->1
et deDecoder 3->8
.Après l'avoir fait fonctionner pendant
7½ millions d'années2 heures, il a renvoyé42faux. Je crois que cela prouve que la question n'a pas de réponse car cet algorithme vérifie toutes les combinaisons possibles. :)On m'a demandé de le décrire, donc la partie suivante est une explication des parties du code, partie par partie. TL; DR - vous pouvez simplement passer au code à la fin :)
Parlons des lignes d'entrée, elles ont 0 ou 1 état et pour chacune des entrées possibles (0 à 15) elles ont des valeurs différentes:
pour la première ligne ça ressemble à ça: 0 1 0 1 0 1 ... La seconde est: 0 0 1 1 0 0 1 1 ... la troisième: 0 0 0 0 1 1 1 1 .... comme binaire en comptant ... vous avez l'idée: P
J'ai donc créé un objet qui représente chaque ligne dans chacun de ses états:
Comme il est dit, bitLine.IsActiveWhenInputIs [5] indique si la ligne était active lorsque l'entrée était à 5.
Ceci est un code qui crée complètement les lignes d'entrée:
Nous allons également créer des lignes de bits "toujours vrai" et "toujours faux" - pour fournir une entrée "0" ou "1" constante.
Maintenant, si vous remarquez, ce que nous recherchons est en fait un bitLine spécifique, celui qui est vrai lorsque l'entrée est 0, 7, 14. Représentons-le dans notre classe:
Cela a rendu les choses vraiment simples: ce que nous recherchons en fait est un moyen de "forger" ce nécessaire BitLine à partir de la ligne de bits d'entrée (c'est ainsi que je représente pour mon programme ce que je veux que ma sortie soit).
Maintenant, voici comment nous allons le: chaque fois que nous utilisons un élément logique sur nos lignes de bits comme
Xor
,Nor
,Nand
ou mêmeDecoder
, nous créons en fait une nouvelle Bitline \ s. Nous connaissons la valeur de chacune des lignes dans chaque entrée possible de 0 à 15, nous pouvons donc également calculer la nouvelle valeur bitLine dans chaque entrée possible!Nand Nor et Xor sont tous simples:
Pour chaque entrée possible, il représente la façon dont la nouvelle BitLine va agir.
La manipulation du décodeur est un peu délicate, mais l'idée est "si les bits à l'entrée représentent le nombre x en binaire, alors la x-ème ligne de bits de sortie sera vraie, tandis que toutes les autres seront fausses. Contrairement à l'autre , celle-ci obtient un tableau de lignes de bits et ajoute 8 nouvelles lignes de bits au tableau.
Maintenant, nous avons tous nos éléments de base, parlons donc de l'algorithme:
Nous allons faire un algorithme récursif, à chaque profondeur, il essaiera d'utiliser un autre élément (ni \ nand \ xor \ decoder) sur les lignes de bits actuellement disponibles, puis définira l'élément sur inutilisable pour la prochaine profondeur récursive. Chaque fois que nous arrivons en bas et que nous n'avons plus d'éléments à utiliser, nous vérifierons si nous avons une ligne de bit qui correspond à ce que nous recherchions.
Ce code vérifie à tout moment si le groupe de lignes actuel contient la ligne que nous recherchons:
C'est la fonction qu'il utilise pour vérifier si deux lignes sont égales:
Ok, alors maintenant pour la partie principale, voici l'algorithme principal:
Cette fonction reçoit une liste des bitLines disponibles, la longueur de la liste, un booléen représentant si chaque élément est actuellement disponible (xor / nor / nand / decoder) et un bitLine représentant le bitLine que nous recherchons.
À chaque étape, il vérifie si nous avons d'autres éléments à utiliser, sinon - il vérifie si nous archivons notre ligne de bit nécessaire.
Si nous avons encore plus d'éléments, donc pour chaque élément, il appelle une fonction censée gérer la création de nouvelles bitLines en utilisant ces éléments et appeler la profondeur récursive suivante par la suite.
Les fonctions de gestionnaire suivantes sont toutes assez simples, elles peuvent être traduites en "choisissez 2 \ 3 parmi les lignes de bits disponibles et combinez-les en utilisant l'élément approprié. Ensuite, appelez la profondeur suivante de la récursivité, juste que cette fois elle ne contiendra pas cet élément! ".
ce sont les fonctions:
Et voilà, nous appelons simplement cette fonction avec la ligne nécessaire que nous recherchons, et elle vérifie toutes les combinaisons possibles des pièces électriques pour vérifier s'il est possible de les combiner de telle manière qu'au final, une seule ligne sera sortie avec les valeurs nécessaires.
* remarquez que j'utilise la même liste tout le temps, donc je n'aurai pas besoin de créer de nouvelles instances de lignes de bits tout le temps. Je lui donne un tampon de 200 pour cette raison.
Voici le programme complet:
J'espère que cette fois c'est une explication valable: P
la source
Il s'agit d'une non-réponse, pour écarter la solution la plus évidente.
Cependant, la simplification de l'expression précédente est:
ce n'est pas prévu:
Pour cette raison, je pense que probablement une erreur dans la question, étant "nand" porte un "ni" un.
la source
Une réponse valide à votre question serait tout circuit qui renvoie toujours vrai. Parce que cela retournera vrai aussi si les nombres d'entrée sont 0,7 ou 14.
Je pense que la question devrait explicitement demander un circuit qui sort vrai si les nombres d'entrée sont 0,7 ou 14. Et qui sort faux sinon.
la source
C'est faisable. À titre indicatif, les deux bits du milieu sont égaux pour tous ces modèles de bits, donc les xorer produira 0 qui peut ensuite être une entrée pour le décodeur avec les deux autres bits. Les portes restantes sont appliquées aux trois sorties du décodeur pour fournir la sortie à bit unique correcte.
la source