Esta pregunta es en realidad de una de mis discusiones anteriores, que todavía no entiendo cómo implementar. El objetivo es utilizar la abstracción para diseñar un circuito, que convierte números decimales ASCII de dos dígitos en una representación de complemento a 2.
"Recuerde que los caracteres en ASCII se representan con siete bits y que los dígitos decimales van del 0x30 (el dígito 0) al 0x39 (el dígito 9)".
Además del comparador y el sumador, se deben usar una o más unidades de extensión cero, uno o más multiplexores y puertas y cables.
Básicamente, ¿cuáles son los pasos y conceptos clave que debo conocer para llegar a una solución a este problema de diseño? Soy más o menos consciente de cómo funciona un sumador, ya que he hecho algunos problemas de división de bits con unidades de control para implementar diferentes funciones, pero no sé cómo poner todo esto junto.
Aquí se explican los pasos que suelo seguir para encontrar la solución. (Descargo de responsabilidad: no soy un experto aquí).
El primer paso es entender y expresar la relación entrada-salida de alguna forma. Puede expresar esta relación en una forma conveniente. Algunas de las formas estándar son
Tomando tu pregunta como ejemplo,
Si 011xxxx
y 011yyyy
ser los dígitos de entrada. Los últimos cuatro bits de estos dígitos representan sus valores binarios. También lo xxxxyyyy
es la representación BCD del número. Convertir este BCD a binario es la operación requerida aquí. Y esto se puede hacer sumando el dígito BCD inferior con diez veces el dígito superior. es decir,
Así que hemos obtenido la relación de entrada y salida aquí. Pero no tenemos un multiplicador para implementar esta relación.
Multiplicando con se puede hacer cambiando y agregando como se indica a continuación:
O
Así que aquí hemos obtenido la relación de entrada y salida en términos de hardware disponible. Un sumador de 7 bits puede hacer la suma. Las unidades de extensión cero pueden hacer el relleno cero.
Rellene un cero delante de la respuesta para que sea en forma de complemento a 2.
Una vez que tengamos la relación de entrada-salida, reemplazar los operadores en la expresión con el bloque/módulo correspondiente le dará el diagrama del circuito.
Nidhin usó la multiplicación, voy a usar justo lo contrario (división), pero en realidad serán solo un montón de restas, fáciles de hacer con un sumador.
Primero, supondré que todos los dígitos ASCII se han convertido a BCD (decimal codificado en binario) eliminando el 0x30 (haciendo que cada uno de los dígitos sea de 4 bits en lugar de 8).
Tomemos un par de ejemplos. Convertir 26 (decimal) a 1A (hexadecimal)
0010 0110 => 0001 1010
El dígito más a la derecha de nuestra respuesta tiene un "peso" de 1, y el dígito de la izquierda un "peso" de 16. Esto se debe a que hay dos "mordiscos" de cuatro bits en la respuesta y el peso del quinto bit es 16:
128 64 32 16 8 4 2 1
Entonces restaremos 16 repetidamente y usaremos el número de restas exitosas como el dígito izquierdo de la respuesta. Lo que queda se convierte en el dígito derecho.
Si restamos 16 de 26, obtenemos diez. Como solo podemos hacer esto una vez (sin que se vuelva negativo), el dígito de la izquierda se convierte en 1 y el dígito de la derecha es A (10).
26
-16 -> 1 (since we did this once)
---
10 -> A so the answer is 1A or 0001 1010
(done because 10 < 16)
Un ejemplo más largo:
Convierte 92 (decimal) a 5C (hexadecimal).
1001 0010 => 0101 1100
92
-16
---
76
-16
---
60
-16
---
44
-16
---
28
-16 -> 5 (since we subtracted 5 times, this is where the counter would be useful)
---
12 -> C so the answer is 5C or 0101 1100
(done because 12 < 16)
Tenga en cuenta que, aunque estoy mostrando aritmética decimal (por ejemplo, 92 - 16), esto realmente se está haciendo en BCD, un nibble de 4 bits para cada dígito ASCII.
Entonces, restar 16 de 92 en realidad debe hacerse usando un sumador BCD. No es tan complicado como parece, aquí hay un ejemplo:
1001 0010 92
- 0001 0110 16
----------
1000 1100 80 + -4 because it's negative, we'll add 10 back and propagate the carry
0001 1010
----------
0111 0110 76, which is the correct answer (see above)
Los dígitos ASCII tienen los 4 bits más bajos ya en formato BCD, por lo que no es necesario hacer nada allí, solo extraiga esos 4 bits más bajos de cada valor ASCII de 8 bits.
Para multiplicar el dígito más significativo (izquierdo) por 10, puede multiplicar por separado por 2 y 8, y sumar estos productos al valor BCD del primer dígito. Tal multiplicación está cambiando, o, más simplemente: conectando los sumandos a los bits correctos de las entradas del sumador. ¡Los turnos en este enfoque son gratuitos!
Entonces, suponiendo que las entradas ASCII son H[7:0], L[7:0], la salida es L[3:0] + H[3:0]×2 + H[3:0]×8 = L [3:0] + (H[3:0] SHL 1) + (H[3:0] SHL 3). El primer sumador necesita un ancho de salida de 6 bits. El segundo: ancho de salida de 7 bits. El rango de la salida es de 0 a +99.
Para agregar un signo menos inicial ASCII opcional en la posición S, compare S[7:0] con el código menos ASCII. La entrada = (igual) del comparador significa "entradas de dígitos negativos". Eso controlaría los inversores (compuertas XOR) para negar los valores de entrada. Vea esta excelente respuesta para más detalles. Las tres entradas a los sumadores tienen que tener un signo extendido al ancho del sumador que alimentan. El rango de la salida de salida de 8 bits es entonces de -99 a +99.
nidin
Omar Ayala
nidin
Omar Ayala
Wouter van Ooijen
Omar Ayala
crosley
Omar Ayala