Conversión de binario a BCD

2

Tengo un número de 8 bits en el que los valores varían de 0 a 99. Necesito convertirlo en una representación correcta de BCD de 8 bits del número mediante circuitos digitales.

En caso de que necesite saberlo, el valor original es un valor de temperatura leído desde un ADC y lo necesito en BCD para mostrarlo en dos pantallas de 7 segmentos. No puedo usar un microcontrolador.

    
pregunta Sednus

4 respuestas

5

La forma más sencilla:

Utilice una EPROM / EEPROM de 256 bytes.

El valor de entrada se aplica al bus de direcciones.

La salida en el bus de datos es lo que programó para esa dirección, así que programe con una asignación de valores binarios a BCD.

    
respondido por el Majenko
3

La forma simple y rápida sin ninguna tabla de búsqueda es usar el algoritmo de doble dabble . Funciona solo con shift by 1 y add 3 e itera el "número de bits" veces, por lo que es muy eficiente en microcontroladores y arquitecturas sin multiplicación / división y hardware del cambiador de barras

Por ejemplo, para convertir 97 10 = 110 0001 2 a BCD

0000 0000   1100001   Initialization
0000 0001   1000010   Shift (1)
0000 0011   0000100   Shift (2)
0000 0110   0001000   Shift (3)
0000 1001   0001000   Add 3 to ONES, since it was 6
0001 0010   0010000   Shift (4)
0010 0100   0100000   Shift (5)
0100 1000   1000000   Shift (6)
0100 1011   1000000   Add 3 to ONES, since it was 8
1001 0111   0000000   Shift (7)
   9    7

El número se escribe con 7 bits (es decir, el bit más significativo es el bit 6), por lo que terminará después de 7 turnos.

    
respondido por el phuclv
1

¿Se supone que debes hacer esto con un FPGA? Escriba un programa en algún lenguaje (C, C ++, Python, Perl ... no importa, siempre que esté familiarizado con él) que genere la siguiente salida.

Primero, el preámbulo:

module BinaryToBCD
(
    input [6:0] setting,
    output [3:0] tens,
    output [3:0] ones
)

always @(setting)
begin
    case(setting)

Luego, para cada número del 0 al 99, genere este grupo de líneas:

    7'd__: begin
        tens = 4'd_;
        ones = 4'd_;
    end

Rellene los valores apropiados donde está el _ . Un ejemplo de Python:

for k in range(100):
    print "    7'd%d: begin" % k
    print "        tens = 4'd%d;" % (k // 10)
    print "        ones = 4'd%d;" % (k % 10)
    print "    end"
    print

Finalmente, el postamble:

    default: begin
        tens = 4'hX;
        ones = 4'hX;
    end

    endcase
end

endmodule

Ahora guarde esto como un archivo .v de Verilog, aliméntelo a su compilador FPGA y deje que haga el trabajo sucio.

Muchas, muchas cosas en los FPGA se reducen a "escribir el código de cualquier manera que resuelva el problema sin demasiados problemas y deje que el compilador haga el trabajo sucio". Los programas generadores de código son tus amigos.

    
respondido por el Mike DeSimone
1

¿El dispositivo tiene que hacer la conversión en un solo paso, o puede ser un proceso iterativo?

El método más barato en términos de circuitos es probablemente tener un circuito temporizado que, cargado con algún número N en formato BCD, y alimentado con una entrada C de un solo bit, se cargará con 2 * N + C en el siguiente reloj ciclo. Alimente a dicho circuito un número binario MSB primero y después de que todos los bits hayan sido desplazados, mantendrá ese número en BCD. Este enfoque se puede utilizar con números binarios o BCD de cualquier tamaño, observando que la ejecución de una etapa no puede afectar de manera inmediata la realización de la siguiente etapa hasta el siguiente ciclo de reloj.

Si lo desea, puede usar el registro BCD para cambiar el número original. Para el caso general, tendrá que organizar la lógica de modo que las partes del registro que contienen parte del número en formato binario tengan la lógica BCD desactivada para que actúen como cambiador directo. En el caso particular de dos dígitos, uno podría precargar los tres bits inferiores del registro con los tres MSB del número, y los 4 bits superiores con los cuatro bits inferiores del número, y simplemente no molestarse con ninguna lógica BCD para el dígito superior (ya que debería ser 0-9 de todos modos). Cuando se usan más de dos dígitos, se necesita una lógica algo más sofisticada, pero aún así puede valer la pena usar los mismos registros para mantener el número binario y el resultado BCD.

Por cierto, es posible utilizar el método inverso para convertir un número BCD a binario. Cada dígito debe ser igual a su valor dividido por dos (desplazamiento simple a la derecha), más cinco o cero dependiendo del estado del siguiente LSB del dígito más alto.

    
respondido por el supercat

Lea otras preguntas en las etiquetas