Você está na página 1de 14

Experimento 4

Mquina de estados em VHDL com uso de clock.


Disciplina: EN3723 Lgica Programvel.

Discentes:
Fernando Henrique Gomes Zucatelli
Fernando Soler
Turma: A/Diurno
Prof Dr. Rodrigo Reina Muoz.

Santo Andr, 18 de Novembro 2014

Sumrio
1.
2.
3.
4.
5.

OBJETIVOS ....................................................................................................................... 2
PARTE EXPERIMENTAL ................................................................................................ 2
RESULTADOS E DISCUSSO ....................................................................................... 3
CONCLUSO .................................................................................................................... 6
REFERNCIAS BIBLIOGRFICAS ............................................................................... 6

1. OBJETIVOS
O objetivo deste experimento programar duas mquinas de estados em
VHDL atravs do comando PROCESS e simul-las utilizando o clock interno de 50
MHz da placa DE2-115 da Altera.

2. PARTE EXPERIMENTAL
2.1.

Programa da mquina de estados 1

A Figura 1 mostra a primeira mquina de estados, composta por 5 estados, o


estado idle um estado de espera no qual aguarde-se a ocorrncia do evento start
para que a mquina inicie o seu ciclo de operao entre os estados one e four
realizados as transies em um determinado intervalo de tempo t baseado no clock
interno da mquina de 50 MHz. Para permitir boa visualizao e no ser demorado
optou-se por um intervalo t = 1s. Quando o ciclo atinge o ltimo valor decidiu-se
somar um na varivel sada cujo valor foi sendo exibido nos LEDs vermelhos da
placa experimental.

Figura 1 Mquina de estados 1.

2.2.

Programa da mquina de estados 2

A Figura 2 apresenta uma mquina de estado com um estado inicial


denominado start cujo evento de disparo para os demais estado denominado trig
(trigger, disparo em ingls). Porm a seleo do estado imediatamente aps do start
ainda dependendo do valor da varivel delay, definindo quantos ciclos de tempo t
o sistema deve aguardar antes de iniciar o envio de pulsos, que foram configurados
para serem vistos nos LEDs verdes da placa experimental.
Dessa forma a seleo do primeiro estado contm uma segunda estrutura
CASE cuja deciso baseada no valor de delay. Uma vez selecionado o estado de
espera (wait de 1 a 3) os prximos eventos de contagem baseados em t realizaro

apenas a navegao pelos estados de espera subsequentes antes de iniciar o envio


dos pulsos.

Figura 2 Mquina de estados 2.

3. RESULTADOS E DISCUSSO
A Figura 3 apresenta o teste realizado previamente para verificar o
funcionamento da lgica de contagem baseada no clock da mquina, sendo cada
clkout_i foi configurado para contar a cada 2 eventos do anterior clkout_(i-1), sendo o
primeiro mltiplo do clock_maquina. No caso real cada um divide a frequncia por
mil, deixando o ajuste final para o ltimo contador.

Figura 3 Simulao para teste da lgica de contagem baseada no clock.

3.1.

Programa da mquina de estados 1

A Figura 4 exibe a simulao do sistema, cujos valores base de clock so


alterados para permitir a visualizao do funcionamento da mquina de estados sem
a necessidade de grandes tempos de simulao.

Figura 4 Simulao da mquina de estados 1.

No programa adaptado para os parmetros reais configurou-se os valores de


cada contador para gerarem um onda de frequncia 1Hz a partir da frequncia do
clock de mquina de 50 MHz obtida com a seleo do pino PIN_Y2.

A Figura 5 exibe um trecho do funcionamento do software na placa


experimental, na qual os LEDs verdes representam a posio em binrio dos
estados da Figura 1, e os LEDS vermelhos a sada contadora do nmero de ciclos
realizados passando de (11)b = (3)d para (100)b = (4) d.

Figura 5 Operao da mquina de estados 1.

3.2.

Programa da mquina de estados 2

Entre a Figura 6 e a Figura 9 so exibidos os resultados da simulao para


cada caso da opo da varivel delay. Para a Figura 6 (Delay 00) observa-se que a
sada vai para 001, na transio seguinte do clock, fato evidenciado por apenas uma
variao de q antes de sada sair de 000. Para a Figura 7 (Delay 01) a sada demora
duas alteraes de q, na Figura 8 (Delay 10) so trs transies de q e por fim na
Figura 9 (Delay 11) h quatro variaes de q.

