introducción a las interfaces de entrada / salida

Post on 22-Jan-2016

217 Views

Category:

Documents

0 Downloads

Preview:

Click to see full reader

TRANSCRIPT

Introducción a las

Interfaces de entrada / salida

Puerto de Salida Básico

#OE

Salidas

Registro (Latch)

Bus de Datos del Sistema

CLK#WR

#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 entrada

O : 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 para test del 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

#CE#RD

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

Aplicación

8.

8.

8.

8.

Habilitaciones(Cátodos)

Excitación(Ánodos)

K3K2K1K0

OE

CLK

CE1

WH

D15…D8

OE

CLK

CE1

WL

D7…D0

Q7

Q0

Q0

Q3

Puerto “A”

Puerto “B”

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

;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

1

1 = 00000001

3

2 = 00000010

5

4 = 00000100

8 =00001000

7

BUFFER

0

0

STATUS

OFFSET

incrementa

;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 1

1 = 00000001

3

2 = 00000010

5

4 = 00000100

8 =00001000

7

OFFSET BUFFER

STATUS

;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

8.

8.

8.

8.

Habilitaciones(Cátodos)

Excitación(Ánodos)

K3K2K1K0

OE

CLK

CE1

WH

D15…D8

OE

CLK

CE1

WL

D7…D0

Q7

Q0

Q0

Q3

Q0

Q1

Q2

Q3

C0C1

C2C3

Teclado

Teclas

Entradas

Q0

Q1

Q2

Q3

I0I1

I2I3

Teclado

Teclas

PUERTO

B

Entradas

PUERTO_C

OE1

Entradas

Puerta de 3 estados

RDL

CE

O0

O7

I0

I7

OE2

D0

D7

Q0

Q1

Q2

Q3

I3 I2 I1 I0 I4 I5 I6 I7

Teclado

Teclas

PUERTO

B

EntradasPUERTO_C

;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

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;

Síntesis en vhdl de un registro interno (sin líneas de entrada ni salida)

Registros internos

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;

Estímulo para test de registro interno

Salida del test de registro interno

Generador PWM

#OE

Salida

Registro

Bus de Datos del Sistema

CLK#CE#WR

D0

D7

Q0

Q7

CLK Q0

Q7

HCLK

ContadorComparador

PWM =1 siRegistro > Contador

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;

Síntesis VHDL de Generador 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;

Test de puerto PWM

#OE

Salida

Entrada

Registro (Latch)

Puerta de 3 estados(Transceiver)

#WR

#CE

#RD

Puerto de Entrada + Salida Básico

Bus de Datos

#OE

Puertos programables, líneas de control

#OE

Salida

Entrada

Registro (Latch)

Puerta de 3 estados(Transceiver)

#WR

#CE

#RD

Puerto de Entrada + Salida Básico

Bus de Datos

#OE

Puertos programables, lineas de control

Salida

Entrada

Puerta de 3 estados(Transceiver)

Bus de Datos

Puerto de Entrada / Salida Programable

Registro(Latch)

Exterior#OE

#WR

#CE

#RD#OE

#OE

Salida

Entrada

Bus de Datos

#WR

#CE

#RD

#OE#WR

#CE 1

#OE

Exterior

Puerto de Entrada / Salida Programable

#OE

Salida

Entrada

Bus de Datos

#WR

#CE

#RD

#OE#WR

A0

#OE

Exterior

Puerto de Entrada / Salida Programable

#CE #WR A0 #RD

Bus de Datos

Lógica de control de lectura y escritura (LCLE)

#OE

Salida

Entrada

#OE

#OE

Exterior

Puerto de Entrada / Salida Programable

Bus de Datos

Lógica de control de lectura y escritura (LCLE)

#OE

Salida

Entrada

#OE

#OE

Exterior

Puerto de Entrada / Salida Programable

#CE #WR A0 #RD

#OE

Salida

EntradaBus de Datos del sistema

#OELCLE

#OE

Puerta bidireccional de 3 estados (Transceiver)

#OE Dd

Puerto de Entrada / Salida Programable

#CE #WR A0 #RD

#OE

Salida

EntradaBus de Datos del sistema

Puerto de Entrada / Salida Programable con Reset

#OELCLE

#OE

Puerta bidireccional de 3 estados (Transceiver)

RESET

#OE Dd

#CE #WR A0 #RD

#OE

Salida

EntradaBus de Datos del sistema

#OELCLE

#OE

Puerta bidireccional de 3 estados (Transceiver)

RESET

Puerto de Entrada / Salida Programable con Reset

#OE Dd

#CE #WR A0 #RD

#OE

Entrada

#OE

1

DQ

#R

INTR

Bus de Datos

Puertas de 3 estados(Transceiver)

Habilitación

Bandera

Puerto de E / S con Pedido de Atención y Bandera

#OE

Entradas

Puerto de Entrada con Líneas de control y con capacidad de solicitar interrupciones

#OE

1

DQ

#R

INTR

Bu

s d

e D

ato

s

Ha

bili

taci

ón

Bandera

#CE A0#WR#RD

LCLE

#OE0

#OE0

DAV

DAC#E

#OE1

#OE1

CLK1

; 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 NEARTEST N,0FFFFhJNZ OK_DAT ;salta a recepciónMOV DX, CRSR ;apunta al registro de controlXOR AL,ALOUT DX,AL ;deshabilita pedido de interrupción

SALE RETOK_DAT MOV DX, CRSR ;Apunta al registro de estados

IN AL,DX ;verifica si hay dato para leerTEST AL, FLAG ; “JZ SALE ;si no hay dato saleMOV DX, DATR ;apunta al registro de entradaMOV SI, PUNTERO ;carga el puntero para guardar el datoIN AL,DXMOV (SI),AL ;guarda el datoDEC N ;actualiza contadorINC PUNTERO ;actualiza punteroRETENDP

; SUB. INI_HS_INP ; Parámetros de entrada: BX puntero al área de memoria libre

CX cantidad de datos para almacenarAL 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 NEARMOV N, CXMOV PUNTERO, BXMOV DX, CRSROUT DX,ALRETENDP

entity IOP isport (HCLK : in std_logic;RESET : in std_logic;CS : in std_logic;AD0 : in std_logic; --0 = DATOS 1 = DDRWR : in std_logic;RD : in std_logicD : inout std_logic_vector (7 downto 0);

-- El bus de datos es Entrada/SalidaES : 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"; -- 0 = 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;

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)

TX RX

Tb tiempo

Información multiplexada en el tiempo

Bits

Esquema básico para una comunicación serie asincrónica

TX RX

Tb tiempo

Información multiplexada en el tiempo

Bits

Esquema básico para una comunicación serie asincrónica

CLKTX CLKRX

TX RX

RX TX

Comunicación serie asincrónica Duplex

CLK_1 CLK_2

TX-RX_1 TX-RX_2

TX RX

RX TX

CLK_1R CLK_2R

TX-RX_1 TX-RX_2

CLK_1T CLK_2T

Comunicación serie asincrónica Duplex

TX RX

RX TX

Comunicación con adaptadores RS 232

RS232

RS232

TX-RX_1 TX-RX_2

CLK_1 CLK_2

Niveles RS 232

TX RX

RX TXRS232

RS232

0 lógico

1 lógico

+18V

+3V

V

-3V

-18V

Banda prohibida

TX-RX_1 TX-RX_2

Comunicación con adaptadores RS 232

Comunicación con MODEM

TX RX

RX TXRS232

RS232

MODEM

MODEM

TX- RX

TX-RX_1 TX-RX_2

CLK_1 CLK_2

Comunicación con MODEM

TX RX

RX TXRS232

RS232

MODEM

MODEM

TX- RX

DTR

DSR

RTS

CTS

DCD

RI

TX-RX_1 TX-RX_2

CLK_1 CLK_2

TX- RX

Comunicación con MODEM

TX

RXRS232

MODEM

DTR

DSR

RTS

CTS

DCD

RI

TX-RX_1

CLK_1

Data Terminal Ready

DataSet Ready

Comunicación con MODEM

TX

RXRS232

MODEM

DTR

DSR

RTS

CTS

DCD

RI

TX-RX_1

CLK_1

Request To Send

Clear To Send

Control de transmisión

Comunicación con MODEM

TX

RXRS232

MODEM

DTR

DSR

RTS

CTS

DCD

RI

TX-RX_1

CLK_1

Control de recepción

Data Carrier Detect

Ring Indicator

Comunicación con MODEM

TX RX

RX TXRS232

RS232

MODEM

MODEM

TX- RX

DTR

DSR

RTS

CTS

DCD

RI

DTR

DSR

RTS

CTS

DCD

RI

TX- RX

TX-RX_1 TX-RX_2

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 gruposde bits denominados “CARACTERES”

Bit de arranque Bits de datos

Bit de paridad

Bit de parada

Tb tiempo

bnb00 1

Fundamentos del modo de transmisión

En un sistema de transmisión serie asincrónico, la información se transmite utilizando pequeños gruposde bits denominados “CARACTERES”

Formato de un “Caracter ”

“Bit time” o “Tiempo de bit”

Cálculo de Paridad

b b b b b b b b P

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)

Bit de arranque Bits de datos

Bit de paridad

Bit de parada

Tb

1 P bn - - - - - - - b0 0

THR

TSR

Carga enparalelo

Desplazamiento en serie de período Tb = 1 / Baud rate

SOUT

tiempo

bnb00 1

Tb

1 P bn - - - - - - b0 0

RDR

RSR

Carga enparalelo

Desplazamiento en serie ( RCLK)

SIN

tiempo

Muestreos

bnb0 1

tiempo

Bit de arranque

Tb

Tb / 2

...

Muestreorápido

Flanco descendente

Inicio demuestreode períodoTb

Bit de datos ( b0 )

Tb

tiempo

Bit de arranque

TbTx

...

Bit de datos ( b0 )

TbTx

TbRx

TbRx / 2

tiempo

Bit de arranque

TbTx

...

Bit de datos ( b0 )

TbTx

TbTx + dTbTx

2TbTx + dTbTx

tiempo

Muestreos

bnb0 1

TbTx + dTbTx

2

0

3(TbTx + dTbTx)2

5(TbTx + dTbTx)2

7(TbTx + dTbTx)2

(2b -1)(TbTx + dTbTx)2

b bits

tiempo

Muestreos

bnb0 1

TbTx + dTbTx

2

0

b bits

=TbTx + dTbTx

2 2

Instante de muestreo correcto

Error o desplazamiento delInstante de lectura

tiempo

Muestreos

bnb0 1

3(TbTx + dTbTx)2

0

b bits

=3TbTx + 3dTbTx

2 2

Instante de muestreo correcto

Error o desplazamiento delInstante de lectura

tiempo

Muestreos

bnb0 1

0

b bits

=(2b-1)TbTx + (2b-1)dTbTx

2 2

Instante de muestreo correcto

Error o desplazamientodel Instante de lectura

(2b -1)(TbTx + dTbTx)2

(2b-1)dTbTx

2

Error o desplazamientodel Instante de lecturamáximo

< TbTx

2

Desplazamiento máximopara lectura sin error deenmarque.

tiempo

Instante de muestreo correcto

TbTx

2 TbTx

2

( bit de parada )

(2b-1)dTbTx

2< TbTx

2

(2b-1)dTbTx

2< TbTx

2

TbTx

< (2b-1)2

dTbTx

< (2b-1)

1er TbTx

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

library IEEE;use IEEE.STD_LOGIC_1164.ALL;use IEEE.STD_LOGIC_ARITH.ALL;use IEEE.STD_LOGIC_UNSIGNED.ALL;

entity xxx isport (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 entradaO : out std_logic_vector (7 downto 0); -- bus de datos de salidaAD : 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 isbeginprocess (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";beginif RESET = '1' then

--BR ( 15 downto 0 ):= "1111111111111111"; --VALOR INICIAL DEL BAUD TX Y RXBR ( 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 RXSTR ( 3 downto 0 ):= "1111"; --ESTADO DE RXCR ( 15 downto 0 ):= "1111111111111111"; --CONTADOR DEL BAUD RX

beginif RESET = '1' then

--BR ( 15 downto 0 ):= "1111111111111111"; --VALOR INICIAL DEL BAUD TX Y RXBR ( 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 RXSTR ( 3 downto 0 ):= "1111"; --ESTADO DE RXCR ( 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 TXSTT ( 3 downto 0 ):= "1111"; --ESTADO DE TXCT ( 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 iswhen "00" =>

TDR (7 downto 0) := D ( 7 downto 0 ); --CARGA EL TRANSMISORTDR (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; else

if RD = '0' then case AD is

when "00" =>O (7 downto 0) <= RDR ( 7 downto 0 ); --CARGA EL RECEPTORRDR (10 downto 8) := "000";

when "01" =>O (7 downto 0) <= "111111"& TDR(8)& RDR(8); --CARGA EL DIVI DE BAUD BAJO

when others =>BR (15 downto 8) := D ( 7 downto 0 ); --CARGA EL DIVI DE BAUD ALTO

end case;end if;

end if; end if;

--O (7 DOWNTO 4) <= CTH (3 DOWNTO 0);--O (3 DOWNTO 0) <= STT (3 DOWNTO 0);

case STR iswhen "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 );

elseif CR ( 1 downto 0 )= "00" then

if RXD='1' thenSTR := "1111";

end if;end if;

end if;when "1000" =>

if CR ( 15 downto 0 )="0000000000000000" thenSTR := "1111";RDR(9) := RDR(8) OR RDR(9); --error de sobrevelocidadRDR(10):= not(RXD); --error de enmarqueRDR(8 downto 0):= '1'& RSR (7 downto 0 );

end if;when others =>

if CR ( 15 downto 0 )="0000000000000000" thenCR ( 15 downto 0 ):= BR ( 15 downto 0 );RSR (7 downto 0 ):= RXD & RSR (7 downto 1 );STR := STR+1;

end if; 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ónZ(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 TXCT(15 downto 0) := BR(15 downto 0);

case STT is --TRANSMISORwhen "0000" =>

TXD <= '0';STT := STT +1;

when "0001" =>TXD <= TSR(0);STT := STT +1;

when "0010" =>TXD <= TSR(1);STT := STT +1;

when "0011" =>TXD <= TSR(2);STT := STT +1;

when "0100" =>TXD <= TSR(3);STT := STT +1;

when "0101" =>TXD <= TSR(4);STT := STT +1;

when "0110" =>TXD <= TSR(5);STT := STT +1;

when "0111" =>TXD <= TSR(6);STT := STT +1;

when "1000" =>TXD <= TSR(7);STT := STT +1;

when "1001" =>TXD <= '1';if TDR(8) = '1' then

TSR( 7 downto 0) :=TDR( 7 downto 0);TDR(8) := '0';STT := "0000";

elseSTT := STT +1;

end if;when others =>

if TDR(8) = '1' thenTSR( 7 downto 0) :=TDR( 7 downto 0);TDR(8) := '0';STT := "0001";

TXD <= '0';else

STT := "1111";TXD <= '1';

end if;end case; --FIN DE TRANSMISOR

end if;CT := CT-1;CR := CR-1;

end if;end if;end process;end B2;

F I N

top related