















Prepara tus exámenes y mejora tus resultados gracias a la gran cantidad de recursos disponibles en Docsity
Gana puntos ayudando a otros estudiantes o consíguelos activando un Plan Premium
Prepara tus exámenes
Prepara tus exámenes y mejora tus resultados gracias a la gran cantidad de recursos disponibles en Docsity
Prepara tus exámenes con los documentos que comparten otros estudiantes como tú en Docsity
Los mejores documentos en venta realizados por estudiantes que han terminado sus estudios
Estudia con lecciones y exámenes resueltos basados en los programas académicos de las mejores universidades
Responde a preguntas de exámenes reales y pon a prueba tu preparación
Consigue puntos base para descargar
Gana puntos ayudando a otros estudiantes o consíguelos activando un Plan Premium
Comunidad
Pide ayuda a la comunidad y resuelve tus dudas de estudio
Descubre las mejores universidades de tu país según los usuarios de Docsity
Ebooks gratuitos
Descarga nuestras guías gratuitas sobre técnicas de estudio, métodos para controlar la ansiedad y consejos para la tesis preparadas por los tutores de Docsity
Se trata de algo que tengo que escribir aqui
Tipo: Esquemas y mapas conceptuales
1 / 23
Esta página no es visible en la vista previa
¡No te pierdas las partes importantes!
El objetivo de este manual de prácticas es que el alumno pueda adquirir las
habilidades necesarias para utilizar e identificar la estructura de programación de
los sistemas digitales combinacionales, secuenciales, dentro del entorno de
programación VHDL, que se será implementado en un dispositivo lógico
programable (PLD) FPGA.
▪ El alumno con el apoyo del software de simulación “Xilinx 14.7” y la tarjeta FPGA
“BASYS2” aprenderá a programar los diferentes tipos de circuitos digitales de forma adecuada y así poder realizar el montaje físico de dichos sistemas digitales utilizando la tarjeta Basys2.
▪ A través del uso de los softwares de programación y simulación, el alumno podrá
entender de una mejor forma el funcionamiento de los sistemas digitales programables, ya que podrá razonar y comprender su funcionamiento en forma de código y real.
El software Xilinx 14.7 es un entorno virtual, que permite realizar simulaciones de
circuitos combinacionales, circuitos secuenciales con flip – flop’s, a base de
programación en código VHDL; además de poder realizar de forma sencilla toda
una gama de circuitos digitales complejos; facilitando al alumno el conocimiento en
relación con el funcionamiento y comportamiento, de cada uno de los elementos de
programación que conforman los sistemas digitales programables.
El manual consta de seis prácticas, las cuales incluyen tanto el circuito a realizar,
como su descripción en código VHDL. En su mayoría las practicas presentan
errores de sintaxis y lógica; con el propósito de que el alumno resuelva dichos
errores demostrando así sus conocimientos adquiridos en la materia de sistemas
digitales.
PRACTICA 1: contador / decodificador BCD con display siete segmentos
En la siguiente práctica el alumno diseñará un contador binario 0 a 15 decodificado a BCD para un Display de 7 segmentos. Con los interruptores de la “tarjeta Basys2” se pretende ingresar un número binario, el cual será visualizado en los leds (salidas) y en el display de 7 segmentos al mismo tiempo.
Código del decodificador en VHDL: -- librería
library IEEE; use IEEE.STD_LOGIC_1164.ALL;
entity practica_contador is Port (a: in STD_LOGIC_VECTOR (4 downto 0); led: out STD_LOGIC_VECTOR (3 downto 0) sel: out STD_LOGIC_VECTOR (3 downto 0); d: out STD_LOGIC_VECTOR (6 downto 0)); end practica_contador;
architecture practica_contaodor of practica_contador is signal q: std_logic_vectos (3 downto 0); begin
--activación de los leds del Display con nivel bajo "0" -- se utilizará la instrucción "process" y "case"
process (a) begin
case a is when "0000" => d <= "0000001"; -- 0 when "0001" => d <= "1001111"; -- 1 when "0010" => d <= "0010010"; -- 2 when "0011" => d <= ‘ 0000110 ’; -- 3 when "0100" => d <= "1001100"; -- 4 when "0101" => d <= "0100100"; -- 5 when "0110" => d <= "0100000"; -- 6 when ‘ 0111 ’ => d <= "0001111"; -- 7 when "1000" => d <= "0000000"; -- 8 when "1001" => d <= "0001100"; -- 9 when "1010" => d <= "0001000"; -- A
when "1011" => d <= "1100000"; -- B when "1100" => d <= "1110010"; -- C when "1101" => d <= "1000010"; -- D when "1110" => d <= "0110000"; -- E when "1111" => d <= "0111000"; -- F when others => d <= "0000000"; --RESET
end case; end process;
led <= a; sel_disp <= "1110"; end practica_contador;
-- pulsos (test bench)
Diagrama esquemático:
PRACTICA 2: Contador binario Ascendente de 0 a 15
En esta práctica se diseñará un contador ascendente. Para que un contador funcione se necesita un generador de pulsos (reloj), y en este caso será utilizado el reloj de la tarjeta Basys2, recuerde que el reloj de la tarjeta es de 50 MHz lo que significa un problema ya que el ojo humano es incapaz de ver pulsos a esa velocidad, es por ello que dentro del proyecto será necesario hacer un reloj más lento que el de la tarjeta; a continuación, se describe paso a paso el desarrollo del proyecto.
Código del contador ascendente en VHDL:
-- Librería para el contador ascendente
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
-- entidad para el contador ascendente
entity contadorAD is
Port ( clk: in STD_LOGIC; reset: in STD_LOGIC; Q : out STD_LOGIC_VECTOR (3 downto 0));
end contadorAD;
-- arquitectura para el contador ascendente
architecture contadorAD of contadorAD is
signal aux: std_logic_vector (3 downto 0);
signal divisor: std_logic_vector (2 downto 0);
signal reloj_lento: std_logic;
begin
--Proceso para la cuenta de 4 bits
process (reloj_lento, reset)
begin
if reset = '1' then
aux <= "0000";
elsif reloj_lento'event and reloj_lento = '1' then
aux <= aux + 1;
end if;
Q<= aux;
-- contador auxiliar que corre con el cristal de la tarjeta (50 MHz)
--permite reducir la frecuencia.
process (clk, reset)
begin
if (reset = '1') then
divisor <= (others => '0');
elsif (clk'event and clk = '1') then
divisor <= divisor + 1;
end if;
end process;
-- se toma el bit más significativo del contador auxiliar para dividir la frecuencia de operación.
reloj_lento <= divisor (2);
end contadorAD;
Diagrama esquemático:
divisor <= (others => '0'); elsif clk'event and clk = '1' then divisor <= divisor + 1;
end if; end process;
-- se toma el bit más significativo del contador auxiliar para -- dividir la frecuencia de operación
reloj_lento <= divisor (2);
-- se asignan las salidas al display de 7 segmentos
sal<= "0000001" when cuenta=0 else "1001111" when cuenta=1 else "0010010" when cuenta=2 else "0000110" when cuenta=3 else "1001100" when cuenta=4 else "0100100" when cuenta=5 else "0100000" when cuenta=6 else "0001111" when cuenta=7 else "0000000" when cuenta=8 else "0001100" when cuenta=9 else "0001000" when cuenta=10 else "1100000" when cuenta=11 else "0110001" when cuenta=12 else "1000010" when cuenta=13 else "0110000" when cuenta=14 else "0111000" when cuenta=15 else "0000001";
sel_disp <= "0111"; end contador_display;
PRÁCTICA 4: Encendido y paro de un motor de CD.
La tarjeta Basys2 cuenta con 4 módulos de expansión PMOD con 4 entradas/salidas cada uno. Utilizando una de estas salidas se encenderá un motor de CD de 5V por medio de uno de los switches de la tarjeta.
Materiales:
Codigo en VHDL:
-- librería library IEEE; use IEEE.STD_LOGIC_1164.ALL;
-- Entidad entitty encendido_motor is Port (inicio_paro: in STD_LOGIC; motor: out STD_LOGIC)); end encendido_motor;
-- Arquitectura architecture encendido_motor of encendido_motor is begin
motor <= inicio_paro; end encendido_motor;
Diagrama Esquemático:
Hoja de datos del optoacoplador 4N25:
Teniendo la experiencia de la práctica 4 para hacer el acondicionamiento de señal necesario para utilizar las salidas de la Tarjeta Basys2, se pretende en esta práctica que el Motor de CD encienda y cambie su sentido de rotación al enviar la acción de control desde los switches de la tarjeta.
Como se puede apreciar en el código se cuenta con una entrada start, para encender o apagar el motor, una entrada sentido, para cambiar el sentido de rotación del motor, dos salidas s1 y s2, las cuales enviarán un pulso del valor de la entrada sentido y otras dos salidas led_start y led_sent para indicar que el motor está en marcha y para indicar el sentido de rotación respectivamente, estos dos leds serán de la tarjeta.
Materiales:
library IEEE; use IEEE.STD_LOGIC_1164.ALL;
-- ENTIDAD
entity motor_puente_H is Port ( star: in STD_LOGIC; sentido_jiro: in STD_LOGIC; s1_izquierda: out STD_LOGIC; -- jiro del motor a la izquierda s2_derecha: out STD_LOGIC; -- jiro del motor a la dercha led_start: out STD_LOGIC; led_sentido: out STD_LOGIC; -- se enciende solo cuando el motor jira a la derecha
Finalmente cheque la sintaxis, asigne pines, arme en el protoboard el circuito externo y descargue el programa hacia la tarjeta Basys2 para comprobar el funcionamiento.
NOTA IMPORTANTE: Las tierras (GND) de la tarjeta Basys2 y del circuito externo de acondicionamiento de señal, deben estar acopladas; además la tarjeta no debe recibir, ni enviar voltaje.
Diagrama esquemático:
Hoja de datos L293D:
p: in std_logic; --- habilitador 0 a 9 d: out std_logic_vector(5 downto 0)); end semaforo;
--- arquitectura
architecture semaforo of semaforo is signal q: std_logic_vector(3 downto 0); signal p: std_logic; begin
process (clk, reset) begin
if (clk'event and clk='1') then q <= q+1; if (q="1001") then q<= "0000"; end if; end if; end process;
process(q,p) begin
case q is when "0000" => if p='1' then d<= "001100"; elsif p='0' then d<= "001100"; end if;
when "0001" => if p='1' then d<= "001100"; elsif p='0' then d<="001100"; end if;
when "0010" =>
if p='1' then d<= "001100"; elsif p='0' then d<="001100"; end if;
when "0011" => if p='1' then d<= "001100"; elsif p='0' then d<="001100"; end if;
---- cuando se llega a cuatro se comienza con los cambios de luces de verde a amarillo.
when "0100" => if p='1' then d<= "010100"; elsif p='0' then d<="001100"; end if;
when "0101" => ---- permanence Amarillo if p='1' then d<= "010100"; elsif p='0' then d<="001100"; end if;
------- ahora la luz que estaba en amarillo cambiara a rojo y la que estaba en rojo pasa a color verde.
when "0110" => if p='1' then d<= "100001"; elsif p='0' then d<="001100"; end if;
------ el cambio permanece durante dos ciclos de reloj.