Mostrando entradas con la etiqueta types. Mostrar todas las entradas
Mostrando entradas con la etiqueta types. Mostrar todas las entradas

martes, 4 de junio de 2013

Conversión ASCII a Hex

Introducción

Presentaré en esta entrada un modo fácil de convertir un texto en ASCII a Hex para ya sea para grabar el dato en memoria, transmitirlo a través de algún protocolo de comunicación, mostrarlo un dato en un LCD, etc.

Procedimiento

VHDL tiene definidas diversas funciones de conversiones de tipo en sus librerías estándar. Usaré algunas de ellas para esta conversión. 
Los pasos para la conversión son los siguientes:

1- declaración del string, constantes y señales (signals) de contador en la parte declarativa de la arquitectura: 

 1 architecture beh of test is
 2 .......
 3 constant N : natural := 16;
 4 type tstring is array(natural range<>) of character;
 5 constant msje1 : tstring(0 to N-1) := "Vuelvo en 5 ... ";
 6 .......
 7 -- declaracion de la senal para asignar el Hex correspondiente
 8 signal byte_to_Tx: std_logic_vector(7 downto 0);
 9
10 -- declaracion de contador
11 signal char_cont: natural range 0 to N-1;
12 .......

2- Uso de funciones de conversión para obtener el byte en Hex correspondiente a cada character del string: 

byte_to_tx<=std_logic_vector(to_unsigned(character'pos(msje1(char_cont)),8));

Analicemos esta instrucción parte por parte:
a-
msje1(char_cont);

lo que hace esta parte de la instrucción es posicionarse en un carácter especifico del mensaje 1. La posición esta dada por el valor del contador char_cont. Por supuesto que este instrucción debe estar dentro del lazo donde se incrementa el contador una vez enviado el respectivo caracter. 
b-
character'pos('character')

en esta parte representa el caracter del msje1 especificado por  char_cnt.  Por otro lado character'pos('V') (coloco 'V' como ejemplo de un caracter del msje1), lo que hace es primero devolver en valor numero la posición de 'V' en el arreglo character definido en el estandar de VHDL. Para refrescar un poco algo que seguramente alguna vez lo vieron, detallo a continuación el tipo character: 

 1 type character is (
 2     NUL, SOH, STX, ETX, EOT, ENQ, ACK, BEL,
 3     BS, HT, LF, VT, FF, CR, SO, SI,
 4     DEL, DC1, DC2, DC3, DC4, NAK, SYN, ETB,
 5     CAN, EM, SUB, ESC, FSP, GSP, RSP, USP,
 6     ‘ ’,’!’, “”,’#’,’$’,’%’,’&’,’’’,
 7     ‘(‘,’)’,’*’, ‘+’, ‘,’,’-‘,’.’,’/’,
 8     ‘0’,’1’,’2’,’3’,’4’,’5’,’6’,’7’,
 9     ’8’,’9’,’:’,’;’,’<’,’=’,’>’,’?’,
10     ‘@’,’A’,’B’,’C’,’D’,’E’,’F’,’G’,
11     ‘H’,’’I’,’J’,’K’,’L’,’M’,’N’,’O’,
12     ‘P’,’Q’,’R’,’S’,’T’,’U’,’V’,’W’,
13     ‘X’,’Y’,’Z’,’[‘,’\’,’]’,’^’,’_’,
14     ‘`’,’a’,’b’,’c’,’d’,’e’,’f’,’g’,
15     ‘h’,’i’,’j’,’k’,’l’,’m’,’n’,’o’,
16     ‘p’,’q’,’r’,’s’,’t’,’u’,’v’,’w’,
17     ‘x’,’y’,’z’,’{‘,’|’,’}’,’~’,DEL);
18

así, el caracter 'V' se posiciona en el lugar 86 dentro del arreglo, por lo que el character'pos('V') devuelve el numero 86 (como entero). 
c- Entonces ahora tenemos que convertir el 86 entero a std_logic_vector. Usando la ya 'famosa' tablita de funciones de conversión sabemos que debemos pasar primero el entero a unsigned y luego a std_logic_vector. Eso es realizado por la siguiente parte de la instrucción:  

std_logic_vector(to_unsigned(86,8));

donde 8 es la cantidad de bits necesarios para representar el máximo número estimado a convertir (en este caso 256). 
d-Finalmente el binario correspondiente al caracter especificado por char_cont es asignado a la señal byte_to_Tx


Final...

Espero que les sea útil... y si alguna vez la usan AVISEN.... 

Hasta pronto....









domingo, 26 de junio de 2011

ieee.numeric_std.all - Funciones de Conversión / Cast

Anteriormente en el blog ieee.numeric_std.all vs. ieee.std_logic_arith.all expliqué el porque del uso de la paquete ieee.numeric_std.all;.en este blog describo en un simple diagrama cuales son las diferentes funciones de conversión de tipo disponibles en el paquete numeric_std y su modo de uso para las conversiones respectivas. También se detalla el uso de cast para conversiones entre tipos relacionados como std_logic_vector y unsigned.




El uso de este diagrama para la conversión de tipos es bastante sencillo.
Por ejemplo, para convertir un tipo integer a un tipo  std_logic_vector, hay que seguir la línea amarilla junto con las funciones respectivas: se comienza con la función to_unsigned(int, unsigned'length) y luego se usa el cast std_logic_vector sobre el unsigned obtenido previamente. unsigned'length significa el número de bits necesarios para representar el respectivo integer. Por ejemplo 4 bits para el entero mayor que 7 y menor o igual que 15; 3 bits para un entero entre 0 y 7; etc.  
Para ir del tipo std_logic_vector al tipo signed, solo hace falta aplicar el cast signed sobre el slv (std_logic_vector), es decir la línea verde entre ambos. 

Espero que sea de utilidad . . . . ah!, si querés el pdf de la figura, acá lo encontrás. y el pdf de este blog y del anterior aca :)  ..