Interfaces de entrada / salida Introducción a las Interfaces de entrada / salida
Puerto de Salida Básico Registro (Latch) #CE CLK #WR #OE D0 D7 Q0 Q7 Bus de Datos del Sistema Salidas
Sintesis en vhdl de un puerto de salida Entity Salida is port ( HCLK : in std_logic; RESET : in std_logic; CS : in std_logic; WR : in std_logic; D : in std_logic_vector (7 downto 0); --Bus datos es siempre entrada O : out std_logic_vector (7 downto 0) --Salidas al exterior ); end Salida;
architecture B2 of Salida is begin process (HCLK, RESET) if RESET = '1' then O ( 7 downto 0 )<= "00000000"; else if HCLK = '1' and HCLK'event then -- Flanco de ascendente if CS = '0' then if WR = '0' then O (7 downto 0) <= D ( 7 downto 0 ); end if; end process; end B2;
Estimulo para test del puerto de salida
Simulación – Puerto de salida
Puerto de Entrada Básico Puerta de 3 estados (Transceiver) #CE #RD #OE O0 O7 I0 I7 Bus de Datos del Sistema Entradas
Sintesis en vhdl de un puerto de entrada entity Entrada is port ( HCLK : in std_logic; RESET : in std_logic; CS : in std_logic; RD : in std_logic; D : out std_logic_vector (7 downto 0); -- Bus Datos es siempre salida I : in std_logic_vector (7 downto 0) -- Entradas externas ); end Entrada;
architecture B2 of Entrada is Begin process (HCLK, RESET) if RESET = '1' then D ( 7 downto 0 )<= "ZZZZZZZZ"; else if HCLK = '1' and HCLK'event then -- Flanco de ascendente if CS = '0' then -- Acceso al registro solo si CS es 0 if RD = '0' then D ( 7 downto 0 ) <= I (7 downto 0); D ( 7 downto 0 ) <="ZZZZZZZZ"; -- Si RD esta en 1 el bus esta en "Z" end if; -- Si CS esta en 1 el bus esta en "Z" end process; end B2;
Estimulo – Puerto de entrada
Simulación – Puerto de entrada
8. 8. 8. 8. Aplicación Puerto “A” Excitación (Ánodos) Puerto “B” Q7 CE1 WL CLK Excitación (Ánodos) D7 … D0 OE Q0 8. 8. 8. 8. CE1 Puerto “B” WH CLK K3 K2 K1 K0 D15 … D8 Q3 Q0 OE Habilitaciones (Cátodos)
a f b g e c p d
ÁNODOS CÁTODO COMÚN ÁNODOS
Vcc a b c d e f g p CÁTODO COMÚN ÁNODOS
ÁNODOS 5. 8. 8. 8. KHH KMH KML KLL ULN2003 1 0 0 0
ÁNODOS 8. 3. 8. 8. KMH KML KLL ULN2003 0 1 0 0
ÁNODOS 8. 8. 9. 8. KMH KML KLL ULN2003 0 0 1 0
ÁNODOS 8. 8. 8. 6. KMH KML KLL ULN2003 0 0 0 1
;Subrutina DISP ;Variables utilizadas: ;STATUS : Próximo dígito de Buffer que es necesario refrescar ;BUFFER : Tabla de 8 bytes que contiene los datos para el display y los códigos de habilitación correspondientes STATUS dw 0 BUFFER db 1, 1 ;LSD , 00000001 db 3, 2 ; , 00000010 db 5, 4 ; , 00000100 db 7, 8 ;MSD; 00001000 ;PORT_A : Etiqueta que especifica la dirección del puerto del display PORT_A equ XXXX
;Variables utilizadas: ;Subrutina DISP ;Variables utilizadas: ;STATUS : Próximo dígito de Buffer que es necesario refrescar ;BUFFER : Tabla de 8 bytes que contiene los datos para el display y los códigos de habilitación correspondientes STATUS dw 0 BUFFER db 1, 1 ;LSD , 00000001 db 3, 2 ; , 00000010 db 5, 4 ; , 00000100 db 7, 8 ;MSD; 00001000 ;PORT_A : Etiqueta que especifica la dirección del puerto del display PORT_A equ XXXX STATUS OFFSET incrementa 1 BUFFER 1 = 00000001 3 2 = 00000010 5 4 = 00000100 7 8 =00001000
;SUB. DE REFRESCO------------ DISP PROC NEAR XOR AX,AX MOV DX, PORT_A OUT DX,AX ;APAGA DISPLAY MOV BX, STATUS ;BUSCA DATOS EN BUFFER MOV SI, OFFSET BUFFER MOV AX,(BX+SI) OUT DX,AX ;ENCIENDE DIGITO ADD BX, 2 ;APUNTA AL PROXIMO DIGITO EN MEMORIA AND BX, 7 MOV STATUS,BX RET
;SUB. DE REFRESCO------------ DISP PROC NEAR XOR AX,AX MOV DX, PORT_A OUT DX,AX ;APAGA DISPLAY MOV BX, STATUS ;BUSCA DATOS EN BUFFER MOV SI, OFFSET BUFFER MOV AX,(BX+SI) OUT DX,AX ;ENCIENDE DIGITO ADD BX, 2 ;APUNTA AL PROXIMO DIGITO EN MEMORIA AND BX, 7 MOV STATUS,BX RET
;SUB. DE REFRESCO------------ DISP PROC NEAR XOR AX,AX MOV DX, PORT_A OUT DX,AX ;APAGA DISPLAY MOV BX, STATUS ;BUSCA DATOS EN BUFFER MOV SI, OFFSET BUFFER MOV AX,(BX+SI) OUT DX,AX ;ENCIENDE DIGITO ADD BX, 2 ;APUNTA AL PROXIMO DIGITO EN MEMORIA AND BX, 7 MOV STATUS,BX RET OFFSET BUFFER 1 1 = 00000001 3 STATUS 2 = 00000010 5 4 = 00000100 7 8 =00001000
;SUB. DE REFRESCO------------ DISP PROC NEAR XOR AX,AX MOV DX, PORT_A OUT DX,AX ;APAGA DISPLAY MOV BX, STATUS ;BUSCA DATOS EN TRABLA MOV SI, OFFSET BUFFER MOV AX,(BX+SI) OUT DX,AX ;ENCIENDE DIGITO ADD BX, 2 ;APUNTA AL PROXIMO DIGITO EN MEMORIA AND BX, 7 MOV STATUS,BX RET
;SUB. DE REFRESCO------------ DISP PROC NEAR XOR AX,AX MOV DX, PORT_A OUT DX,AX ;APAGA DISPLAY MOV BX, STATUS ;BUSCA DATOS EN TRABLA MOV SI, OFFSET BUFFER MOV AX,(BX+SI) OUT DX,AX ;ENCIENDE DIGITO ADD BX, 2 ;APUNTA AL PROXIMO DIGITO EN MEMORIA AND BX, 7 MOV STATUS,BX RET
;SUB. DE REFRESCO------------ DISP PROC NEAR XOR AX,AX MOV DX, PORT_A OUT DX,AX ;APAGA DISPLAY MOV BX, STATUS ;BUSCA DATOS EN TRABLA MOV SI, OFFSET BUFFER MOV AX,(BX+SI) OUT DX,AX ;ENCIENDE DIGITO ADD BX, 2 ;APUNTA AL PROXIMO DIGITO EN MEMORIA AND BX, 7 MOV STATUS,BX RET
Teclado C0 C1 Entradas C2 C3 F0 F1 Teclas Salidas F2 F3
TECLADO Entradas 1 Salidas
TECLADO 1 Entradas 1 Salidas
TECLADO Entradas 1 Salidas
TECLADO Entradas 1 Salidas
Teclado C0 C1 Entradas C2 C3 F0 F1 Teclas Salidas F2 F3
8. 8. 8. 8. Aplicación Excitación (Ánodos) Habilitaciones (Cátodos) Q7 CE1 WL CLK Excitación (Ánodos) D7 … D0 OE Q0 8. 8. 8. 8. CE1 WH CLK K3 K2 K1 K0 D15 … D8 Q3 Q0 OE Habilitaciones (Cátodos)
Teclado C0 C1 Entradas C2 C3 Q0 Q1 Teclas Q2 Q3
Teclado I0 I1 Entradas I2 I3 P U E R T O B Q0 Q1 Teclas Q2 Q3
PUERTO_C Puerta de 3 estados CE OE1 RDL OE2 Entradas D0 D7 O0 O7 I0 I7
Teclado I3 I2 I1 I0 I4 I5 I6 I7 Entradas PUERTO_C P U E R T O Q0 Q1 B Q0 Q1 Teclas Q2 Q3
Subrutina SCAN : Variables utilizadas : TECLA : Código ultima tecla presionada TECLA db 0 ;SUB. DE EXPLORACION DE TECLADO SCAN PROC NEAR MOV DX, PORT_B IN AL, DX TEST AL, 0F0h JZ notec MOV TECLA, AL notec: RET
Registros internos Síntesis en vhdl de un registro interno (sin líneas de entrada ni salida) entity Registro is port ( HCLK : in std_logic; RESET : in std_logic; CS : in std_logic; RD : in std_logic; WR : in std_logic; D : inout std_logic_vector (7 downto 0) -- Bus de datos es Entrada/Salida ); end Registro;
architecture B2 of Registro is Begin process (HCLK, RESET) variable REGISTRO : std_logic_vector (7 downto 0) := "00000000"; if RESET = '1' then D ( 7 downto 0 )<= "ZZZZZZZZ"; else if HCLK = '1' and HCLK'event then -- Flanco de ascendente if CS = '0' then -- Acceso al registro solo si CS es 0 if RD = '0' then D ( 7 downto 0 ) <= REGISTRO (7 downto 0); D ( 7 downto 0 ) <="ZZZZZZZZ"; -- Si RD = 1, bus en "Z" if WR = '0' then REGISTRO (7 downto 0) := D ( 7 downto 0 ); end if; D ( 7 downto 0 ) <="ZZZZZZZZ"; -- Si CS = 1, bus en "Z" end process; end B2;
Estímulo para test de registro interno
Salida del test de registro interno
Generador PWM Contador Comparador HCLK CLK Q0 Q7 Salida PWM Registro =1 si Registro > Contador Registro #CE #WR CLK #OE D0 D7 Q0 Q7 Bus de Datos del Sistema
Síntesis VHDL de Generador PWM entity PWM is port ( HCLK : in std_logic; RESET : in std_logic; CS : in std_logic; RD : in std_logic; WR : in std_logic; D : inout std_logic_vector (7 downto 0); PWM : out std_logic ); end PWM;
architecture B2 of PWM is Begin process (HCLK, RESET) variable REGISTRO : std_logic_vector (7 downto 0) := "00000000"; variable CICLO : std_logic_vector (7 downto 0) := "00000000"; variable CONTADOR : std_logic_vector (7 downto 0) := "00000000"; if RESET = '1' then D ( 7 downto 0 )<= "ZZZZZZZZ"; PWM <= '0'; else if HCLK = '1' and HCLK'event then -- Flanco de ascendente if CS = '0' then -- Acceso al registro solo si CS es 0 if RD = '0' then D ( 7 downto 0 ) <= REGISTRO (7 downto 0); D ( 7 downto 0 ) <="ZZZZZZZZ"; -- Si RD es 1 el bus es "Z" if WR = '0' then REGISTRO (7 downto 0) := D ( 7 downto 0 ); end if; D ( 7 downto 0 ) <="ZZZZZZZZ"; -- Si CS es 1 el bus es "Z"
if CONTADOR > CICLO then PWM <= '0'; else PWM <= '1'; end if; CONTADOR := CONTADOR +1; if CONTADOR > CICLO then PWM <= '0'; else PWM <= '1'; end if; if CONTADOR = "00000000" then CICLO := REGISTRO; end process; end B2;
Test de puerto PWM
Puertos programables, líneas de control Puerto de Entrada + Salida Básico #CE #WR Registro (Latch) #OE Salida Bus de Datos Entrada #RD Puerta de 3 estados (Transceiver) #OE
Puertos programables, lineas de control Puerto de Entrada + Salida Básico #CE #WR Registro (Latch) #OE Salida Bus de Datos Entrada #RD Puerta de 3 estados (Transceiver) #OE
Puerto de Entrada / Salida Programable #CE Registro (Latch) #WR #OE Exterior Salida Bus de Datos Entrada Puerta de 3 estados (Transceiver) #OE #RD
Puerto de Entrada / Salida Programable #CE 1 #WR #OE Exterior #CE #WR #OE Salida Bus de Datos Entrada #OE #RD
Puerto de Entrada / Salida Programable A0 #WR #OE #CE Exterior #WR #OE Salida Bus de Datos Entrada #OE #RD
Puerto de Entrada / Salida Programable #CE #WR A0 #RD #OE Lógica de control de lectura y escritura (LCLE) Exterior #OE Salida Bus de Datos Entrada #OE
Puerto de Entrada / Salida Programable #CE #WR A0 #RD #OE Lógica de control de lectura y escritura (LCLE) Exterior #OE Salida Bus de Datos Entrada #OE
Puerto de Entrada / Salida Programable #CE #WR A0 #RD #OE LCLE Puerta bidireccional de 3 estados (Transceiver) #OE Salida #OE Dd Entrada Bus de Datos del sistema #OE
Puerto de Entrada / Salida Programable con Reset #CE #WR A0 #RD RESET #OE LCLE Puerta bidireccional de 3 estados (Transceiver) #OE Salida #OE Dd Entrada Bus de Datos del sistema #OE
Puerto de Entrada / Salida Programable con Reset #CE #WR A0 #RD RESET #OE LCLE Puerta bidireccional de 3 estados (Transceiver) #OE Salida #OE Dd Entrada Bus de Datos del sistema #OE
Puerto de E / S con Pedido de Atención y Bandera Habilitación INTR Bandera Puertas de 3 estados (Transceiver) 1 #OE D Q #R Bus de Datos #OE Entrada
Puerto de Entrada con Líneas de control y con capacidad de solicitar interrupciones Bandera INTR #OE0 #CE A0 #WR #RD #OE1 LCLE Habilitación 1 CLK1 D Q DAV #R #OE Bus de Datos #OE1 #OE DAC #E #OE0 Entradas
; PUNTERO variable que apunta al lugar de almacenamiento ; SUB. HS_INP ; PUNTERO variable que apunta al lugar de almacenamiento ; N variable que contiene el numero de bytes que se van a recibir ; CRSR etiqueta con la dirección del registro de control/estados (Wr/Rd) ; DATR etiqueta con la dirección del registro de entrada ; FLAG etiqueta con todos “0” y un solo “1” en posición de la “Flag” HS_INP PROC NEAR TEST N,0FFFFh JNZ OK_DAT ;salta a recepción MOV DX, CRSR ;apunta al registro de control XOR AL,AL OUT DX,AL ;deshabilita pedido de interrupción SALE RET OK_DAT MOV DX, CRSR ;Apunta al registro de estados IN AL,DX ;verifica si hay dato para leer TEST AL, FLAG ; “ JZ SALE ;si no hay dato sale MOV DX, DATR ;apunta al registro de entrada MOV SI, PUNTERO ;carga el puntero para guardar el dato IN AL,DX MOV (SI),AL ;guarda el dato DEC N ;actualiza contador INC PUNTERO ;actualiza puntero RET ENDP
; SUB. INI_HS_INP ; Parámetros de entrada: BX puntero al área de memoria libre CX cantidad de datos para almacenar AL configuración del puerto ; PUNTERO variable que apunta al lugar de almacenamiento ; N variable que contiene el numero de bytes que se van a recibir ;CRSR etiqueta con la dirección del registro de control/estados (Wr/Rd) INI_HS_INP PROC NEAR MOV N, CX MOV PUNTERO, BX MOV DX, CRSR OUT DX,AL RET ENDP
entity IOP is port ( HCLK : in std_logic; RESET : in std_logic; CS : in std_logic; AD0 : in std_logic; --0 = DATOS 1 = DDR WR : in std_logic; RD : in std_logic D : inout std_logic_vector (7 downto 0); -- El bus de datos es Entrada/Salida ES : inout std_logic_vector (7 downto 0) -- Entradas/Salidas al exterior ); end IOP; architecture B2 of IOP is Begin process (HCLK, RESET) variable DDR : std_logic_vector ( 7 downto 0) :="00000000"; -- 0 = entrada variable DAT : std_logic_vector ( 7 downto 0) :="00000000"; if RESET = '1' then ES ( 7 downto 0 )<= "ZZZZZZZZ"; DDR ( 7 downto 0 ) := "00000000"; DAT ( 7 downto 0 ) := "00000000"; D ( 7 downto 0 )<= "ZZZZZZZZ"; else if HCLK = '1' and HCLK'event then -- Flanco de ascendente if CS = '0' then if WR = '0' then if AD0 = '0' then DAT( 7 downto 0 ) := D( 7 downto 0 ); n1: for i in 0 to 7 loop if DDR(i) = '1' then ES (i) <= D (i); ES (i) <= 'Z'; end if; end loop n1;
else DDR( 7 downto 0 ) := D( 7 downto 0 ); n2: for i in 0 to 7 loop if D(i) = '1' then ES (i) <= DAT (i); ES (i) <= 'Z'; end if; end loop n2; if RD = '0' then if AD0 = '0' then n3: for i in 0 to 7 loop if DDR(i) = '1' then D (i) <= DAT (i); D (i) <= ES(i); end loop n3; D(7 downto 0) <= DDR(7 downto 0); D( 7 downto 0 ) <= "ZZZZZZZZ"; end process; end B2;
Estímulo para test de puerto entrada-salida programable
Simulación 1 – Puerto de entrada-salida programable
Simulación 2 – Puerto de entrada-salida programable
Comunicación Serie Asincrónica (puerto serie)
Esquema básico para una comunicación serie asincrónica TX RX Información multiplexada en el tiempo Bits Tb tiempo
Esquema básico para una comunicación serie asincrónica TX RX CLKTX CLKRX Información multiplexada en el tiempo Bits Tb tiempo
Comunicación serie asincrónica Duplex TX-RX_1 TX-RX_2 TX RX RX TX CLK_1 CLK_2
Comunicación serie asincrónica Duplex TX-RX_1 TX-RX_2 TX RX RX TX CLK_1T CLK_2T CLK_1R CLK_2R
Comunicación con adaptadores RS 232 TX-RX_1 TX-RX_2 TX RX RX TX RS 232 RS 232 CLK_1 CLK_2 Niveles RS 232
Comunicación con adaptadores RS 232 TX-RX_1 TX-RX_2 TX RX RX TX RS 232 RS 232 V +18V 0 lógico +3V Banda prohibida -3V 1 lógico -18V
Comunicación con MODEM TX-RX_1 TX-RX_2 TX TX- RX RX RX TX RS 232 M O D E M O D E RS 232 CLK_1 CLK_2
Comunicación con MODEM TX-RX_1 TX-RX_2 TX TX- RX RX RX TX RS 232 M O D E M O D E RS 232 DTR DSR TX- RX RTS CTS DCD RI CLK_1 CLK_2
Comunicación con MODEM TX-RX_1 TX M O D E RX RS 232 Data Terminal Ready DTR DSR DataSet Ready RTS CTS DCD RI CLK_1
Comunicación con MODEM TX-RX_1 TX M O D E RX RS 232 DTR DSR Request To Send RTS Control de transmisión CTS Clear To Send DCD RI CLK_1
Comunicación con MODEM TX-RX_1 TX M O D E RX RS 232 DTR DSR RTS CTS Data Carrier Detect DCD Control de recepción RI Ring Indicator CLK_1
Comunicación con MODEM TX-RX_1 TX-RX_2 TX TX- RX RX RX TX RS 232 M O D E M O D E RS 232 DTR DTR DSR DSR TX- RX RTS RTS CTS CTS DCD DCD RI RI CLK_1 CLK_2
Fundamentos del modo de transmisión En un sistema de transmisión serie asincrónico, la información se transmite utilizando pequeños grupos de bits denominados “CARACTERES”
Fundamentos del modo de transmisión En un sistema de transmisión serie asincrónico, la información se transmite utilizando pequeños grupos de bits denominados “CARACTERES” Formato de un “Caracter ” Bit de arranque Bit de paridad Bit de parada Bits de datos b0 bn 1 Tb tiempo “Bit time” o “Tiempo de bit”
b b b b b b b b P Cálculo de Paridad Bits de datos Bit de paridad Paridad PAR => el número total de “1”, debe ser PAR. Paridad IMPAR => el número total de “1”, debe ser IMPAR. Ejemplo para dato: 1 1 1 0 1 0 1 0 Paridad PAR => 1 1 1 0 1 0 1 0 1 (6 unos, número par) Paridad IMPAR => 1 1 1 0 1 0 1 0 0 (5 unos, número impar)
THR 1 P bn - - - - - - - b0 0 TSR Bit de arranque Bit de paridad parada Bits de datos b0 bn 1 Tb tiempo THR 1 P bn - - - - - - - b0 0 Carga en paralelo SOUT TSR Desplazamiento en serie de período Tb = 1 / Baud rate
RDR 1 P bn - - - - - - b0 0 RSR Muestreos tiempo Carga en paralelo Tb tiempo RDR Carga en paralelo 1 P bn - - - - - - b0 0 SIN RSR Desplazamiento en serie ( RCLK)
Bit de arranque Bit de datos ( b0 ) Tb Flanco descendente ... tiempo Muestreo rápido Inicio de muestreo de período Tb Flanco descendente ... tiempo Tb / 2 Tb
Bit de arranque Bit de datos ( b0 ) TbRx ... TbRx / 2 tiempo TbTx TbTx
TbTx + dTbTx TbTx + dTbTx 2 TbTx TbTx Bit de arranque Bit de datos ( b0 ) TbTx + dTbTx ... tiempo TbTx + dTbTx 2 TbTx TbTx
7(TbTx + dTbTx) 2 5(TbTx + dTbTx) 2 3(TbTx + dTbTx) (2b -1)(TbTx + dTbTx) 2 2 TbTx + dTbTx 2 Muestreos b0 bn 1 tiempo b bits
TbTx + dTbTx TbTx + dTbTx = 2 2 2 b bits Instante de muestreo correcto Error o desplazamiento del Instante de lectura Muestreos b0 bn 1 tiempo b bits
3(TbTx + dTbTx) 3TbTx + 3dTbTx = 2 2 2 b bits Instante de muestreo correcto 3(TbTx + dTbTx) 3TbTx + 3dTbTx = 2 2 2 Error o desplazamiento del Instante de lectura Muestreos b0 bn 1 tiempo b bits
(2b -1)(TbTx + dTbTx) (2b-1)TbTx + (2b-1)dTbTx = 2 2 2 b bits Instante de muestreo correcto (2b -1)(TbTx + dTbTx) (2b-1)TbTx + (2b-1)dTbTx = 2 2 2 Error o desplazamiento del Instante de lectura Muestreos b0 bn 1 tiempo b bits
(2b-1)dTbTx TbTx < 2 2 TbTx TbTx 2 2 Error o desplazamiento del Instante de lectura máximo Desplazamiento máximo para lectura sin error de enmarque. (2b-1)dTbTx TbTx < 2 2 Instante de muestreo correcto TbTx TbTx 2 2 ( bit de parada ) tiempo
er TbTx (2b-1)dTbTx TbTx < 2 2 (2b-1)dTbTx TbTx < 2 2 dTbTx
Señales de estilulo para transmisor Salida de simulacion del transmisor
Entrada y lectura de caracter Entrada y lectura de carácter con error de enmarque
use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_ARITH.ALL; library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_ARITH.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; entity xxx is port ( HCLK : in std_logic; RESET : in std_logic; WR : in std_logic; RD : in std_logic; D : in std_logic_vector (7 downto 0); -- bus de datos de entrada O : out std_logic_vector (7 downto 0); -- bus de datos de salida AD : in std_logic_vector (1 downto 0); TXD : out std_logic; RXD : in std_logic; CS : in std_logic; Z : inout std_logic_vector (8 downto 0) ); end xxx; ------------------------------------------------------------------------------------------------- architecture B2 of xxx is begin process (HCLK, RESET) variable BR : std_logic_vector ( 15 downto 0) := "1111111111111111"; variable RDR : std_logic_vector ( 10 downto 0) := "00000000000"; variable RSR : std_logic_vector ( 7 downto 0) := "00000000"; variable STR : std_logic_vector ( 3 downto 0) := "0000"; variable CR : std_logic_vector ( 15 downto 0) := "1111111111111111"; variable TDR : std_logic_vector ( 8 downto 0) := "000000000"; variable TSR : std_logic_vector ( 7 downto 0) := "00000000"; variable STT : std_logic_vector ( 3 downto 0) := "0000"; variable CT : std_logic_vector ( 15 downto 0) := "1111111111111111"; if RESET = '1' then --BR ( 15 downto 0 ):= "1111111111111111"; --VALOR INICIAL DEL BAUD TX Y RX BR ( 15 downto 0 ):= "0000000000010000"; RDR ( 10 downto 0 ):= "00000000000"; --REGISTRO DE RX RDR(8,9,10) FLAGS ( 8=LLENO, 9=OVR, 10=FE) RSR ( 7 downto 0 ):= "00000000"; --REGISTRO DE "DESPLAZAMIENTO" DE RX STR ( 3 downto 0 ):= "1111"; --ESTADO DE RX CR ( 15 downto 0 ):= "1111111111111111"; --CONTADOR DEL BAUD RX
begin if RESET = '1' then --BR ( 15 downto 0 ):= "1111111111111111"; --VALOR INICIAL DEL BAUD TX Y RX BR ( 15 downto 0 ):= "0000000000010000"; RDR ( 10 downto 0 ):= "00000000000"; --REGISTRO DE RX RDR(8,9,10) FLAGS ( 8=LLENO, 9=OVR, 10=FE) RSR ( 7 downto 0 ):= "00000000"; --REGISTRO DE "DESPLAZAMIENTO" DE RX STR ( 3 downto 0 ):= "1111"; --ESTADO DE RX CR ( 15 downto 0 ):= "1111111111111111"; --CONTADOR DEL BAUD RX TDR ( 8 downto 0 ):= "000000000"; --REGISTRO DE TX TDR(8) FLAG ( 1=LLENO) TSR ( 7 downto 0 ):= "00000000"; --REGISTRO DE "DESPLAZAMIENTO" DE TX STT ( 3 downto 0 ):= "1111"; --ESTADO DE TX CT ( 15 downto 0 ):= "0000000000000011"; --CONTADOR DEL BAUD TX Z ( 8 downto 0 )<= "000000000"; TXD <= '1'; else if HCLK = '1' and HCLK'event then -- Flanco de ascendente if CS = '0' then if WR = '0' then case AD is when "00" => TDR (7 downto 0) := D ( 7 downto 0 ); --CARGA EL TRANSMISOR TDR (8) := '1'; when "01" => BR (7 downto 0) := D ( 7 downto 0 ); --CARGA EL DIVISOR DE BAUD BAJO when others => BR (15 downto 8) := D ( 7 downto 0 ); --CARGA EL DIVISOR DE BAUD ALTO end case; if RD = '0' then O (7 downto 0) <= RDR ( 7 downto 0 ); --CARGA EL RECEPTOR RDR (10 downto 8) := "000"; O (7 downto 0) <= "111111"& TDR(8)& RDR(8); --CARGA EL DIVI DE BAUD BAJO BR (15 downto 8) := D ( 7 downto 0 ); --CARGA EL DIVI DE BAUD ALTO end if;
--O (7 DOWNTO 4) <= CTH (3 DOWNTO 0); --O (3 DOWNTO 0) <= STT (3 DOWNTO 0); case STR is when "1111" => if RXD='0' then STR := "1100"; CR ( 15 downto 0 ):= '0' & BR ( 15 downto 1 ); end if; when "1100" => if CR ( 15 downto 0 )="0000000000000000" then STR := "0000"; CR ( 15 downto 0 ):= BR ( 15 downto 0 ); else if CR ( 1 downto 0 )= "00" then if RXD='1' then STR := "1111"; when "1000" => RDR(9) := RDR(8) OR RDR(9); --error de sobrevelocidad RDR(10):= not(RXD); --error de enmarque RDR(8 downto 0):= '1'& RSR (7 downto 0 ); when others => RSR (7 downto 0 ):= RXD & RSR (7 downto 1 ); STR := STR+1; end case; --test p/ transmisión -- Z(3 downto 0)<= STR (3 downto 0 ); -- Z(7 downto 4)<= STT (3 downto 0 ); -- Z(8)<= RDR(8); --test p/ recepción Z(3 downto 0)<= STR (3 downto 0 ); Z(8 downto 6)<= RDR (10 downto 8 ); Z(5 downto 4)<= "00";
if (CT = "0000000000000000")OR(STT = "1111") then --BAUD RATE TX CT(15 downto 0) := BR(15 downto 0); case STT is --TRANSMISOR when "0000" => TXD <= '0'; STT := STT +1; when "0001" => TXD <= TSR(0); when "0010" => TXD <= TSR(1); when "0011" => TXD <= TSR(2); when "0100" => TXD <= TSR(3); when "0101" => TXD <= TSR(4); when "0110" => TXD <= TSR(5); when "0111" => TXD <= TSR(6); when "1000" => TXD <= TSR(7); when "1001" => TXD <= '1'; if TDR(8) = '1' then TSR( 7 downto 0) :=TDR( 7 downto 0); TDR(8) := '0'; STT := "0000"; else end if; when others => STT := "0001"; STT := "1111"; end case; --FIN DE TRANSMISOR
end if; CT := CT-1; CR := CR-1; end process; end B2;
F I N