No busques más por todo internet ya que estás al espacio justo, poseemos la solución que necesitas recibir y sin problema.
Solución:
60 55 50 48 puertas
El original (60 puertas) era el enfoque sistemático: multiplica cada dígito por cada uno y luego súmalos. Es decir, vea árboles de Wallace y árboles de Dadda
La mitad superior es la red de multiplicación: multiplique cada dígito con cada uno y agrupe los dígitos de salida con el mismo peso. Algunos bits se han dejado invertidos para salvar puertas.
La segunda mitad es la red sumadora. Cada cuadro representa un solo sumador, ya sea un semisumador (5 puertas – 1x XOR y un inversor), o un sumador completo (9 puertas – 2x XOR y NAND los bits de acarreo invertidos). La parte superior son las entradas, la salida inferior es la suma, la salida de la izquierda es el llevar a cabo. ver el desafío anterior
El multiplicador 2×2 luego se ha optimizado a mano para una red de 13 puertas personalizada, que es el tamaño óptimo según lo encontrado por @boothby. ¡Gracias!
Pegarlo en la esquina de bits bajos y volver a optimizar el árbol sumador ahorra cinco puertas (consulte la revisión n. ° 2). Sin embargo, pegarlo también en la esquina de bits altos produce una superposición. Sin embargo, un poco de matemáticas nos dice que eliminar el bit bajo del multiplicador alto resuelve la superposición y lo que queda por hacer es agregar los dos bits restantes y resumir cosas.
Esto por sí solo, desafortunadamente, no proporciona ningún ahorro, pero abre dos optimizaciones. Primero, los dos multiplicadores tienen dos puertas en común y se pueden fusionar. En este punto, estamos de vuelta en 55. Segundo, en la red de adición, no necesitamos un medio sumador porque sabemos que su acarreo será cero. Podemos reemplazarlo con un OR. Un OR es un NAND con sus entradas invertidas. Esto nos produce dos cadenas 2 de NOT en cada rama, que luego se pueden quitar, para un ahorro total de cinco puertas. Desafortunadamente, el medio sumador en C16 todavía lleva, por lo que no podemos hacer lo mismo allí. En tercer lugar, un sumador completo tiene una propiedad útil: si invierte sus entradas y sus salidas, aún se comporta igual. Dado que todas sus entradas ya están invertidas, también podemos mover los inversores detrás de él. Dos veces. Podríamos haber hecho lo mismo en el original, pero … bueno. Todavía tenemos un medio sumador con dos entradas invertidas. Quiero optimizar más esta parte, pero dudo que pueda.
Dado que estamos sacando un NOT del interior de un componente, tenemos que indicarlo de alguna manera. Hemos obtenido un medio sumador con acarreo invertido (también conocido como XOR aprovechado) a un costo de cuatro puertas.
Mientras tanto, también hemos vuelto a dibujar el diagrama de manera significativa.
39 puertas
Estoy bastante seguro de que aquí no hay diseños más simples que el mío. Fue muy difícil de hacer. También hago otros circuitos mínimos.
El retraso de transmisión se indica mediante la posición hacia abajo de cada puerta NAND en la hoja.
Prueba y código de Verilog:
// MINIMAL 3 BIT MULTIPLICATOR
//
// The simplest 3 bit multiplicator possible, using 39 NAND gates only.
//
// I have also made multiplicators that are faster, more efficient,
// use different gates, and multiply bigger numbers. And I also do
// hard optimization of other circuits. You may contact me at
// [email protected]
//
// This is my entry to win this hard Programming Puzzle & Code Golf
// at Stack Exchange:
// https://codegolf.stackexchange.com/questions/12261/build-a-multiplying-machine-using-nand-logic-gates/
//
// By Kim Øyhus 2018 (c) into (CC BY-SA 3.0)
// This work is licensed under the Creative Commons Attribution 3.0
// Unported License. To view a copy of this license, visit
// https://creativecommons.org/licenses/by-sa/3.0/
module mul3x3 ( in_000, in_001, in_002, in_003, in_004, in_005, out000, out001, out002, out003, out004, out005 );
input in_000, in_001, in_002, in_003, in_004, in_005;
output out000, out001, out002, out003, out004, out005;
wire wir000, wir001, wir002, wir003, wir004, wir005, wir006, wir007, wir008, wir009, wir010, wir011, wir012, wir013, wir014, wir015, wir016, wir017, wir018, wir019, wir020, wir021, wir022, wir023, wir024, wir025, wir026, wir027, wir028, wir029, wir030, wir031, wir032;
nand gate000 ( wir000, in_000, in_005 );
nand gate001 ( wir001, in_000, in_004 );
nand gate002 ( wir002, in_000, in_003 );
nand gate003 ( out000, wir002, wir002 );
nand gate004 ( wir003, in_004, in_001 );
nand gate005 ( wir004, wir003, wir003 );
nand gate006 ( wir005, in_003, in_002 );
nand gate007 ( wir006, wir000, wir005 );
nand gate008 ( wir007, in_004, in_002 );
nand gate009 ( wir008, in_001, in_005 );
nand gate010 ( wir009, wir008, wir007 );
nand gate011 ( wir010, in_001, in_003 );
nand gate012 ( wir011, wir001, wir010 );
nand gate013 ( wir012, out000, wir004 );
nand gate014 ( wir013, wir004, wir012 );
nand gate015 ( wir014, wir011, wir012 );
nand gate016 ( out001, wir014, wir014 );
nand gate017 ( wir015, in_002, in_005 );
nand gate018 ( wir016, wir015, wir015 );
nand gate019 ( wir017, out000, wir016 );
nand gate020 ( wir018, wir017, wir013 );
nand gate021 ( wir019, wir016, wir018 );
nand gate022 ( wir020, wir019, wir009 );
nand gate023 ( wir021, wir020, wir017 );
nand gate024 ( wir022, wir020, wir009 );
nand gate025 ( wir023, wir022, wir021 );
nand gate026 ( out005, wir022, wir022 );
nand gate027 ( wir024, wir016, wir022 );
nand gate028 ( wir025, wir006, wir018 );
nand gate029 ( wir026, wir025, wir006 );
nand gate030 ( wir027, wir025, wir018 );
nand gate031 ( out002, wir026, wir027 );
nand gate032 ( wir028, wir004, wir027 );
nand gate033 ( wir029, wir023, wir028 );
nand gate034 ( wir030, wir028, wir028 );
nand gate035 ( wir031, wir030, wir021 );
nand gate036 ( out004, wir031, wir024 );
nand gate037 ( wir032, wir029, wir031 );
nand gate038 ( out003, wir032, wir032 );
endmodule
module mul3x3_test;
reg [5:0] AB; // C=A*B
wire [5:0] C;
mul3x3 U1 (
.in_000 (AB[0]),
.in_001 (AB[1]),
.in_002 (AB[2]),
.in_003 (AB[3]),
.in_004 (AB[4]),
.in_005 (AB[5]),
.out000 (C[0]),
.out001 (C[1]),
.out002 (C[2]),
.out003 (C[3]),
.out004 (C[4]),
.out005 (C[5])
);
initial AB=0;
always #10 AB = AB+1;
initial begin
$display("tttime,tA,tB,tC");
$monitor("%d,t%bt%bt%b",$time, AB[5:3], AB[2:0],C);
end
initial #630 $finish;
endmodule
// iverilog -o mul3x3_test mul3x3_test.v
// vvp mul3x3_test
Kim Øyhus
Si para ti ha sido de provecho nuestro artículo, sería de mucha ayuda si lo compartes con el resto entusiastas de la programación de esta manera contrubuyes a difundir nuestra información.