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