library IEEE; library UNISIM; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_ARITH. ALL; use IEEE.STD_LOGIC_UNSIGNED. ALL; use UNISIM.VComponents.all; ----******************************************************************** ----######################## PROG RAMA PRINCIPAL RX ######################## ----Este programa recibe los datos seriales del teclado del computador por ----el puerto PS2 de la tarjeta de XILINX IO2 para luego procesarlos en la ----FPGA de XILINX Spartan 2, para lograr decodificar el teclad o y visualizar ----cada tecla del teclado en el LCD y el código de RX en los leds de la IO2 ----el programa se divide en dos partes la primera es una UART serial sincrona ----donde se adquieren los datos, y la otra parte es el procesamiento de estos ----datos recibidos para representar el código de cada tecla en su representación ----de código ASCII, el segundo programa me retorna el código de cada tecla para ----su visualización en la pantalla de cristal liquido, el programa principal es ----el que se encarga de manejar la tarjeta IO2,Por esta razón los datos salen y ----retornan a este programa, pero el manejo de las rutinas de inicialización de ----LCD y palabras de control del mismo se realizan en el programa secundario. ---/* Programa diseñado e impleme ntado por: Juan Manuel Narváez S., Carlos Moreno Investigación ---en el desarrollo de aplicaciones en FPGA'S ESCUELA COLOMBIANA DE INGENIERIA.*/ ----************************************************************************* --Declaración de puertos para e l manejo de la tarjeta IO entity rx is Port ( ---&&&&&&& Palabras de control de la IO2 address : out std_logic_vector(4 downto 0);--Dirección para selección ar interfaz de la IO2 data : out std_logic_vector(7 downto 0);--Dato que se quiere envía r para visualizar we : out std_logic;--Habilita escritura de la spartan a la IO2 c on flanco de bajada oe : out std_logic;--Habilita salida de la IO2 a la spartan cs : out std_logic;--Habilita la IO2 --------------&&&&&&& Bits usados de la Spartan clk : in std_logic;--Reloj de la FPGA 50MHZ reset : in std_logic;--Señal del pulsador de la spartan --------------&&&&&&& Bits usados del conector PS2 del teclado en la IO2 kclk : in std_logic;--Entrada de reloj del teclado kdat : in std_logic;--Entrada de dato serial del t eclado --------------&&&&&&& Salidas usadas de puerto de la Spartan byte : out std_logic;--Salida de bit que me indica cuando termina de recibir el dato --------------&&&&&& Palabras de control del LCD enable : out std_logic;-rs : out std_logic; rw : out std_logic); end rx; architecture Behavioral of rx is --------------Declaración de señales usadas en el programa signal aux_data,datain,init_data,aux_rx1 : std_logic_vector(7 downto 0); signal par,reloj,clock,aux_byte,res: std_logic; signal signal signal signal signal signal count : std_logic_vector(3 downto 0); aux3 : std_logic_vector(2 downto 0); aux_output : std_logic_vector(9 downto 0); aux_counter : integer range 0 to 15; counter2 : integer range 0 to 103789; aux_rx : std_logic_vector(1 downto 0); --------------Declaracion de componentes component lcd is --/// Bloque que maneja las palabras de control del LCD y ---------//convierte datos a ASCII Port ( rx : std_logic_vector(1 downto 0); data_in : in std_logic_vector(7 downto 0); clock : in std_logic; fin : in std_logic; rs : out std_logic; enable : out std_logic; rw : out std_logic; data :out std_logic_vector(7 downto 0)); end component lcd; begin ---Asignaciones cs<='1';--Selecciona la tarjeta IO2 we<=clock or kdat;--Escribe de la IO2 a la FPGA con flanco de bajada del CLK oe<='0';----Desabilita pulsadores y swich de la IO2 solo visualiza address<="00100";----Habilita leds para visualización del dato RX byte<=aux_byte;-----Indica cuando termina RX data<=datain;-------Asigna el dato Rx por el teclado para visualizar en leds aux_rx1<="000000"&aux_rx; aux_counter<=conv_integer(count); ----Asigna el contador de binario a entero ---Conexiones de puerto --****** BUFFERS DE ENTRADA Siempre se deben usar para comunicación respad3: IBUFG PORT MAP (I=>reset,O=>res);---pulsador para reset siempre usa buffer respad: IBUF PORT MAP (I=>kclk,O=>reloj);----Reloj del teclado respad2: IBUFG PORT MAP (I=>clk,O=>clock);---Reloj de la Spartan --Conexion de palabras de control del LCD lcd2 : lcd port map (aux_rx,aux_data,clock,aux_byte,rs,enable,rw,datain); --Rx del teclado --******Recepciòn de datos comunicación sincroná, El dato llega sincronizado -- con flanco de reloj, y en formato bit de start(0), dato 8 bits, paridad par -- bit de stop (1), cuando el reloj esta en fl anco de bajada se recibe el dato, -- haciendo un conteo para saber el bit que es, start, dato, paridad o stop --además se hace conteo porque el teclado envía el dato tres veces recibe: process(reloj) begin if (res='0') then -- manejo de reset, res='0' hay recepción de dato if falling_edge(reloj)then case count is when "0000" =>-- bit de start if (kdat='0') then count<="0001"; aux_byte<='0'; end if; when "1010" => count<="0000";-- bit de stop, y reset del contador aux_byte<='1'; aux_rx<=aux_rx+"01";--conteo de datos recibidos if(aux_rx = "10")then aux_rx<="00"; end if; when others => aux_data(aux_counter-1)<=kdat;--deserialización del dato . count<=count+"0001"; end case; end if; else -- reset res = '1', dato y contadores en cero. aux_data<="00000000"; aux_byte<='0'; count<="0000"; end if; end process recibe; end Behavioral; --======================================================================== --########################## SEGUNDO PROGRAMA LCD ########################## --PRIMER SUBPROGRAMA MANEJO DE L CD Y CONVERCION DE CODIGO DE TECLADO A ASCII --======================================================================== library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_ARITH. ALL; use IEEE.STD_LOGIC_UNSIGNED. ALL; ----********************Este p rograma inicializa el LCD recibe ----el dato RX lo convierte del código de la tecla del teclado lo --- convierte a código ASCII y envía las palabras de control para visualizar y --- hacer funciones del LCD ----******************** ----Declaración de puerto entity lcd is Port ( rx : std_logic_vector(1 downto 0);---Contador de datos recibidos data_in : in std_logic_vector(7 downto 0);--Dato recibido Teclado clock : in std_logic;--Reloj de la FPGA fin : in std_logic;----Bit de termino de RX -----------Palabras de control del LCD rs : out std_logic; enable : out std_logic; rw : out std_logic; data :out std_logic_vector(7 downto 0)); end lcd; architecture Behavioral of lcd is ----------Declaracion de señales signal aux_data,other_data,shif: std_logic_vector(7 downto 0); signal bandera,aux4,aux_e,aux_rs,aux_e1,aux_rs1 : std_logic; signal bandera2 : std_logic:='0'; signal signal signal signal signal aux3 : std_logic_vector(2 downto 0); count_s : std_logic_vector(3 downto 0); aux2 : std_logic_vector(25 downto 0); aux_output : std_logic_vector(9 downto 0); flag_caps : std_logic_vector(1 downto 0);---Bandera Para mayúsculas -----------Declaración de componentes --/*Reloj dividido en frecuencia * 25 component counter is port( clock : in std_logic; output : out std_logic_vector(25 downto 0)); end component counter; begin ------Conexiones ang : counter port map(clock,aux2); rs<= '0' when bandera = '0' else aux_rs1 when bandera2='1' else aux_rs; rw<= '0'; data<=aux_output(7 downto 0) when bandera = '0' else shif when bandera2 ='1' else other_data; aux4<=aux2(23); aux_e1<=aux2(15); enable<=aux4 when bandera = '0' else aux_e1 when bandera2='1'else aux_e; -----Asigna las palabras según las palabras de control del LCD para que pueda ---------ejecutar -----Funciones especiales como corrimientos o asignar letras mayúsculas c_iniciar:---/**Contador para proceso de inicialización process(aux4) begin if(falling_edge(aux4))then aux3<=aux3+"001"; end if; end process c_iniciar; inicial:----/******Inicialización del lCD process(aux3) begin if(bandera='0')then if(aux3 = "000")then aux_output<="0000001000"; bandera<='0'; elsif(aux3 = "001")then aux_output<="0000111110"; bandera<='0'; elsif(aux3 = "010")then aux_output<="0000001111"; bandera<='0'; elsif(aux3 = "011")then aux_output<="0000000001"; bandera<='1'; end if; end if; end process inicial; visualiza: process(rx) begin if(data_in=x"5a")then ---******Funciones especiales bandera2<='1'; elsif(data_in=x"06" and rx="10")then aux_e<='1'; ---Corrimiento a la derecha con F1 aux_rs<='0'; elsif(data_in=x"05" and rx="10")then aux_e<='1'; ---Corrimiento a la izquierda con F2 aux_rs<='0'; elsif(data_in=x"66" and rx="10") then aux_e<='1'; ---Borra un espacio Back aux_rs<='0'; elsif (data_in=x"14" and rx="10") then aux_e<='1'; ---Borra todo el LCD Clear display aux_rs<='0'; elsif (rx = "10") then aux_e<='1'; aux_rs<='1'; elsif(rx = "00") then aux_e<='0'; aux_rs<='1'; end if; end process visualiza; count: process(aux2(23)) begin if(rising_edge(aux2(23)))then count_s<=count_s+"0001"; end if; end process count; ------Tabla de conversión de datos Rx a ASCII o función especial with data_in select other_data <=x"41" when x"1c",--a x"42" when x"32",--b x"43" when x"21",--c x"44" when x"23",--d x"45" when x"24",--e x"46" when x"2b",--f x"47" when x"34",--g x"48" when x"33",--h x"49" when x"43",--i x"4a" when x"3b",--j x"4b" when x"42",--k x"4c" when x"4b",--l x"4d" when x"3a",--m x"4e" when x"31",--n x"4f" when x"44",--o x"50" when x"4d",--p x"51" when x"15",--q x"52" when x"2d",--r x"53" when x"1b",--s x"54" when x"2c",--t x"55" when x"3c",--u x"56" when x"2a",--v x"57" when x"1d",--w x"58" when x"22",--x x"59" when x"35",--y x"5a" when x"1a",--z x"31" when x"69",--1 x"32" when x"72",--2 x"33" when x"7a",--3 x"34" when x"6b",--4 x"35" when x"73",--5 x"36" when x"74",--6 x"37" when x"8c",--7 x"38" when x"75",--8 x"39" when x"7d",--9 x"30" when x"70",--0 x"2b" when x"59",--+ x"5e" when x"54",--` x"2a" when x"62",--´ x"ee" when x"4c",--ñ x"2c" when x"41",--, x"2e" when x"49",--. x"2d" when x"4a",--x"20" when x"29",--espace x"01" when x"14",--clear x"10" when x"66",--back x"18" when x"05",--shif left x"1c" when x"06",--shif rigth x"26" when others; end Behavioral; --======================================================================== --########################## TERCER PROGRAMA COUNTER ########################## -TERCER SUBPROGRAMA CONTADOR PARA DIVIDIR LA FRECUENCIA DE RELOJ --======================================================================== library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_ARITH.ALL; use IEEE.STD_LOGIC_UNSIGNED. ALL; entity counter is Port ( clock : std_logic; output : out std_logic_vector(25 downto 0)); end counter; architecture Behavioral of counter is signal aux : std_logic_vector(25 downto 0); begin output<=aux; process(clock) begin if(falling_edge(clock))then aux<=aux+"00000000000000000000000001"; end if; end process; end Behavioral; Nombre de archivo: rx_teclado Directorio: C:\Documents and Settings\USUARIO\Mis documentos\Juan manuel\proyecto_vision\Articulos Nuestros\Word Plantilla: C:\Documents and Settings\USUARIO\Reciente\Datos de programa\Microsoft\Plantillas\Normal.dot Título: library IEEE; Asunto: Autor: MS OFFICE Palabras clave: Comentarios: Fecha de creación: 29/01/2004 8:27 Cambio número: 1 Guardado el: 29/01/2004 9:21 Guardado por: MS OFFICE Tiempo de edición: 54 minutos Impreso el: 29/01/2004 9:21 Última impresión completa Número de páginas: 6 Número de palabras: 1.673 (aprox.) Número de caracteres: 9.205 (aprox.)