Está en la página 1de 7

UNIVERSIDAD NACIONAL

AUTÓNOMA DE MÉXICO

FACULTAD DE INGENIERÍA

DISEÑO DIGITAL VLSI


PRÁCTICA NO. 9
DISEÑO DE UN RECEPTOR PARA
COMUNICACIÓN SERIAL

PROFESOR: RAFAEL PRIETO MELÉNDEZ

ALUMNO: RAMOS VILLASEÑOR CÉSAR MAURICIO

SEMESTRE: 2020-1

GRUPO DE TEORÍA: 3

FECHA: 06/11/19

This study source was downloaded by 100000863546949 from CourseHero.com on 05-17-2023 09:47:06 GMT -05:00

https://www.coursehero.com/file/107338961/Practica-9pdf/
OBJETIVO
Demostrar a los estudiantes mediante el diseño de un módulo receptor (RX), usado en
comunicaciones de tipo serial UART (Universal Asyncrhonous Receiver Transmitter), la
utilidad de este módulo, así como la importancia de su presencia en la arquitectura de un
procesador para aplicaciones electrónicas de recepción de información. Mostrar su aplicación
en el control de dispositivos periféricos desde una terminal remota.

ACTIVIDADES COMPLEMENTARIAS
1.- A partir del código presentado, el alumno desarrollará un bloque funcional genérico para
realizar la recepción serial de un byte, el cual cuente con un parámetro genérico para
seleccionar el baud rate y tenga una bandera de salida que nos indique cuando se ha recibido
un caracter y está listo para ser leído, cuyo diagrama de bloques se muestra en la figura y que
pasará a ser parte de la biblioteca de módulos funcionales del alumno.

Código solución:
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.NUMERIC_STD.ALL;
entity RX_generic is
port( Clk : IN STD_LOGIC;
baud: in STD_LOGIC_VECTOR(2 downto 0);
bandera: INOUT STD_LOGIC := '0';
LEDS : OUT STD_LOGIC_VECTOR(7 downto 0);
RX_WIRE : IN STD_LOGIC);
end entity;

architecture behavioral OF RX_generic IS


signal BUFF: STD_LOGIC_VECTOR(9 downto 0);
signal Flag: STD_LOGIC := '0';
signal PRE: INTEGER RANGE 0 TO 5208 := 0;
signal INDICE: INTEGER RANGE 0 TO 9 := 0;
signal PRE_val: INTEGER range 0 to 41600;
--signal baud: STD_LOGIC_VECTOR(2 downto 0);