Figura 6 Simulao da mquina de estados 2. Delay 00.

Figura 7 Simulao da mquina de estados 2. Delay 01.

Figura 8 Simulao da mquina de estados 2. Delay 10.

Figura 9 Simulao da mquina de estados 2. Delay 11.

A Figura 10 exibe um pedao do vdeo do resultado do programa aplicado na


placa real, nas imagens os LEDs vermelhos representam a varivel q e os verdes a
varivel sada, salientamos apenas que a ordem dos bits nos LEDs a oposta da
vista nas imagens da simulao.

Figura 10 Operao nos trs momentos da sada ligada.

4. CONCLUSO
Contadores utilizam o comando PROCESS permite aplicar operaes
temporizadas baseadas no clock interno da placa experimental da ALTERA.

No interessante simular grandes contadores no simulador, mas a base de


funcionamento perfeitamente simulvel.

5. REFERNCIAS BIBLIOGRFICAS

DE2 115 Altera, Manual do Usurio. Disponvel em:


<ftp://ftp.altera.com/up/pub/Altera_Material/13.0/Boards/DE2115/DE2_115_User_Manual.pdf>. Acesso em 04 de Nov. 2014

6. ANEXOS

Links para vdeos


Mquina de estados 1.
https://dl.dropboxusercontent.com/u/82233214/L%C3%B3gica%20Program%C3%A1
vel%20-%20LAB%204%20%20M%C3%A1quina%20de%20estado%20e%20clock%20autom%C3%A1tico/2014
-11-18%2019.47.36.mp4

Mquina de estados 2.
https://dl.dropboxusercontent.com/u/82233214/L%C3%B3gica%20Program%C3%A1
vel%20-%20LAB%204%20%20M%C3%A1quina%20de%20estado%20e%20clock%20autom%C3%A1tico/2014
-11-18%2016.08.08.mp4

6.1.

Programa da mquina de estados 1

LIBRARY IEEE;
USE IEEE.STD_logic_1164.all;

ENTITY LAB_4_ex2_real_v1 IS
PORT ( start, clock_maquina, rst

: IN BIT;

q
BIT_VECTOR (2 DOWNTO 0);

: BUFFER

saida
clkout_1, clkout_2, clkout_3

: OUT INTEGER;
: BUFFER BIT

);
END LAB_4_ex2_real_v1;

ARCHITECTURE teste OF LAB_4_ex2_real_v1 IS


TYPE st IS (e_4, e_3, e_2, e_1, e_0); -- novo tipo definido
SIGNAL estado : st;

BEGIN
abc: PROCESS (clkout_3, rst)
VARIABLE count

: INTEGER;

