De Binario A Siete Segmentos

De binario a siete segmentos: la conversión En la última entrada, unimos la ROM con el divisor de frecuencia y obtuvimos

Views 33 Downloads 0 File size 218KB

Report DMCA / Copyright

DOWNLOAD FILE

Recommend stories

Citation preview

De binario a siete segmentos: la conversión En la última entrada, unimos la ROM con el divisor de frecuencia y obtuvimos el metrónomo... o algo así. La verdad es que un proyecto no sirve si no podemos ver el estado en el que se encuentra, ¿está trabajando? ¿ya acabó? ¿siquiera empezó? ¿o si lo detengo pero estaba trabajando? Imagina que llegas a tu horno de microondas, abres la compuerta e introduces tu café (que no te terminaste en la mañana), mismo que deseas calentar durante cuarenta segundos. Presionas el 4, pero no hay un visualizador que te muestre el tiempo. Y tampoco hubo sonido tras presionar la tecla. ¡Bien podría estar desconectado! ¿Qué tan frustrado te sentirías si tu microondas no mostrara el tiempo restante y tuvieras que regresar cuando creyeras que hubiese terminado? Yo estaría bastante frustrado, asumo que tú también. Por eso, en esta entrada crearemos un componente simple pero poderoso: un convertidor de binario a siete segmentos, para mostrar un número binario en lenguaje común. De decimal a BCD Sé que eres fanático de la base 2, que prefieres leer los números en binario, y puedes convertir el número 0b11011 a decimal en menos de dos fracciones de segundo. Pero los diseños deben ser lo más amigables posibles, y eso incluye la lectura de tales cantidades binarias. Particularmente, no creo que una violinista prefiera saber que su ritmo es de 0b1010000 BPM en lugar de 80 BPM aunque hay cada caso... Como una línea de LEDs no es la solución, pasamos a otro conjunto de LEDs ordenados: los visualizadores de siete segmentos. El problema es ¿cómo separas un número binario en tres o cuatro dígitos de siete segmentos?Una forma de realizar tal separación es utilizando un código, denominado BCD (que significaDecimal Codificado en Binario). La conversión de decimal a BCD es bastante simple: tomamos cada uno de los dígitos decimales por separado y le asignamos su valor binario conforme a la tabla 1. Tabla 1: Conversión de decimal a código BCD natural. DECIMAL

BINARIO

0

0001

1

0001

2

0010

3

0011

4

0100

5

0101

6

0110

7

0111

8

1000

9

1001

10-15

No importa

Así que de decimal a BCD es una simple conversión del dígito a cuatro bits en binario, excepto que las últimas seis posiciones, de 0b1010 a 0b1111, no se utilizan. El problema, por supuesto, es la conversión de binario a BCD. De binario a BCD Lamentablemente, de binario a BCD no podemos simplemente separar conjuntos de cuatro bits y esperar a que todo funcione. Para la conversión, se requiere el uso de un algoritmo denominado desplazar a la izquierda y sumar tres. Y lo que hace es, bueno, ¡desplazar y sumar tres! En resumen, el proceso es: 1. Desplazar el número binario hacia la izquierda un bit. 2. Si alguno de los dígitos tiene una valor igual o mayor a cinco, sumar tres. 3. Repetir los pasos 1 y 2 la cantidad de bits del número binario que se quiere convertir. En esta entrada se realiza el ejemplo del convertidor pensado para el metrónomo, la cantidad de BPM a visualizar va de 1 a 512. Lo que implica 3 dígitos en BCD. Y las direcciones de la ROM van de 0 a 511, cantidades que se representan en 9 bits. Por lo tanto, el componente a ser desarrollado es un convertidor de 9 bits en binario a tres digitos en BCD. En la tabla 2 se muestra la escructura básica de cómo se alinearáfn los datos para la conversión: centenas, decenas, unidades, y el número binario inicial. Tabla 2: Estructura básica para la conversión. BCD Centenas (4 bits)

BINARIO Decenas (4 bits)

Unidades (4 bits)

Número binario (9 dígitos)

Ahora, siguiendo la alinación en la tabla 2, realizaremos la conversión de un número decimal entre el 1 y 512. Creo que estás pensando en el 417, ¿es así? ¿es así? Bueno, de cualquier forma, haremos el ejemplo del número 417: Tabla 3: Conversión de 9 bits a 4 dígitos de BCD. OPERACIÓN

BCD CENTENAS DECENAS (4 BITS) (4 BITS)

Disposición inicial

BINARIO UNIDADES (4 BITS)

NÚMERO BINARIO (9 BITS) 110100001

Desplazar izquierda (1)

a

la

Desplazar izquierda (2)

a

la

Desplazar izquierda (3)

a

la

1

10100001

11

0100001

110

100001

1001

100001

1

0011

00001

10

0110

0001

10

1001

0001

101

0010

001

1000

0010

001

1

0000

0100

01

10

0000

1000

1

10

0000

1011

1

100

0001

0111

