Tengo un número de 8 bits cuyos valores oscilan entre 0 y 99. Necesito convertirlo en una representación BCD de 8 bits adecuada del número usando circuitos digitales.
En caso de que necesite saberlo, el valor original es un valor de temperatura leído de un ADC y lo necesito en BCD para mostrarlo en dos pantallas de 7 segmentos. No puedo usar un microcontrolador.
Manera más simple:
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 haya programado para esa dirección, así que prográmelo con una asignación de valores binarios a BCD.
La forma simple y rápida sin ninguna tabla de búsqueda es usar el algoritmo de doble toque . Funciona solo cambiando por 1 y agregando 3 e itera "la cantidad de bits" veces, por lo tanto, es muy eficiente en microcontroladores y arquitecturas sin multiplicación / división y hardware de cambio de barril .
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.
¿Se supone que debes hacer esto con un FPGA? Escriba un programa en algún lenguaje (C, C++, Python, Perl... no importa, siempre y cuando esté familiarizado con él) que genere el siguiente resultado.
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, genera este grupo de líneas:
7'd__: begin
tens = 4'd_;
ones = 4'd_;
end
Rellene los valores apropiados donde _
están. 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
Por último, el epílogo:
default: begin
tens = 4'hX;
ones = 4'hX;
end
endcase
end
endmodule
Ahora guarde esto como un archivo Verilog .v y 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 demasiado alboroto y dejar que el compilador haga el trabajo sucio". Los programas generadores de código son tus amigos.
¿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 sincronizado 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 ciclo de reloj. Alimente dicho circuito con un número binario MSB primero y después de que todos los bits se hayan desplazado, mantendrá ese número en BCD. Este enfoque se puede utilizar con números binarios o BCD de cualquier tamaño, teniendo en cuenta que el acarreo de una etapa no puede afectar inmediatamente el acarreo de la siguiente etapa hasta el próximo ciclo de reloj.
Si se desea, se puede usar el registro BCD para desplazar el número original. Para el caso general, deberá organizar la lógica para que las partes del registro que contienen parte del número en formato binario tengan la lógica BCD deshabilitada para que actúen como palanca de cambios directa. 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 un poco más sofisticada, pero aún puede valer la pena usar los mismos registros para almacenar el número binario y el resultado BCD.
Por cierto, es posible utilizar el enfoque 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, según el estado del LSB del siguiente dígito superior.
olin lathrop
kevin vermeer
W5VO
usuario3624
Sednus
olin lathrop
Sednus
olin lathrop
chris stratton
olin lathrop
chris stratton
geométrico