BEGIN
IF rst = '1' THEN -- estado inicial
estado <= e_0;
count := 0;
saida <= 0;
ELSIF (clkout_3'EVENT and clkout_3 = '1') THEN -- ciclo de estados iniciados pelo
start
CASE estado IS
WHEN e_0 =>
IF (start = '1') THEN
estado <= e_1;
END IF;
WHEN e_1 =>
estado <= e_2;
WHEN e_2 =>
estado <= e_3;
WHEN e_3 =>
estado <= e_4;
WHEN e_4 =>
count := count + 1;
saida <= count;
estado <= e_0;
END CASE;
END IF;
END PROCESS abc;

WITH estado SELECT -- decodifica estado


q <= "000" WHEN e_0,
"001" WHEN e_1,
"010" WHEN e_2,
"011" WHEN e_3,
"100" WHEN e_4;

-- Divisores de frequncia

-- 1 : 1000 , 50MHz -> 50KHz


contador_1: PROCESS (clock_maquina)
VARIABLE counter_1

: INTEGER RANGE 1 TO 1000;

BEGIN
IF (clock_maquina'EVENT and clock_maquina = '1') THEN
IF (counter_1 = 1000) THEN
counter_1 := 1;
clkout_1 <= '1';
ELSE
counter_1:= counter_1 + 1;
clkout_1 <= '0';
END IF;
END IF;
END PROCESS contador_1;

-- 1 : 1000 , 50KHz -> 50Hz


contador_2: PROCESS (clkout_1)
VARIABLE counter_2

: INTEGER RANGE 1 TO 1000;

BEGIN
IF (clkout_1'EVENT and clkout_1 = '1') THEN
IF (counter_2 = 1000) THEN
counter_2 := 1;
clkout_2 <= '1';
ELSE
counter_2:= counter_2 + 1;
clkout_2 <= '0';
END IF;
END IF;
END PROCESS contador_2;

-- 50Hz -> 2Hz = 0,5s


contador_3: PROCESS (clkout_2)
VARIABLE counter_3
BEGIN

: INTEGER RANGE 1 TO 50;

10

IF (clkout_2'EVENT and clkout_2 = '1') THEN


IF (counter_3 = 25) THEN
counter_3 := 1;
clkout_3 <= '1';
ELSE
counter_3:= counter_3 + 1;
clkout_3 <= '0';
END IF;
END IF;
END PROCESS contador_3;
END teste;

6.2.

Programa da mquina de estados 2

LIBRARY IEEE;
USE IEEE.STD_logic_1164.all;

ENTITY MaqEstados IS
PORT ( clock_maquina, ck, trig : IN BIT;
-- relogio borda subida
delay
BIT_VECTOR (1 DOWNTO 0);

: IN

q, q_delay
BIT_VECTOR (2 DOWNTO 0);

: BUFFER

saida
BIT_VECTOR (2 DOWNTO 0);

: OUT

clkout_1, clkout_2, clkout_3


);

: BUFFER BIT

-- saida

END MaqEstados;

ARCHITECTURE teste OF MaqEstados IS


TYPE st IS (pulso_3, pulso_2, pulso_1, wait_3, wait_2, wait_1, start); -- novo tipo definido
SIGNAL estado : st;
BEGIN
abc: PROCESS (clkout_3)
BEGIN

11

IF (clkout_3'EVENT and clkout_3 = '1') THEN -- ciclo de estados iniciados pelo trig
CASE estado IS
WHEN start =>
IF (trig = '1') THEN -- ciclo de estados iniciados pelo trig
CASE delay IS
WHEN "00" =>
saida <= "000";
estado <= pulso_1;
WHEN "01" =>
saida <= "000";
estado <= wait_1;
WHEN "10" =>
saida <= "000";
estado <= wait_2;
WHEN "11" =>
saida <= "000";
estado <= wait_3;
END CASE;
ELSE
saida <= "000";
END IF;

WHEN wait_3 =>


saida <= "000";
estado <= wait_2;
WHEN wait_2 =>
saida <= "000";
estado <= wait_1;
WHEN wait_1 =>
saida <= "000";
estado <= pulso_1;

WHEN pulso_1 =>


saida <= "001";
estado <= pulso_2;
WHEN pulso_2 =>

12

saida <= "010";


estado <= pulso_3;
WHEN pulso_3 =>
saida <= "100";
estado <= start;
END CASE;
END IF;
END PROCESS abc;

-- 1 : 1000 , 50MHz -> 50KHz


contador_1: PROCESS (clock_maquina)
VARIABLE counter_1

: INTEGER RANGE 1 TO 1000;

BEGIN
IF (clock_maquina'EVENT and clock_maquina = '1') THEN
IF (counter_1 = 1000) THEN
counter_1 := 1;
clkout_1 <= '1';
ELSE
counter_1:= counter_1 + 1;
clkout_1 <= '0';
END IF;
END IF;
END PROCESS contador_1;

-- 1 : 1000 , 50KHz -> 50Hz


contador_2: PROCESS (clkout_1)
VARIABLE counter_2

: INTEGER RANGE 1 TO 1000;

BEGIN
IF (clkout_1'EVENT and clkout_1 = '1') THEN
IF (counter_2 = 1000) THEN
counter_2 := 1;
clkout_2 <= '1';
ELSE
counter_2:= counter_2 + 1;
clkout_2 <= '0';
END IF;

13

END IF;
END PROCESS contador_2;

-- 50Hz -> 1Hz = 1s


contador_3: PROCESS (clkout_2)
VARIABLE counter_3

: INTEGER RANGE 1 TO 50;

BEGIN
IF (clkout_2'EVENT and clkout_2 = '1') THEN
IF (counter_3 = 50) THEN
counter_3 := 1;
clkout_3 <= '1';
ELSE
counter_3:= counter_3 + 1;
clkout_3 <= '0';
END IF;
END IF;
END PROCESS contador_3;

WITH estado SELECT -- decodifica estado


q <= "000" WHEN start,
"001" WHEN wait_1,
"010" WHEN wait_2,
"011" WHEN wait_3,

"100" WHEN pulso_1,


"101" WHEN pulso_2,
"110" WHEN pulso_3;

END teste;