Interfases de Entrada / Salida
• Introducción a las Interfaces de entrada / salida
• Fundamentos de comunicación serie asincrónica
• Interfase Serie
Introducción a las
Interfaces de entrada / salida
Puerto de Salida Básico
OE
Salidas
Registro (Latch)
Bus de Datos del Sistema
CLKWR
CE
D0
D7
Q0
Q7
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 entradaO : out std_logic_vector (7 downto 0)
--Salidas al exterior
);
end Salida;
Sintesis en vhdl de un puerto de salida
architecture B2 of Salida isbegin
process (HCLK, RESET)begin
if RESET = '1' thenO ( 7 downto 0 )<= "00000000";
elseif HCLK = '1' and HCLK'event then -- Flanco de ascendente if CS = '0' then
if WR = '0' thenO (7 downto 0) <= D ( 7 downto 0 );
end if; end if;end if;
end if;
end process;end B2;
Estimulo – Puerto de salida
Simulación – Puerto de salida
Puerto de Entrada Básico
OE
Entradas
Puerta de 3 estados(Transceiver)
Bus de Datos del Sistema
RD
CE
O0
O7
I0
I7
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;
Sintesis en vhdl de un puerto de entrada
architecture B2 of Entrada isBeginprocess (HCLK, RESET)Beginif RESET = '1' then
D ( 7 downto 0 )<= "ZZZZZZZZ";else
if HCLK = '1' and HCLK'event then -- Flanco de ascendenteif CS = '0' then -- Acceso al registro solo si CS es 0
if RD = '0' thenD ( 7 downto 0 ) <= I (7 downto 0);
elseD ( 7 downto 0 ) <="ZZZZZZZZ"; -- Si RD esta en 1 el bus esta en "Z"
end if;else
D ( 7 downto 0 ) <="ZZZZZZZZ"; -- Si CS esta en 1 el bus esta en "Z"
end if;end if;
end if;end process;end B2;
Estimulo – Puerto de entrada
Simulación – Puerto de entrada
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;
Sintesis en vhdl de un registro interno
architecture B2 of Registro isBeginprocess (HCLK, RESET)variable REGISTRO : std_logic_vector (7 downto 0) := "00000000";Beginif 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); else
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;
end if; else D ( 7 downto 0 ) <="ZZZZZZZZ"; -- Si CS = 1, bus en "Z" end if; end if;end if;end process;end B2;
Estimulo – Registro interno
Simulación – Registro interno
entity PWM isport (
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 isBeginprocess (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";Beginif 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 0if RD = '0' then D ( 7 downto 0 ) <= REGISTRO (7 downto 0);else 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;end if;
elseD ( 7 downto 0 ) <="ZZZZZZZZ"; -- Si CS es 1 el bus es "Z"
end if;
CONTADOR := CONTADOR +1; if CONTADOR > CICLO then PWM <= '0'; else PWM <= '1'; end if; if CONTADOR = "00000000" then CICLO := REGISTRO; end if;end if;end process;
end B2;
OE
Salida
Entrada
Registro(Latch)
Puerta de 3 estados(Transceiver)
WRCE
RD
Puerto de Entrada + Salida Básico
Bus de Datos
OE
OE
Salida
Entrada
Registro(Latch)
Puerta de 3 estados(Transceiver)
WRCE
RD
Bus de Datos
OE
Puerto de Entrada + Salida Básico
OE
Salida
Entrada
Puerta de 3 estados(Transceiver)
Bus de Datos
WRCE
RD
Puerto de Entrada / Salida Programable
Registro(Latch)
OE
Exterior
OE
Salida
Entrada
Bus de Datos
WRCE
RD
OEWR
CE 1
OE
Exterior
Puerto de Entrada / Salida Programable
OE
Salida
Entrada
Bus de Datos
WR
CE
RD
OEWR
A0
OE
Exterior
Puerto de Entrada / Salida Programable
CE RDWRA0
Bus de Datos
Lógica de control de lectura y escritura (LCLE)
OE
Salida
Entrada
OE
OE
Exterior
Puerto de Entrada / Salida Programable
CE RDWRA0
Bus de Datos
Lógica de control de lectura y escritura (LCLE)
OE
Salida
Entrada
OE
OE
Exterior
Puerto de Entrada / Salida Programable
OE
Salida
EntradaBus de Datos del sistema
CE RD
OE
WRA0
LCLE
OE
Puerta bidireccional de 3 estados (Transceiver)
OE Dd
Puerto de Entrada / Salida Programable
OE
Salida
EntradaBus de Datos del sistema
CE RD
Puerto de Entrada / Salida Programable con Reset
OE
WRA0
LCLE
OE
Puerta bidireccional de 3 estados (Transceiver)
RESET
OE Dd
OE
Salida
EntradaBus de Datos del sistema
CE RD
OE
WRA0
LCLE
OE
Puerta bidireccional de 3 estados (Transceiver)
RESET
Puerto de Entrada / Salida Programable con Reset
OE Dd
entity IOP isport (
HCLK : in std_logic;RESET : in std_logic;CS : in std_logic;AD0 : in std_logicWR : 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 isBeginprocess (HCLK, RESET)variable DDR : std_logic_vector ( 7 downto 0) :="00000000"; --entradavariable DAT : std_logic_vector ( 7 downto 0) :="00000000";Beginif 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' thenDAT( 7 downto 0 ) := D( 7 downto 0 );n1: for i in 0 to 7 loop
if DDR(i) = '1' thenES (i) <= D (i);
elseES (i) <= 'Z';
end if;end loop n1;
elseDDR( 7 downto 0 ) := D( 7 downto 0 );n2: for i in 0 to 7 loop
if D(i) = '1' thenES (i) <= DAT (i);
elseES (i) <= 'Z';
end if;end loop n2;
end if; else
if RD = '0' thenif AD0 = '0' then
n3: for i in 0 to 7 loopif DDR(i) = '1' then
D (i) <= DAT (i);else
D (i) <= ES(i);end if;
end loop n3;else
D(7 downto 0) <= DDR(7 downto 0);end if;
elseD( 7 downto 0 ) <= "ZZZZZZZZ";
end if; end if;
else D( 7 downto 0 ) <= "ZZZZZZZZ"; end if; end if;end if;end process;end B2;
Estimulo – Puerto de entrada-salida programable
Simulación – Puerto de entrada-salida programable
OE
Entrada
Puerto de E / S con Pedido de Atención y Banderas
OE
1
DQ
R
INTR
Bus de Datos
Puertas de 3 estados(Transceiver)
Habilitación
Bandera
Aplicación
OE
8.
8.
8.
8.
Habilitaciones(Cátodos)
Excitación(Ánodos)
K3K2K1K0
CLK
CE1
OE
WL
CLK
CE1
WH
D7…D0
D15…D8
Q7
Q0
Q0
Q3
a
c
b
d
e
gf
p
CÁTODO COMÚNÁNODOS
ÁNODOS
abcdefgp
Vcc
ÁNODOS
CÁTODO COMÚN
5.
8.
8.
8.
ÁNODOS
ULN2003
KHH KLLKMH KML
1 0 0 0
8.
3.
8.
8.
ÁNODOS
ULN2003
KLLKMH KML
0 1 0 0
8.
8.
9.
8.
ÁNODOS
ULN2003
KLLKMH KML
0 0 1 0
8.
8.
8.
6.
ÁNODOS
ULN2003
KLLKMH KML
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 0BUFFER db 1, 1 ;LSD , 00000001
db 3, 2 ; , 00000010 db 5, 4 ; , 00000100db 7, 8 ;MSD; 00001000
;PORT_A : Etiqueta que especifica la dirección del puerto del display
PORT_A equ XXXX
;SUB. DE REFRESCO------------
DISP PROC NEAR
XOR AX,AXMOV DX, PORT_AOUT DX,AX ;APAGA DISPLAY
MOV BX, STATUS ;BUSCA DATOS EN BUFFERMOV SI, OFFSET BUFFERMOV AX,(BX+SI)OUT DX,AX ;ENCIENDE DIGITO
ADD BX, 2 ;APUNTA AL PROXIMO DIGITO EN MEMORIAAND BX, 7MOV STATUS,BXRET
;SUB. DE REFRESCO------------
DISP PROC NEAR
XOR AX,AXMOV DX, PORT_AOUT DX,AX ;APAGA DISPLAY
MOV BX, STATUS ;BUSCA DATOS EN BUFFERMOV SI, OFFSET BUFFERMOV AX,(BX+SI)OUT DX,AX ;ENCIENDE DIGITO
ADD BX, 2 ;APUNTA AL PROXIMO DIGITO EN MEMORIAAND BX, 7MOV STATUS,BXRET
;SUB. DE REFRESCO------------
DISP PROC NEAR
XOR AX,AXMOV DX, PORT_AOUT DX,AX ;APAGA DISPLAY
MOV BX, STATUS ;BUSCA DATOS EN BUFFERMOV SI, OFFSET BUFFERMOV AX,(BX+SI)OUT DX,AX ;ENCIENDE DIGITO
ADD BX, 2 ;APUNTA AL PROXIMO DIGITO EN MEMORIAAND BX, 7MOV STATUS,BXRET
;SUB. DE REFRESCO------------
DISP PROC NEAR
XOR AX,AXMOV DX, PORT_AOUT DX,AX ;APAGA DISPLAY
MOV BX, STATUS ;BUSCA DATOS EN TRABLAMOV SI, OFFSET BUFFERMOV AX,(BX+SI)OUT DX,AX ;ENCIENDE DIGITO
ADD BX, 2 ;APUNTA AL PROXIMO DIGITO EN MEMORIAAND BX, 7MOV STATUS,BXRET
;SUB. DE REFRESCO------------
DISP PROC NEAR
XOR AX,AXMOV DX, PORT_AOUT DX,AX ;APAGA DISPLAY
MOV BX, STATUS ;BUSCA DATOS EN TRABLAMOV SI, OFFSET BUFFERMOV AX,(BX+SI)OUT DX,AX ;ENCIENDE DIGITO
ADD BX, 2 ;APUNTA AL PROXIMO DIGITO EN MEMORIAAND BX, 7MOV STATUS,BXRET
;SUB. DE REFRESCO------------
DISP PROC NEAR
XOR AX,AXMOV DX, PORT_AOUT DX,AX ;APAGA DISPLAY
MOV BX, STATUS ;BUSCA DATOS EN TRABLAMOV SI, OFFSET BUFFERMOV AX,(BX+SI)OUT DX,AX ;ENCIENDE DIGITO
ADD BX, 2 ;APUNTA AL PROXIMO DIGITO EN MEMORIAAND BX, 7MOV STATUS,BXRET
F0
F1
F2
F3
C0C1
C2C3
Teclado
TeclasSalidas
Entradas
0
1
0
0
00
00
TECLADO
Salidas
Entradas
0
0
0
01
00
TECLADO
1Salidas
Entradas
0
1
0
0
00
00
TECLADO
Salidas
Entradas
0
1
0
0
00
00
TECLADO
Salidas
Entradas
F0
F1
F2
F3
C0C1
C2C3
Teclado
TeclasSalidas
Entradas
Aplicación
OE
8.
8.
8.
8.
Habilitaciones(Cátodos)
Excitación(Ánodos)
K3K2K1K0
CLK
CE1
OE
WL
CLK
CE1
WH
D7…D0
D15…D8
Q7
Q0
Q0
Q3
Q0
Q1
Q2
Q3
C0C1
C2C3
Teclado
Teclas
Entradas
PUERTO_B
OE1
Entradas
Puerta de 3 estados
RDL
CE
O0
O7
I0
I7
OE2
D0
D7
Q0
Q1
Q2
Q3
I0I1
I2I3
Teclado
Teclas
PUERTO
A
Entradas
Q0
Q1
Q2
Q3
I3 I2 I1 I0 I4 I5 I6 I7
Teclado
Teclas
PUERTO
A
EntradasPUERTO_B
;SUB. DE EXPLORACION DE TECLADO
SCAN PROC NEAR
MOV DX, PORT_BIN AL, DXTEST AL, 0F0hJZ notecMOV TECLA, AL
notec:RET
Subrutina SCAN :Variables utilizadas :
TECLA : Código ultima tecla presionada
TECLA db 0