next up previous
Next: test_multiplicador.c Up: Multiplicador Previous: multiplicador.h

multiplicador.c

/*
 * 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];
}




2000-10-25