Sie sind auf Seite 1von 10

DISEÑO DIGITAL UNMSM

UNIVERSIDAD NACIONAL MAYOR DE SAN


MARCOS
(Universidad del Perú, DECANA DE AMÉRICA)
FACULTAD DE INGENIERIA ELECTRÓNICA Y ELÉCTRICA
E.A.P DE INGENIERÍA ELECTRÓNICA

Tema: Diseño de un Semáforo


Inteligente en FPGA

Alumno: Jhonatan Alexander Juño Garcia

Código: 12190016

Profesor: Ing. Alfredo Granados Ly


DISEÑO DIGITAL 17-5-2016

UNIVERSIDAD NACIONAL MAYOR DE SAN MARCOS


(Universidad del Perú, DECANA DE AMÉRICA)
FACULTAD DE INGENIERIA ELECTRÓNICA Y ELÉCTRICA
E.A.P DE INGENIERÍA ELECTRÓNICA

INFORME FINA # 3
SEMÁFORO INTELIGENTE

I. OBJETIVO
 Utilizar el estilo algorítmico y máquinas de estados para describir el
comportamiento de un circuito.
II. MATERIALES Y EQUIPOS
 Placa modulo con FPGA Altera Cyclone I
 PC con la herramienta de síntesis MAX Plus II y el entorno de desarrollo
Quartus II de Altera

III. PROCEDIMIENTO DE DISEÑO


1. Análisis del problema

El problema planteado es diseñar un circuito que simule la funcoonn de un


semáforo con su respectivo indicador de tiempos, el mismo que deberá ser
implementado en la placa del FPGA. Para este diseño se va a considerar una
máquina de estados como se detalla:

Contador≠1

Contador=1

Contador=20 𝑆1
0 𝑅𝐴̅𝑉̅
𝑆0 Contador=25
𝑅𝐴̅𝑉̅ Contador=contador-1
𝑆2
𝑅̅ 𝐴̅𝑉

Contador≠3
0
Contador=contador-1

𝑆4
𝑅̅ 𝐴𝑉̅ 𝑆3
𝑅 𝐴̅𝑉
̅

Contador=3 Contador=contador-1

Contador≠1
0

1
DISEÑO DIGITAL 17-5-2016

Tenemos 5 estados en total a los que denominaremos estado S0, S1, S2 S3 y S4.
En el primer estado el led rojo esta encendido y el display esta en el número 20,
luego de un flanco de subida se pasa al segundo estado, donde el led sigue
encendido, pero ha empezado una cuenta descendente hasta el cero. Después de
llegar a cero se pasa al siguiente estado, donde se enciende la luz verde,
posteriormente el contador decreciente se muestra en el display, flotando unos
segundos para llegar a cero se a pasa el siguiente estado donde la luz ámbar se
enciende por unos instante para luego pasar al rojo y volver a repetir todo.

Viendo el diagrama de bloques, podemos destacar las siguientes partes del


circuito:

El divisor de frecuencias, componente que reducirá la frecuencia del oscilador del


fpga a 1hz, adecuando para la máquina de estados. El circuito de control, recibe el
clock de 1hz y en base a este se genera la cuenta y el tiempo de encendido de los
leds, este entrega una señal de tipo entera, con el valor de la cuenta en cada
instante. El decodificador de entero a binario, recibe el dato entero y mediante
una sentencia “Case” asigna los valores correspondientes en binario para poder
llevar al circuito visor. Visor, recibe las entradas de la cuenta en binario, y se
encarga de multiplexar los display de 7 segmentos a fin de que se pueda apreciar
el valor de la cuenta.

2. Diagrama de bloques del circuito

Una vez hecho el análisis se propone el siguiente diagrama de bloques del circuito
a implementar:

2
DISEÑO DIGITAL 17-5-2016

3
DISEÑO DIGITAL 17-5-2016

3. Implementación del Circuito en VHDL

library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_arith.all;
use ieee.std_logic_unsigned.all;
entity semaforo_inteligente is
port( clk: in std_logic;
R,V,A: out std_logic;
enable: out std_logic_vector(3 downto 0);
display: out std_logic_vector(7 downto 0));
end semaforo_inteligente;
architecture solucion of semaforo_inteligente is
type estados is (S0,S1,S2,S3,S4);
signal ea: estados;
signal cuenta: integer range 0 to 25;
signal x: std_logic;
signal AA: std_logic;
signal U,D: std_logic_vector(3 downto 0);
component divisor
port(clk:in std_logic;
z:out std_logic);
end component;
component visor
port(clk_v: in std_logic;
B,A: in std_logic_vector(3 downto 0);
enable: out std_logic_vector(3 downto 0);
display: out std_logic_vector(7 downto 0));
end component;

component decodificador
port(cuenta: in integer;
D,U: out std_logic_vector(3 downto 0));
end component;
begin
u0: divisor port map(clk,x);
u1: visor port map(clk,D,U,enable,display);
u2: decodificador port map (cuenta,D,U);

