Crear división a partir de compuertas lógicas

Tengo un proyecto para la universidad donde tengo que hacer las cuatro operaciones básicas con un par de números de 4 bits a partir de puras compuertas lógicas (or, and, xor, not, etc). La multiplicación, la suma y la resta son fáciles, sin embargo la división me parece un poco compleja de hacer... alguien tiene alguna idea de como hacer esto? He buscado en internet y no consigo mucho...

gracias de antemano.
 
Aunque efectúes el producto binario con puertas AND, imagina que sólo pudieras utilizar compuertas OR.

El resultado de un producto A*B es,

A*B=A+A+A...(B veces)

Con la división es algo parecido, pero al revés..

A/B=A-B-B-B...(restas B las veces necesarias hasta que el resto sea 0 o menor que B)

Entonces en el caso de que la diferencia no sea 0, el resto será el resultado de esta diferencia, que puedes derivarlo al LED del acarreo o 'carry' -imagino que lo utilizarás para el producto, es esencial en las ALU-.

El número de veces que hayas restado, será el cociente de la división.

Te puede quedar más claro si implementas este algoritmo en cualquier lenguaje de programación o entorno tipo MatLab.

Un saludo.
 
también puedes usar la compuerta xor para hacer una división sin tener restas sucesivas, de echo se explica mejor se buscas código de redundancia cíclica para comunicaciones

pero si imaginas el numero como los coeficientes de x

ax +bx^2+...+cx^n
dx +ex^2+...+fx^n

en donde a, b, c, d, e, f son binarios y n entero
la operación

ax +bx^2+...+cx^n
-----------------------= (ab...c )xor (de...f)
dx +ex^2+...+fx^n
 
también puedes usar la compuerta xor para hacer una división sin tener restas sucesivas, de echo se explica mejor se buscas código de redundancia cíclica para comunicaciones

pero si imaginas el numero como los coeficientes de x

ax +bx^2+...+cx^n
dx +ex^2+...+fx^n

en donde a, b, c, d, e, f son binarios y n entero
la operación

ax +bx^2+...+cx^n
-----------------------= (ab...c )xor (de...f)
dx +ex^2+...+fx^n

Hace 14 años que no entra al Foro, se casó y todo :LOL:
 
también puedes usar la compuerta xor para hacer una división sin tener restas sucesivas, de echo se explica mejor se buscas código de redundancia cíclica para comunicaciones

pero si imaginas el numero como los coeficientes de x

ax +bx^2+...+cx^n
dx +ex^2+...+fx^n

en donde a, b, c, d, e, f son binarios y n entero
la operación

ax +bx^2+...+cx^n
-----------------------= (ab...c )xor (de...f)
dx +ex^2+...+fx^n
Sinceramente, no me parece correcto o que esté bien explicado

Tomemos un caso simple, ocho dividido cuatro. En binario, 1000 / 0100. Si lo hago como figura en la fórmula, ya sea 1000 xor 0100, o 0001 xor 0010, en ambos casos obtengo resultados que son, o 12, o 3, obviamente incorrectos ambos.

Que yo sepa el método de división no requiere restas sucesivas pero si requiere corrimientos sucesivos.

O lo estoy entendiendo mal. Un ejemplo puede clarificar el método, creo yo.
 
Sinceramente, no me parece correcto o que esté bien explicado

Tomemos un caso simple, ocho dividido cuatro. En binario, 1000 / 0100. Si lo hago como figura en la fórmula, ya sea 1000 xor 0100, o 0001 xor 0010, en ambos casos obtengo resultados que son, o 12, o 3, obviamente incorrectos ambos.

Que yo sepa el método de división no requiere restas sucesivas pero si requiere corrimientos sucesivos.

O lo estoy entendiendo mal. Un ejemplo puede clarificar el método, creo yo.
Así es Amigo, para una división en binario se requieren tantos corrimientos a la derecha del dividendo, como lugares haya hasta el 1 de mayor peso. Además se requiere de una resta a cada resultado parcial, según sea 1 o 0 el valor del divisor.
Básicamente, se procede como la división tradicional en hoja y papel.
 
Es que se ha confundido la división algebraica de toda la vida con la "división" que se hace en un CRC.

Cyclic Redundancy Checking (CRC)
Otro método, superior al VRC, que es muy empleado en la detección de error en un bloque de
información es el Polynomial Code, conocido también como Cyclic Redundancy Check (CRC).
Una cadena de bits es considerada como la representación de los coeficientes de un polinomio,
con valores 0 o 1. De tal forma, un frame de k bits se asocia a la lista de coeficientes de un
polinomio con k términos, desde xk−1 hasta x0. Este polinomio tendrá grado máximo k − 1.
Así, a título de ejemplo, 110001 tiene 6 bits y representa un polinomio con coeficientes 1, 1, 0,
0, 0 y 1: x5 + x4 + 1.
La aritmética a emplear para la suma y resta es en módulo 2, no hay ni carries para la
suma ni borrows para la resta. Ambas resultan equivalentes al xor () de los bits de ambos
operandos
.
La división se desarrolla de la forma conocida salvo que:
Se trabaja para la resta en módulo 2.
Las magnitudes de divisor y dividendo no cuentan en la determinación de si está o no
contenido el divisor en el dividendo. Todo lo que interesa es que el número de bits del
divisor, el cual comienza con un 1, se corresponda (sea igual) al número de bits del
dividendo, el cual para la comparación se requiere comience con un 1.

Como los esquemas y algoritmos son parecidos lamentablemente se usa la misma terminología, pero esas "pequeñas" diferencias hacen que los resultados no tengan un pomo que ver.

Ejemplo de CRC:
images.png

Puede compararse línea a línea con una división "de toda la vida" y ver que no hay préstamos (borrows).
 
Atrás
Arriba