ING – MECATRÓNICA SISTEMAS DIGITALES PROGRAMABLES I.C.E MARCO ANTONIO MORALES PÉREZ
SISTEMAS DIGITALES MANUAL DE PRÁCTICAS
ING – MECATRÓNICA
SISTEMAS DIGITALES PROGRAMABLES
INTRODUCCIÓN 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.
ING – MECATRÓNICA
SISTEMAS DIGITALES PROGRAMABLES RUBRICA DE EVALUACIÓN
▪
La fecha de entrega del manual de practica será el día 12 de diciembre del 2017 en un horario de 9:00 am a 4:00 pm.
▪
La revisión correspondiente se realizará una vez terminada cada práctica. Cada practica terminada de forma correcta se va a considerar con una calificación igual a “10 puntos”
▪
El alumno deberá acumular un total de 70 puntos para ser acreedor a un promedio del 100%. De no ser así solo se tomarán en cuenta los puntos acumulados para otorgar el promedio correspondiente.
▪
Será considerada calificación reprobatoria cualquier promedio menor a 80 puntos.
▪
La evaluación de las practicas se considera parte de las competencias académicas “saber hacer”. El promedio obtenido será promediado con el porcentaje correspondiente al “saber”, y “ser”.
Competencias académicas: • • •
Saber hacer = 50% de la calificación final. Saber = 30% de la calificación final. Ser = 20ª5 de la calificación final.
Practicas Realizadas:
□ PRÁCTICA 1 □ PRÁCTICA 2 □ PRÁCTICA 3 □ PRÁCTICA 4 □ PRÁCTICA 5 □ PRÁCTICA 6 □ PRÁCTICA 7
________________________________ PROMEDIO FINAL
ING – MECATRÓNICA
SISTEMAS DIGITALES PROGRAMABLES
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 when when when when when when when when when when when
a is "0000" "0001" "0010" "0011" "0100" "0101" "0110" ‘0111’ "1000" "1001" "1010"
=> => => => => => => => => => =>
d d d d d d d d d d d
<= <= <= <= <= <= <= <= <= <= <=
"0000001"; "1001111"; "0010010"; ‘0000110’; "1001100"; "0100100"; "0100000"; "0001111"; "0000000"; "0001100"; "0001000";
------------
0 1 2 3 4 5 6 7 8 9 A
ING – MECATRÓNICA
when when when when when when
"1011" "1100" "1101" "1110" "1111" others
=> => => => => =>
SISTEMAS DIGITALES PROGRAMABLES
d d d d d d
<= <= <= <= <= <=
"1100000"; "1110010"; "1000010"; "0110000"; "0111000"; "0000000";
end case; end process; led <= a; sel_disp <= "1110"; end practica_contador; -- pulsos (test bench)
Diagrama esquemático:
-- B -- C -- D -- E -- F --RESET
ING – MECATRÓNICA
Simulación:
SISTEMAS DIGITALES PROGRAMABLES
ING – MECATRÓNICA
SISTEMAS DIGITALES PROGRAMABLES
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
ING – MECATRÓNICA
SISTEMAS DIGITALES PROGRAMABLES
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:
ING – MECATRÓNICA
SISTEMAS DIGITALES PROGRAMABLES
Practica 3: Contador con salida a Display A continuación, se diseñará un contador ascendente como el de la Practica 2 y se desplegará el resultado de la cuenta en los Displays de 7 segmentos de la tarjeta Basys2.
Código del contador en vhdl: --librería library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; -- Entidad entity contador_display is Port (clk: in STD_LOGIC; reset: in STD_LOGIC; sel_disp: out std_logic_vector (3 downto 0); sal: out STD_LOGIC_VECTOR (7 downto 0); end contador_display; --Arquitectura architecture contador_display of contador_display is signal divisor: std_logic_vector (2 downto 0); signal reloj_lento: std_logic; signal cuenta: integer; begin process (reloj_lento, reset) begin if reset = '1' then cuenta <= 0; elsif reloj_lento'event and reloj_lento = '1' then cuenta <= cuenta + 1; end iff; end process; -- contador auxiliar que corre con el cristal de la tarjeta a 50MHZ -- permite reducir la frecuencia process (clk) begin if (reset = '1') then
ING – MECATRÓNICA
SISTEMAS DIGITALES PROGRAMABLES
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;
ING – MECATRÓNICA
SISTEMAS DIGITALES PROGRAMABLES
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: -
1 Optoacoplador 4N25 1 Transistor NPN 2N3906 o 2N5401 1 Protoboard 1 Resistor 330 Ω 1 Resistor 1K Ω 1 Relevador de 5V Alambre telefónico 1 Motor de CD de 3.3 a 5V
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;
ING – MECATRÓNICA
SISTEMAS DIGITALES PROGRAMABLES
Diagrama de bloques:
Desarrollo del circuito: Como se puede observar el módulo es bastante sencillo. Compile y descargue el programa hacia la tarjeta Basys2 para comprobar el funcionamiento. Una vez que se tiene el programa se debe hacer un acondicionamiento de la señal de salida de la tarjeta Basys2 para que ésta pueda encender el motor. La principal dificultad radica en el hecho de que la tarjeta tiene una salida de 3.3 V y se necesitan 5V para que el motor funcione. Cabe mencionar que los motores de CD consumen bastante corriente eléctrica y si se le exige corriente de más a la Tarjeta Basys2 se puede daña por siempre. Es por ello por lo que se utiliza un optoacoplador 4N25 el cual es un dispositivo que aísla a la tarjeta del circuito de potencia del motor. Además, se necesita un Transistor 2N3906 o 2N5401 en su configuración de amplificador para activar un relevador el cual funcionará como un interruptor para encender o detener el motor según la acción de control enviada desde el switch de la tarjeta Basys2. Por medio de una fuente externa de 5V se obtiene la potencia eléctrica necesaria para que el motor y el circuito externo funcionen sin problemas. El diagrama eléctrico del acondicionamiento de señal es mostrado en la siguiente figura. Se arma el circuito externo en un protoboard y para probar su 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.
ING – MECATRÓNICA
Diagrama Esquemático:
Hoja de datos del optoacoplador 4N25:
SISTEMAS DIGITALES PROGRAMABLES
ING – MECATRÓNICA
SISTEMAS DIGITALES PROGRAMABLES
PRACTICA 5: CAMBIO DE GIRO DE MOTOR CON PUENTE H 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: - 3 Optoacoplador 4N25 - 1 Protoboard - 3 Resistor 330 Ω - 3 Resistor 1K Ω - 1 Puente H SN754410 - Alambre telefónico - 1 Motor de CD - 5V
-- LIBRERIAS 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
ING – MECATRÓNICA
SISTEMAS DIGITALES PROGRAMABLES
enable: out STD_LOGIC); --- habilitador end motor_puente_H; -- ARQUITECTURA architecture motor_puente_H of motor_puente_H is begin enable<= not start; led_start <= start; process (sentido_jiro) begin --SENTIDO DEL MOTOR HACIA LA IZQUIERDA if sentido_jiro ='0' then s1_izquierda<= '1'; s2_derecha >='0'; led_sentido <= '0'; else --SENTIDO DEL MOTOR HACIA LA DERECHA s1_izquierda<='0'; s2_derecha<='1'; led_sentido <= '1'; end if; end process; end motor_puente_; Como se puede observar en la arquitectura el sentido de rotación del motor se controla a través de la sentencia “if” que manda un pulso en alto o bajo a las salidas s1 y s2 las cuales se conectarán al puente H en las entradas 1A y 2A. El enable controla el encendido y apagado del motor habilitando el chip.Como se utilizan 3 salidas que son conectadas a un circuito externo, son necesarios 3 opto-acopladores. El acondicionamiento de señal propuesto se muestra en la siguiente figura.
ING – MECATRÓNICA
SISTEMAS DIGITALES PROGRAMABLES
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:
ING – MECATRÓNICA
Hoja de datos L293D:
SISTEMAS DIGITALES PROGRAMABLES
ING – MECATRÓNICA
SISTEMAS DIGITALES PROGRAMABLES
PRACTICA 6: SEMÁFORO DOBLE Para esta práctica el alumno debe generar un código VHDL correcto, que ejecute la secuencia para un semáforo doble. Como se muestra en el código VHDL, se realizan varias secuencias binarias de tal forma que formen el funcionamiento secuencial de dicho semáforo. También se anexa una entrada “p” que será el accionador de la rutina que se desee llevar a cabo en la tarjeta Basys2. Material: 6 resistencias de 330Ω 2 leds verdes 2 leds amarillos 2 leds rojos Tarjeta Basys2. 1 protoboard Programa Xilinx 14.7 Diagrama de bloque:
Código para una secuencia de semáforo doble en VHDL: --- librerias library IEEE; use IEEE.STD_LOGIC_1164.ALL; use ieee.std_logic_unsigned.all; use ieee. std_logic_arith.all; --entidad entity semaforo is port ( clk: in std_logic; --- reloj
ING – MECATRÓNICA
SISTEMAS DIGITALES PROGRAMABLES
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" =>
ING – MECATRÓNICA
SISTEMAS DIGITALES PROGRAMABLES
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 los cambios de luces de verde a amarillo.
comienza
con
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.
ING – MECATRÓNICA
SISTEMAS DIGITALES PROGRAMABLES
when "0111" => if p='1' then d<= "100001"; elsif p='0' then d<="001100"; end if; when "1000" => if p='1' then d<= "100010"; elsif p='0' then d<="001100"; end if; ------ aqui se llega a la cuenta en 9 = 1001 pero antes se declaró que cuando se llegara a nueve la secuencia se reiniciara nuevamente. when others => if p='1' then d<= "100010"; elsif p='0' then d<="001100"; end if; end case; end process; end semaforo; presentación del semáforo: para comprobar el funcionamiento del código en VHDL, el alumno debe presentar una maqueta “pequeña” en la cual se lleve a cabo la rutina del semáforo doble. Dicha baqueta deberá ser adaptar las conexiones entre los LED y las salidas de la tarjeta Basys2.
ING – MECATRÓNICA
diagrama esquemático:
SISTEMAS DIGITALES PROGRAMABLES
ING – MECATRÓNICA
SISTEMAS DIGITALES PROGRAMABLES
PRACTICA 7: ACTIVACIÓN DE MOTOR CON SENSOR DE LUZ En la siguiente practica se realizar la activación de un motor por medio de la tarjeta basys2, utilizando como interruptor (entrada) un sensor de luz (ldr) que será acoplado a través de las terminales de la tarjeta. Se utilizará el código VHDL presentado en la practica 4; con la diferencia de que ahora el interruptor de activación del motor será el sensor de luz. Material: 1 LM555 4 resistencias 10KΩ 2 resistencias 1KΩ 1 4N25 1 capacitor electrolítico 10µF 1 LDR (foto resistencia) 1 LED Diagrama esquemático del sensor de luz: El diseño del Sensor de presencia es mostrado a continuación. Nótese el uso de resistores y capacitores extras. El potenciómetro utilizado en el sensor de presencia sirve para variar la sensibilidad. La señal proporcionada por el sensor debe ser acondicionada por lo que se agrega un optoacoplador para proteger a la Tarjeta Basys2 y unos resistores de 1KΩ para disminuir el voltaje a 3.3V.