begin
RX_dato : process(Clk)
begin
if (Clk'EVENT and Clk = '1') then
2
This study source was downloaded by 100000863546949 from CourseHero.com on 05-17-2023 09:47:06 GMT -05:00

https://www.coursehero.com/file/107338961/Practica-9pdf/
bandera <= '0';
if (Flag = '0' and RX_WIRE = '0') then
Flag<= '1';
INDICE <= 0;
PRE <= 0;
end if;
if (Flag = '1') then
BUFF(INDICE)<=RX_WIRE;
if(PRE < PRE_val) then
PRE <= PRE + 1;
else
PRE <= 0;
end if;
if(PRE = PRE_val/2) then
if(INDICE < 9) then
INDICE <= INDICE + 1;
else
if(BUFF(0) = '0' and BUFF(9)= '1') then
bandera <= '1';
LEDS <= BUFF(8 DOWNTO 1);
else
LEDS <= "00000000";
bandera <= '0';
end if;
Flag <= '0';
end if;
end if;
end if;
end if;
end process RX_dato;

--baud<="011";
with (baud) select
PRE_val <= 41600 when "000", -- 1200 bauds
20800 when "001", -- 2400 bauds
10400 when "010", -- 4800 bauds
5200 when "011", -- 9600 bauds
2600 when "100", -- 19200 bauds
1300 when "101", -- 38400 bauds
866 when "110", -- 57600 bauds
432 when others; --115200 bauds
end architecture behavioral;

Podemos observar en nuestro código la separación correcta del módulo genérico. Logramos
separar a partir del código dado en la práctica, las componentes necesarias para simplemente,
recibir un valor de baud, un reloj y una bandera. Esta bandera fue declarada como tipo entrada
y salida, con el fin de que sea leída en algún proceso. Adicionalmente tenemos como salidas
un vector LEDS que será el valor transformado en ASCII ingresado desde la terminal. Una
última entrada es la señal RX_wire que fungirá como el vector enviado a la tarjeta, el cual será
procesado para interpretar su valor en ASCII binario.
3
This study source was downloaded by 100000863546949 from CourseHero.com on 05-17-2023 09:47:06 GMT -05:00

https://www.coursehero.com/file/107338961/Practica-9pdf/
2. Segunda actividad complementaria. Realizar una implementación del bloque genérico junto
con el motor a pasos para controlar su movimiento, derecha (letra D), izquierda (letra I), alto
(letra A), control de leds (letra L).

Código Motor a pasos


library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.NUMERIC_STD.ALL;
entity RX_generic is
port( Clk : IN STD_LOGIC;
baud: in STD_LOGIC_VECTOR(2 downto 0);
bandera: INOUT STD_LOGIC := '0';
LEDS : OUT STD_LOGIC_VECTOR(7 downto 0);
RX_WIRE : IN STD_LOGIC);
end entity;

architecture behavioral OF RX_generic IS


signal BUFF: STD_LOGIC_VECTOR(9 downto 0);
signal Flag: STD_LOGIC := '0';
signal PRE: INTEGER RANGE 0 TO 5208 := 0;
signal INDICE: INTEGER RANGE 0 TO 9 := 0;
signal PRE_val: INTEGER range 0 to 41600;
--signal baud: STD_LOGIC_VECTOR(2 downto 0);

begin
RX_dato : process(Clk)
begin
if (Clk'EVENT and Clk = '1') then
bandera <= '0';
if (Flag = '0' and RX_WIRE = '0') then
Flag<= '1';
INDICE <= 0;
PRE <= 0;
end if;
if (Flag = '1') then
BUFF(INDICE)<=RX_WIRE;
if(PRE < PRE_val) then
PRE <= PRE + 1;
else
PRE <= 0;
end if;
if(PRE = PRE_val/2) then
if(INDICE < 9) then
INDICE <= INDICE + 1;
else
if(BUFF(0) = '0' and BUFF(9)= '1') then
bandera <= '1';
LEDS <= BUFF(8 DOWNTO 1);
else
LEDS <= "00000000";
4
This study source was downloaded by 100000863546949 from CourseHero.com on 05-17-2023 09:47:06 GMT -05:00

https://www.coursehero.com/file/107338961/Practica-9pdf/
bandera <= '0';
end if;
Flag <= '0';
end if;
end if;
end if;
end if;
end process RX_dato;

--baud<="011";
with (baud) select
PRE_val <= 41600 when "000", -- 1200 bauds
20800 when "001", -- 2400 bauds
10400 when "010", -- 4800 bauds
5200 when "011", -- 9600 bauds
2600 when "100", -- 19200 bauds
1300 when "101", -- 38400 bauds
866 when "110", -- 57600 bauds
432 when others; --115200 bauds
end architecture behavioral;

Se utiliza también el código descrito del bloque genérico del transmisor.


Código main
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.NUMERIC_STD.ALL;
entity motor_rx is
port( clk : IN STD_LOGIC;
leds : out STD_LOGIC_VECTOR(3 DOWNTO 0) := x"0";
motor : out STD_LOGIC_VECTOR(3 downto 0) := x"0";
rx_wire : IN STD_LOGIC
);
end entity;

architecture behavioral OF motor_rx IS

component RX_generic is
port( clk : IN STD_LOGIC;
baud: in STD_LOGIC_VECTOR(2 downto 0);
bandera: INOUT STD_LOGIC := '0';
LEDS : OUT STD_LOGIC_VECTOR(7 downto 0);
RX_WIRE : IN STD_LOGIC);
end component;

component MotPasos is
port ( clk : in STD_LOGIC;
UD : in STD_LOGIC;
rst : in STD_LOGIC;
5
This study source was downloaded by 100000863546949 from CourseHero.com on 05-17-2023 09:47:06 GMT -05:00

https://www.coursehero.com/file/107338961/Practica-9pdf/
FH : in STD_LOGIC_VECTOR(1 downto 0);
mot : out STD_LOGIC_VECTOR(3 downto 0) );
end component;

signal letra : STD_LOGIC_VECTOR(7 downto 0);


signal bandera : STD_LOGIC;
signal UD : STD_LOGIC;
signal reset: STD_LOGIC;
signal FH : STD_LOGIC_VECTOR(1 downto 0);
signal ledsflag : STD_LOGIC_VECTOR(3 DOWNTO 0) := "0000"; --Nos ayudara a apagar y
encender los leds
signal baud : STD_LOGIC_VECTOR(2 downto 0) :="011";
begin

asignacion: process(bandera, letra)


begin
if rising_edge(bandera) then
case letra is
when "01100100" =>
UD <= '0';
FH <= "10";
reset <= '1';
when "01101001" =>
UD <= '1';
FH <= "10";
reset <= '1';
when "01100001" =>
reset <= '0';
when "01101100" =>
ledsflag <= not ledsflag;
leds <= ledsflag;
when others =>
reset <= '0';
end case;
end if;
end process;
U1: rx_generic port map(clk, baud, bandera, letra, rx_wire);
U2: motpasos port map(clk, UD, reset, FH, motor);
end architecture behavioral;

Tenemos como única entrada al código la señal RX_wire que será utilizada en el bloque
genérico. Como salidas, tendremos el vector de 4 bits para el control de LEDS, además del
vector que pasaremos al bloque del motor para controlarlo. El main hace dos procesos
cruciales para indicar el movimiento del motor, lo hace con base a la bandera (de ahí que
también sea inout), con esto compara el vector recibido decodificado de la terminal y lo
compara con el valor en ASCII hexadecimal de cada letra, para así saber que valores de
entradas mandar al bloque del motor a pasos. A este bloque podemos pasarle la dirección (1
ó 0 para izquierda y derecha), el FH (que dejamos preestablecidos de un modo para el
correcto funcionamiento) y la variable de reset.
6
This study source was downloaded by 100000863546949 from CourseHero.com on 05-17-2023 09:47:06 GMT -05:00

https://www.coursehero.com/file/107338961/Practica-9pdf/
El resultado se puede observar en el siguiente link de YouTube:
https://youtu.be/ZrVzdgvtCRY
CONCLUSIONES:
Podemos observar que se han cumplido todos los objetivos de la práctica, se logró un perfecto
comportamiento y control del motor, en la segunda actividad complementaria, y podemos usar
nuestro bloque de recepción en cualquier otro código. Esta práctica junto con la anterior logra
sentar las bases del conocimiento necesario para trabajar con dispositivos UART y que
funcionan como puertos seriales para la transmisión y recepción de datos en un FPGA, entre
otros usos. Me divertí mucho realizando esta práctica y creo que es una de las cuales
implementa reales aplicaciones para el diseño digital.

7
This study source was downloaded by 100000863546949 from CourseHero.com on 05-17-2023 09:47:06 GMT -05:00

https://www.coursehero.com/file/107338961/Practica-9pdf/
Powered by TCPDF (www.tcpdf.org)

También podría gustarte