process(x)
begin
if x='1' and x'event then
case ea is
when S0=> R<='1'; V<='0'; AA<='0'; ea<=S1; cuenta<=20;

4
DISEÑO DIGITAL 17-5-2016

when S1=> R<='1'; V<='0'; AA<='0';


if cuenta=1 then ea<= S2; cuenta<=cuenta-1;
else cuenta<=cuenta-1; end if;
when S2=> V<='1'; R<='0';AA<='0'; cuenta<=25; ea<=S3;
when S3=> V<='1' ; R<='0';AA<='0';
if cuenta=4 then ea <= S4; cuenta<=cuenta-1;
else cuenta<=cuenta-1; end if;
when S4=> V<='0' ; R<='0';AA<='1';
if cuenta=1 then ea <= S0; cuenta<=cuenta-1;
else cuenta<=cuenta-1; end if;
end case;
end if;
end process;
A<=AA and x;
end solucion;

Componente divisor::::::
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_arith.all;
use ieee.std_logic_unsigned.all;

entity divisor is
port(clk: in std_logic;
z:out std_logic);
end divisor;

architecture solucion of divisor is


signal i: integer range 0 to 24000000;
signal clk_z:std_logic;
begin
process(clk)
begin
if clk='1' and clk'event then
i<=i+1;
if i=23999999 then
clk_z<=not clk_z;
i<=0;
end if;
end if;
end process;
z<=clk_z;
end solucion;

Componente visor::::::

5
DISEÑO DIGITAL 17-5-2016

library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_arith.all;
use ieee.std_logic_unsigned.all;

entity visor is
port(clk_v: in std_logic;
B,A: in std_logic_vector(3 downto 0);
enable: out std_logic_vector(3 downto 0);
display: out std_logic_vector(7 downto 0));
end visor;

architecture solucion of visor is


signal Q:std_logic_vector(3 downto 0);
signal sel:std_logic_vector(1 downto 0);
signal clk_mux: std_logic;
signal cuenta2: std_logic_vector(16 downto 0);
begin
process(clk_v)
begin
if clk_v='1' and clk_v'event then
cuenta2<=cuenta2+1;
if cuenta2=23999 then
cuenta2<=(others=>'0');
clk_mux<= not clk_mux;
end if;
end if;
end process;

process(clk_mux)
begin
if clk_mux='1' and clk_mux'event then
sel<=sel+1;
if sel=3 then
sel<="00";
end if;
end if;
end process;

with sel select Q<= A when "00",


B when "01",
"1111" when "10",
"1111" when others;

-- Decodificador de enable

6
DISEÑO DIGITAL 17-5-2016

with sel select enable<="1110" when "00",


"1101" when "01",
"1111" when "10",
"1111" when others;

--Decodificador a 7 segmentos

with Q select display <= "00000011" when "0000",


"10011111" when "0001",
"00100101" when "0010",
"00001101" when "0011",
"10011001" when "0100",
"01001001" when "0101",
"01000001" when "0110",
"00011111" when "0111",
"00000001" when "1000",
"00001001" when "1001",
"11111111" when others;
end solucion;

Componente decodificador::::::

library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_arith.all;
use ieee.std_logic_unsigned.all;

entity decodificador is
port(cuenta: in integer;
D,U: out std_logic_vector(3 downto 0));
end decodificador;

architecture solucion of decodificador is


begin
process(cuenta)
begin
case cuenta is
when 0 => D<="0000";U<="0000";
when 1 => D<="0000";U<="0001";
when 2 => D<="0000";U<="0010";
when 3 => D<="0000";U<="0011";
when 4 => D<="0000";U<="0100";
when 5 => D<="0000";U<="0101";
when 6 => D<="0000";U<="0110";
when 7 => D<="0000";U<="0111";

7
DISEÑO DIGITAL 17-5-2016

when 8 => D<="0000";U<="1000";


when 9 => D<="0000";U<="1001";
when 10=> D<="0001";U<="0000";
when 11=> D<="0001";U<="0001";
when 12=> D<="0001";U<="0010";
when 13=> D<="0001";U<="0011";
when 14=> D<="0001";U<="0100";
when 15=> D<="0001";U<="0101";
when 16=> D<="0001";U<="0110";
when 17=> D<="0001";U<="0111";
when 18=> D<="0001";U<="1000";
when 19=> D<="0001";U<="1001";
when 20=> D<="0010";U<="0000";
when 21=> D<="0010";U<="0001";
when 22=> D<="0010";U<="0010";
when 23=> D<="0010";U<="0011";
when 24=> D<="0010";U<="0100";
when others=> D<="0010";U<="0101";

end case;
end process;
end solucion;

4. Prueba del circuito en módulo FPGA Altera Cyclone I


.

8
DISEÑO DIGITAL 17-5-2016

Das könnte Ihnen auch gefallen