/* * multiplicador.c * Clase que implementa el multiplicador combinacional por sumas y desplazamientos * * Autores: JOSE LUIS BERENGUEL GOMEZ * JORGE BARBERO PEREZ * * Compilación: * c++ -c multiplicador.c * * Ultima modificación: 29-1-02 */ #include "gates.h" #include "decods.h" #include "muxs.h" #include "alu32.h" // para el sumador completo de 1 bit #include "celda_base.h" #include "linea_base.h" #include "multiplicador.h" void MULTIPLICADOR_4BITS::run(WIRE mult[4],// entrada de los 4 bits del multiplicando WIRE Pp[4], // entrada de los 4 productos parciales iniciales. Siempre a cero WIRE q[4], // entrada de los 4 bits del multiplicador WIRE cin[4], // entrada de los 4 acarreos de cada linea. Siempre a cero WIRE Prod[8]){ // salida de los 8 bits del producto /* COMIENZO DEL METODO */ /* SE INICIALIZAN LAS LINEAS QUE DEBEN SER CERO EN LA ENTRADA */ for(int i=0;i<4;i++) Pp[i]=cin[i]=0; /* OPERAMOS CON LAS LINEAS */ /* simulacion linea 0 */ linea[0].run(mult,Pp,q[0],cin[0],cout1,aux_lin1); Prod[0]=aux_lin1[0]; /* DESPLAZAMOS LOS PRODUCTOS PARCIALES DE LA LINEA AUXILIAR PARA INTRODUCIR LA SALIDA DE ACARREO*/ for(int i=0;i<3;i++) aux_lin1[i]=aux_lin1[i+1]; aux_lin1[3]=cout1; /* simulacion linea 1 */ linea[1].run(mult,aux_lin1,q[1],cin[1],cout2,aux_lin2); Prod[1]=aux_lin2[0]; /* DESPLAZAMOS LOS PRODUCTOS PARCIALES DELA LINEA AUXILIAR PARA INTRODUCIR LA SALIDA DE ACARREO*/ for(int i=0;i<3;i++) aux_lin2[i]=aux_lin2[i+1]; aux_lin2[3]=cout2; /* simulación linea 2 */ linea[2].run(mult,aux_lin2,q[2],cin[2],cout3,aux_lin3); Prod[2]=aux_lin3[0]; /* DESPLAZAMOS LOS PRODUCTOS PARCIALES DELA LINEA AUXILIAR PARA INTRODUCIR LA SALIDA DE ACARREO*/ for(int i=0;i<3;i++) aux_lin3[i]=aux_lin3[i+1]; aux_lin3[3]=cout3; /* simulacion linea 3 */ linea[3].run(mult,aux_lin3,q[3],cin[3],cout4,aux_lin4); Prod[3]=aux_lin4[0]; Prod[4]=aux_lin4[1]; Prod[5]=aux_lin4[2]; Prod[6]=aux_lin4[3]; Prod[7]=cout4; } void MULTIPLICADOR_32BITS::run(WIRE mult[32], // entrada de los 32 bits del multiplicando WIRE Pp[32], // entrada de los 32 productos parciales iniciales. Siempre a cero WIRE q[32], // entrada de los 32 bits del multiplicador WIRE cin[32], // entrada de los 32 acarreos de cada linea. Siempre a cero WIRE Prod[64]){// salida de los 64 bits del producto /* COMIENZO DEL METODO */ // SE INICIALIZAN LAS LINEAS QUE TIENEN QUE SER CERO EN LA ENTRADA for(int i=0;i<32;i++) Pp[i]=cin[i]=0; // OPERAMOS CON LAS LINEAS /* simulamos la linea 0 */ linea[0].run(mult,Pp,q[0],cin[0],cout[0],auxlin[0]); Prod[0]=auxlin[0][0]; // la salida del bit cero del primer producto parcial es Prod[0] /* desplazamos los productos parciales para introducir la salida de acarreo */ for(int i=0;i<31;i++) auxlin[0][i]=auxlin[0][i+1]; auxlin[0][31]=cout[0]; /* simulamos el resto de las lineas excepto la ultima */ for(int i=1;i<31;i++){ linea[i].run(mult,auxlin[i-1],q[i],cin[i],cout[i],auxlin[i]); Prod[i]=auxlin[i][0]; /* desplazamos los productos parciales para introducir la salida de acarreo */ for(int j=0;j<31;j++) auxlin[i][j]=auxlin[i][j+1]; auxlin[i][31]=cout[i]; } /* simulamos la ultima linea */ linea[31].run(mult,auxlin[30],q[31],cin[31],cout[31],auxlin[31]); /* asignamos el resto de bits del producto */ for(int i=0;i<32;i++) Prod[31+i]=auxlin[31][i]; Prod[63]=cout[31]; }