Muxes, sumadores, comparadores y puertas

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)".

Comparador y sumador.

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.

¿Puede la entrada representar un número negativo?
Creo que el problema trata estrictamente con números positivos, ya que los números hexadecimales son los números decimales del 1 al 9.
¿Podemos usar más de un sumador?
Sí. En general, creo que el problema requiere múltiplos de componentes.
¿Podrías resolver el problema en un lenguaje de programación, por ejemplo C?
El objetivo es finalmente construir un circuito. ¿Qué tienes en mente con el lenguaje C?
Ejercicio interesante. ¿Qué son las unidades de "extensión"? Tengo un esquema de hardware que funciona, pero requiere un contador. eso está permitido? (Probablemente pueda solucionarlo, pero hace las cosas un poco más fáciles).
La unidad de extensión es un dispositivo que agrega el número requerido, m, de ceros delante de un número binario de n bits.

Respuestas (3)

Aquí se explican los pasos que suelo seguir para encontrar la solución. (Descargo de responsabilidad: no soy un experto aquí).

1. Derivar la relación entrada-salida

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

  • expresión matemática
  • mesa de la verdad
  • expresión lógica
  • cualquier combinación de arriba

Tomando tu pregunta como ejemplo,

Si 011xxxxy 011yyyyser los dígitos de entrada. Los últimos cuatro bits de estos dígitos representan sus valores binarios. También lo xxxxyyyyes 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,

o tu t pag tu t = 1010 × X X X X + y y y y

Así que hemos obtenido la relación de entrada y salida aquí. Pero no tenemos un multiplicador para implementar esta relación.

2. Reformular la relación en términos de hardware disponible

Multiplicando con 1010 se puede hacer cambiando y agregando como se indica a continuación:

1010 × X X X X = X X X X 000 + X X X X 0

O

o tu t pag tu t = X X X X 000 + X X X X 0 + y y y y

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.

3. Diagrama de circuito/diagrama de bloques

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.

Aunque dices que no eres un experto, esta es una solución bien formulada. Aún así, estoy confundido sobre de dónde vino el 1010.
La representación 56 en decimal significa que el valor es 5 × 10 + 6 . Entonces su valor en hexadecimal será 5 × A + 6 = 38 , en octal será 5 × 12 + 6 = 70 y será 101 × 1010 + 110 = 111000 en binario.

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)
Esta también es una forma correcta de hacerlo. En total, la formulación final que obtuve fue la siguiente: (T-x30)x10 + (U-x30).
@OmarAyala Las restas de 0x30 son innecesarias. Todo lo que se necesita para "masajear" la entrada es la selección de bits y la extensión cero. El circuito necesita dos sumadores y algunos cables, eso es todo. ¡Literalmente podría implementarlo con 4 x MC14008 (cada sumador de 4 bits de ancho) en una placa de prueba y algunos cables! La compatibilidad con menos opcional de formato fijo agregaría dos comparadores de magnitud 4063 para detectar las puertas menos y 10 xor, por lo que 3x4070. Todavía cabría en una placa de prueba :) Todo esto también podría implementarse con nada más que 4041 y 4066 utilizados como muxes, y sería algo más rápido pero usaría 100 chips :(

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.