Sumar tres a unidades Desplazar izquierda (4)

a

la

Desplazar izquierda (5)

a

la

Sumar tres a unidades Desplazar izquierda (6)

a

la

Sumar tres a decenas Desplazar izquierda (7)

a

la

Desplazar izquierda (8)

a

la

Sumar tres a unidades Desplazar izquierda (9)

a

la

Y, al final, observamos que los tres dígitos corresponden a 417, correctamente separado. En la tabla tres se ejemplifica el procedimiento simple, que será la base del módulo en VHDL: 1. Inicializamos todos los digitos BCD en 0. 2. Realizamos el siguiente procedimiento 9 veces (la cantidad de bits): 1. Desplazar el número binario una posición hacia la izquierda. 2. Verificar si alguno de los dígitos BCD es mayor o igual a cinco. 3. En caso de que algún número en BCD cumpla (sea 5, 6, o 7), sumar tres. Módulo en VHDL para la conversión de binario a BCD En la red hay varios ejemplos, como un convertidor de 8 bits a BCD, un convertidor de binario a BCD serial o una sugerencia sobre su implementación eficiente en ROM o LUT. Además, en el libro Learning by Example Using VHDL - Basic Digital Design with a Basys FPGA Boardtambién se incluye el código de un convertidor de 8 bits a BCD, código que se utiliza como base del presente módulo.

Ya con la base del algoritmo, podemos crear el código en VHDL. Antes de eso, hay que tomar en cuenta dos consideraciones: 1. En los primeros dos desplazamientos no se puede llegar al cinco o pasar más allá de él. Por lo tanto, es hasta el tercer desplazamiento que es necesario comprobar si se debe sumar tres a algún dígito. 2. El código BCD de las centenas representará como máximo un 5 (ya que el máximo es 512), razón por la que la representación BCD será de tres bits. Por lo tanto, diseñaremos un convertidor de 9 bits a tres dígitos BCD en 11 bits (con el digito de centenas truncado). ¿Recuerdan el ejemplo de la tabla 3? Porque exactamente eso haremos en código. En el listado 1 se muestra el código completo para el módulo, siguiendo el algoritmo. Sus correspondencias, por línea, son: 1. Declaramos nuestra entrada num_bin de 9 bits, correspondiente al número binario, y nuestra salida num_bcd de 11 bits, correspondiente al código en BCD (líneas 7 y 8). 2. Justo como en la tabla 3, creamos una sola línea con todos los datos. Ésto es, un vector de 9 + 4 + 4 + 3 = 20 localidades. Sobre ese vector se realizarán las operaciones de corrimiento (línea 15). 3. Dado que en z se contienen todos los datos, debemos asegurarnos que se inicializa en ceros (línea 18). 4. En los primeros dos corrimientos no habrá sumas, así que se realizan los primeros tres corrimientos sin problema (línea 20). 5. De las líneas 21 a 36 se ejecuta un ciclo para los seis desplazamientos restantes, equivalentes a 9 bits - 3 desplazamientos ya realizados. 6. Dentro del ciclo, se separa el vector en conjuntos de cuatro bits, correspondientes a cada dígito en BCD. Si las unidades (líneas 22 a 25), las decenas (líneas 26 a 29), o las centenas (líneas 30 a 33), exceden cuatro, se les aplica una suma de tres. 7. Tras la adición, se realiza el corrimiento de datos hacia la izquierda (línea 35). 8. Finalmente, se toman los valores de los dígitos en BCD y se envían a la salida del módulo (línea 38). Convertidor de binario de 9 bits a BCD de tres dígitos en 11 bits. 1 library IEEE; 2 use IEEE.STD_LOGIC_1164.ALL; 3 use IEEE.STD_LOGIC_UNSIGNED.ALL; 4 5 entity bin2bcd9 is 6 PORT( 7 num_bin: in STD_LOGIC_VECTOR(8 downto 0); 8 num_bcd: out STD_LOGIC_VECTOR(10 downto 0) 9 ); 10 end bin2bcd9; 11 12 architecture Behavioral of bin2bcd9 is 13 begin 14 proceso_bcd: process(num_bin) 15 variable z: STD_LOGIC_VECTOR(19 downto 0); 16 begin 17 -- Inicialización de datos en cero.

18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40

z := (others => '0'); -- Se realizan los primeros tres corrimientos. z(11 downto 3) := num_bin; for i in 0 to 5 loop -- Unidades (4 bits). if z(12 downto 9) > 4 then z(12 downto 9) := z(12 downto 9) + 3; end if; -- Decenas (4 bits). if z(16 downto 13) > 4 then z(16 downto 13) := z(16 downto 13) + 3; end if; -- Centenas (3 bits). if z(19 downto 17) > 4 then z(19 downto 17) := z(19 downto 17) + 3; end if; -- Corrimiento a la izquierda. z(19 downto 1) := z(18 downto 0); end loop; -- Pasando datos de variable Z, correspondiente a BCD. num_bcd