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









1 comentario: