Sie sind auf Seite 1von 18

Instituto Politcnico

Nacional
Unidad Profesional Interdisciplinaria
D

de Ingeniera y Tecnologas Avanzadas.


Materia : Dispositivos lgicos programables.
Nombre de los integrantes:
Mata Mireles Hctor Omar.
Sandoval Mendoza Manuel.
Martnez Luis Edgar Eduardo.
Grupo: 2MV12
Nombre del profesor: Trejo Salazar David
Benjamin.

Reporte: Practica 3 (Comunicacin RS232).

INTRODUCCION.
En esta prctica se realizaran tres ejercicios, con el fin de mostrar el funcionamiento de la
comunicacin por rs232 utilizando la tarjeta nexys 2.

MARCO TEORICO.
COMUNICACIN POR RS232
El protocolo RS-232 es una norma o estndar mundial que rige los parmetros de uno de los
modos de comunicacin serial. Por medio de este protocolo se estandarizan las velocidades de
transferencia de datos, la forma de control que utiliza dicha transferencia, los niveles de voltajes
utilizados, el tipo de cable permitido, las distancias entre equipos, los conectores, etc.
Adems de las lneas de transmisin (Tx) y recepcin (Rx), las comunicaciones seriales poseen
otras lneas de control de flujo (Hands-hake), donde su uso es opcional dependiendo del
dispositivo
a
conectar.

A nivel de software, la configuracin principal que se debe dar a una conexin a travs de puertos
seriales. RS-232 es bsicamente la seleccin de la velocidad en baudios (1200, 2400, 4800, etc.), la
verificacin de datos o paridad (parida par o paridad impar o sin paridad), los bits de parada luego
de cada dato(1 2), y la cantidad de bits por dato (7 8), que se utiliza para cada smbolo o
carcter
enviado.

La Norma RS-232 fue definida para conectar un ordenador a un modem. Adems de

transmitirse los datos de una forma serie asncrona son necesarias una serie de seales
adicionales, que se definen en la norma. Las tensiones empleadas estn comprendidas
entre
+15/-15
voltios.

Puerta serial full dplex para comunicacin punto a punto a una distancia no superior a 30
metros. Desde 3 hilos hasta 19 hilos.

Este protocolo est disponible en los puertos seriales de la mayora de las computadoras
personales (PC).

El primer puerto serial denominado comnmente COM1 tiene asignada la interrupcin


IRQ4 y sus registros empiezan en la direccin de la memoria %3F8, y de ah en adelante
hasta la %3FE. Para las mquinas que tienen un segundo puerto serial este se denomina
COM2, tiene asignada la interrupcin IRQ3 y sus registros se alojan en las direcciones
%2F8 hasta la %2FE. Los puertos denominados COM3 y COM4 a pesar de que se mapean
en un espacio diferente de los puertos anteriores, comparten las interrupciones, COM1
con COM3 y COM2 con COM4, por esto es muy difcil utilizar los cuatro cuando se trata de
hacerlos funcionar mediante interrupciones.
Conector RS232D (Conector DB9 de 9 pines)
La siguiente tabla muestra el conector de 9 pines serie que se encuentra en la mayora de
las PC de hoy en da.
SIGNAL

PIN No.

Carrier Detect

Receive Data

Transmit Data

Data Terminal Ready

Signal Ground

Data Set Ready

Request To Send

Clear To Send

Ring Indicator

Seales de la RS-232.

Request To Send (RTS) Esta seal se enva de la computadora (DTE) al mdem


(DCE) para indicar que se quieren transmitir datos. Si el mdem decide que esta
OK, asiente por la lnea CTS. Una vez la computadora prende la seal RTS, esperar
que el mdem asiente la lnea CTS. Cuando la seal CTS es afirmado por el mdem,
la computadora empezar a transmitir datos.

Clear To Send (CTS) Afirmado por el mdem despus de recibir la seal de RTS
indica que la computadora puede transmitir.

Data Terminal Ready (DTR) Esta lnea de seal es afirmada por la computadora, e
informa al mdem que la computadora est lista para recibir datos.

Data Set Ready (DSR) Esta lnea de seal es afirmada por el mdem en respuesta a
una seal de DTR de la computadora. La computadora supervisa el estado de esta
lnea despus de afirmar DTR para descubrir si el mdem esta encendido.

Receive Signal Line Detect (RSLD) Esta lnea de control es afirmada por el mdem e
informa a la computadora que se ha establecido una conexin fsica con otro
mdem. A veces se conoce como detector de portadora (CD). sera un error que
una computadora transmita informacin a un mdem si esta lnea no esta
prendida, es decir si la conexin fsica no funciona.

Transmit Data (TD) es la lnea por donde el dato se transmite de un bit a la vez

Receive Data (RD) es la lnea por donde el dato se recibe de un bits a la vez.

OBJETIVO.
El objetivo de esta prctica es realizar tres ejercicios que involucran el uso de la
comunicacin rs232, para esto se utilizara la tarjeta nexys 2.

DESARROLLO.
Para el primer ejercicio mostrado a continuacin utilizamos una hyperterminal versin de
Windows xp en donde configuramos diferentes parmetros como son los baudios, bits de
paridad, bits de datos, entre otros, como se muestra en la figura 1, para despus verificar los
datos enviados por la fpga cuando se activa el selector.

Figura 1. Hiperterminal de Windows xp

Cdigo empleado

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
entity serial is
Port ( datos : in STD_LOGIC_VECTOR (7 downto 0);
clk : in std_logic;
salida : out STD_LOGIC);
end serial;
architecture Behavioral of serial is
signal cont: std_logic_vector(11 downto 0);
signal frecuencia: std_logic;
signal cont2: std_logic_vector(3 downto 0);
begin
process (clk, cont, frecuencia)
begin
if (clk'event and clk = '1') then
cont<= cont+1;
if cont = "101000101100" then
frecuencia <= not frecuencia;
cont<="111111111111";
end if;
end if;
end process;
process (frecuencia)
begin

if (frecuencia'event and frecuencia = '1') then


cont2<= cont2+1;
if cont2 = "1111" then
cont2<="0000";
end if;
end if;
end process;
process(frecuencia, datos)
begin
if (frecuencia'event and frecuencia='1') then
if cont2="0000" then
salida<='1';
elsif cont2="0001" then
salida<='1';
elsif cont2="0010" then
salida<='1';
elsif cont2="0011" then
salida<='0';
elsif cont2="0100" then
salida<=datos(0);
elsif cont2="0101" then
salida<=datos(1);
elsif cont2="0110" then
salida<=datos(2);
elsif cont2="0111" then
salida<=datos(3);
elsif cont2="1000" then
salida<=datos(4);
elsif cont2="1001" then
salida<=datos(5);
elsif cont2="1010" then
salida<=datos(6);
elsif cont2="1011" then
salida<=datos(7);
elsif cont2<="1100" then
salida<='1';
elsif cont2<="1101" then
salida<='1';
elsif cont2<="1110" then
salida<='1';
elsif cont<="1111" then
salida<='1';
end if;
end if;
end process;

end Behavioral;
Declaracion de pines
net datos(0) loc=G18;
net datos(1) loc=H18;
net datos(2) loc=K18;
net datos(3) loc=K17;
net datos(4) loc=L14;
net datos(5) loc=L13;
net datos(6) loc=N17;
net datos(7) loc=R17;
net salida loc=P9;
net clk loc=B8;

Para el segundo ejercicio mostrado a continuacin se utiliz la hiperterminal configurndolo


asi como muestra el ejercicio, para enviar datos se presiona alguna tecla y el resultado se
muestra en binario por medio de los leds de la fpga.

Codigo empleado

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
entity tx is
Port ( clk,RST: in STD_LOGIC;
Rx: in STD_LOGIC;
Dout : out STD_LOGIC_VECTOR (7 downto 0));
end tx;

architecture Behavioral of tx is
type EdoRx is (EsperaRX, Empieza, FlancoDato, CargaRX, ParaRX, ErrorRX);
signal RXFSM : EdorX:= EsperaRX;
signal Top16, TopRX : std_logic;
signal Rx_Reg : std_logic_vector(9 downto 0);
signal RxRdyi, ClrDiv, RxErr : std_logic;
begin
---relog base
process (RST, CLK)
variable div16: integer range 0 to 325 ;
begin
if RST='1' then
Top16 <= '0';
Div16 := 0;
elsif rising_edge(CLK) then
Top16 <= '0';

if Div16 = 325 then


Div16 := 0;
Top16 <= '1';
else
Div16 := Div16 + 1;
end if;
end if;
end process;
---Rx simplificando el ciclo de relog
process (RST, CLK)
variable RxDiv: integer range 0 to 325 ;
begin
if RST='1' then
TopRx <= '0';
RxDiv := 0;
elsif rising_edge(CLK) then
TopRx <= '0';
if ClrDiv='1' then
RxDiv := 0;
elsif Top16='1' then
if RxDiv = 7 then
RxDiv := 0;
TopRx <= '1';
else
RxDiv := RxDiv + 1;
end if;
end if;

end if;
end process;
process (RST, CLK)
variable RxBitCnt: integer range 0 to 8 ;

begin
if RST='1' then
Rx_Reg <= (others => '0');
Dout <= (others => '0');
RxBitCnt := 0;
RxFSM <= EsperaRX;
RxRdyi <= '0';
ClrDiv <= '0';
RxErr <= '0';
elsif rising_edge(CLK) then
ClrDiv <= '0';
if RxRdyi = '1' then
RxErr <= '0';
RxRdyi <= '0';
end if;
case RxFSM is
when EsperaRX =>
RxBitCnt := 0;
if Top16 = '1' then
if Rx = '0' then
RxFSM <= Empieza;
ClrDiv <='1';
else
RxFSM <= EsperaRX;
end if;
else
RxFSM <= EsperaRX;
end if;
when Empieza =>
if TopRx = '1' then
if Rx = '1' then
RxFSM <= ErrorRx;
else
RxFSM <= FlancoDato;
end if;
end if;
when FlancoDato =>
if TopRx = '1' then

if RxBitCnt = 8 then
RxFSM <= ParaRx;
else
RxFSM <= CargaRx;
end if;
else
RxFSM <= FlancoDato;
end if;

Para el ejercicio 3 mostrado a continuacin, es una combinacin de los dos ejercicios


anteriores.

3.- Implementar en una FPGA la comunicacin serial (transmisin-recepcin) de tal manera que
tenga la posibilidad de tener varias velocidades de operacin y configuracin, como incluir bit de
paridad, configuracin de bits de parada y configuracin de bits transmitidos. Los datos a
transmitir se controlaran con una seria de switch. Y con un botn pulsador de enviar, la recepcin
se verificara con leds, recordar incluir los controles de configuracin. Esto se verificara con la
ayuda de una hypertelminal.
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;

entity serial is
Port ( datos : in STD_LOGIC_VECTOR (7 downto 0);
clk : in std_logic;
salida : out STD_LOGIC;
RST: in STD_LOGIC;
Rx: in STD_LOGIC;
Dout : out STD_LOGIC_VECTOR (7 downto 0));

end serial;
architecture Behavioral of serial is

signal cont: std_logic_vector(11 downto 0);


signal frecuencia: std_logic;
signal cont2: std_logic_vector(3 downto 0);
type EdoRx is (EsperaRX, Empieza, FlancoDato, CargaRX, ParaRX, ErrorRX);
signal RXFSM : EdorX:= EsperaRX;
signal Top16, TopRX : std_logic;
signal Rx_Reg : std_logic_vector(9 downto 0);
signal RxRdyi, ClrDiv, RxErr : std_logic;
--signal Dout2 : std_logic_vector(7 downto 0);

begin

--///Fija la Frecuencia de Transmision a 9600 bd\\\


process (clk, cont, frecuencia)
begin
if (clk'event and clk = '1') then
cont<= cont+1;
if cont = "101000101100" then
frecuencia <= not frecuencia;
cont<="111111111111";
end if;
end if;
end process;

--/////Manda el dato cuando esta lista la frecuancia de transmision\\\\\


process (frecuencia)
begin
if (frecuencia'event and frecuencia = '1') then
cont2<= cont2+1;

if cont2 = "1111" then


cont2<="0000";
end if;
end if;
end process;

--///Carga los Datos a un Buffer y los envia cuando la frecuencia es la indicada\\\


process(frecuencia, datos)
begin

if (frecuencia'event and frecuencia='1') then


if cont2="0000" then
salida<='1';
elsif cont2="0001" then
salida<='1';
elsif cont2="0010" then
salida<='1';
elsif cont2="0011" then
salida<='0';
elsif cont2="0100" then
salida<=datos(0);
elsif cont2="0101" then
salida<=datos(1);
elsif cont2="0110" then
salida<=datos(2);
elsif cont2="0111" then
salida<=datos(3);
elsif cont2="1000" then
salida<=datos(4);

elsif cont2="1001" then


salida<=datos(5);
elsif cont2="1010" then
salida<=datos(6);
elsif cont2="1011" then
salida<=datos(7);
elsif cont2<="1100" then
salida<='1';
elsif cont2<="1101" then
salida<='1';
elsif cont2<="1110" then
salida<='1';
elsif cont<="1111" then
salida<='1';
end if;
end if;
end process;

-------------------------------------------------------------------------------------------------------------

process (RST, CLK)


variable div16: integer range 0 to 325 ;
begin
if RST='1' then
Top16 <= '0';
Div16 := 0;
elsif rising_edge(CLK) then
Top16 <= '0';

if Div16 = 325 then


Div16 := 0;
Top16 <= '1';
else
Div16 := Div16 + 1;
end if;
end if;
end process;
---Rx simplificando el ciclo de relog
process (RST, CLK)
variable RxDiv: integer range 0 to 325 ;
begin
if RST='1' then
TopRx <= '0';
RxDiv := 0;
elsif rising_edge(CLK) then
TopRx <= '0';
if ClrDiv='1' then
RxDiv := 0;
elsif Top16='1' then
if RxDiv = 7 then
RxDiv := 0;
TopRx <= '1';
else
RxDiv := RxDiv + 1;
end if;
end if;
end if;
end process;

--Estado maquina
--Rx_FSM:
process (RST, CLK)
variable RxBitCnt: integer range 0 to 8 ;

begin
if RST='1' then
Rx_Reg <= (others => '0');
Dout <= (others => '0');
RxBitCnt := 0;
RxFSM <= EsperaRX;
RxRdyi <= '0';
ClrDiv <= '0';
RxErr <= '0';
elsif rising_edge(CLK) then
ClrDiv <= '0';
if RxRdyi = '1' then
RxErr <= '0';
RxRdyi <= '0';
end if;
case RxFSM is
when EsperaRX =>
RxBitCnt := 0;
if Top16 = '1' then
if Rx = '0' then
RxFSM <= Empieza;
ClrDiv <='1';
else

RxFSM <= EsperaRX;


end if;
else
RxFSM <= EsperaRX;
end if;
when Empieza =>
if TopRx = '1' then
if Rx = '1' then
RxFSM <= ErrorRx;
else
RxFSM <= FlancoDato;
end if;
end if;
when FlancoDato =>
if TopRx = '1' then
if RxBitCnt = 8 then
RxFSM <= ParaRx;
else
RxFSM <= CargaRx;
end if;
else
RxFSM <= FlancoDato;
end if;
when CargaRX =>
if TopRx = '1' then
RxBitCnt := RxBitCnt + 1;
Rx_Reg <= Rx & Rx_Reg (9 downto 1);
RxFSM <= FlancoDato;
else

RxFSM <= CargaRx;


end if;
when ParaRX => -- during Stop bit
if TopRx = '1' then
Dout <= Rx_reg(8 downto 1);
RxRdyi <='1';
RxFSM <= EsperaRX;
end if;
when ErrorRx => -- Overflow / Error
RxErr <= '1';
if Rx='1' then
RxFSM <= EsperaRX;
end if;
end case;
end if;
end process;
end Behavioral;

CONCLUSIONES.
Mata Mireles Hctor Omar.
En esta prctica se aplic la teora vista en clase sobre la comunicacin rs232, el cual resulta muy
importante debido a que muchos de los proyectos involucran este tipo de comunicacin de rs232
tanto de transmisin como de recepcin, tambin utilizadas en los microcontroladores o avrs ya
sea por el mdulo de bluetooth o por el conector DB9.
Sandoval Mendoza Manuel
En la siguiente prctica se pudo observar la implementacin de la comunicacin serial a travs de
la programacin en el entorno VHDL y se enfatiz su importancia en proyectos que requieran la
transferencia de datos o el monitoreo de un proceso.

Martnez Luis Edgar Eduardo


En la prctica anterior aprendimos los parmetros para utilizar la comunicacin serial la cual es de
suma importancia para los proyectos que necesiten transferir datos.

BIBLIOGRAFIA.
http://rdedatos.tripod.com/rs232.htm

Das könnte Ihnen auch gefallen