Академический Документы
Профессиональный Документы
Культура Документы
Cronmetro e Temporizador
Disciplina: EN3723 Lgica Programvel.
Discentes:
Fernando Henrique Gomes Zucatelli
Fernando Soler
Turma: A/Diurno
Prof Dr. Rodrigo Reina Muoz.
Sumrio
1.
2.
3.
4.
5.
6.
7.
8.
INTRODUO .................................................................................................................. 2
OBJETIVOS ....................................................................................................................... 2
METODOLOGIA............................................................................................................... 2
PARTE EXPERIMENTAL ................................................................................................ 3
RESULTADOS E DISCUSSO ....................................................................................... 5
CONCLUSO .................................................................................................................. 12
REFERNCIAS BIBLIOGRFICAS ............................................................................. 12
ANEXOS .......................................................................................................................... 12
8.1. Programa principal ..................................................................................................... 12
1. INTRODUO
O projeto consiste na implementao de dois dispositivos, um cronmetro
simples e um temporizador, que conta o tempo de um valor pr-programado at
zero. Inicialmente ser apresentado por meio do visor de cristal lquido duas opes
ao usurio, uma para cada dispositivo. Caso o cronmetro seja selecionado, os
displays de sete segmentos passaro a contar, a partir de zero, at que um dos
seguintes comandos seja dado: pause, start ou reset. Caso o temporizador seja
escolhido, o usurio ter de inserir um tempo, a partir do qual os displays marcaro
o tempo at zero, com a possibilidade de reiniciar a contagem do valor previamente
definido durante o processo de temporizao ou mesmo aps o seu trmino.
2. OBJETIVOS
Descrever e implementar um cronmetro digital e um temporizador utilizando
os displays de 7 segmentos do kit FPGA da Altera DE2-115, dando ao usurio a
opo de escolher um dos dois e exibindo as informaes principais no visor de
cristal lquido.
3. METODOLOGIA
O clock de 50 MHz da mquina ser usado como base de tempo para o
contador de centsimos de segundos no cronmetro, o programa deve permitir ao
usurio parar a contagem sem zerar, permitindo reinici-la daquele mesmo ponto,
parar a exibio do tempo atual sem parar de contar como forma de verificar um
tempo parcial como tempo de uma volta e tambm zerar a contagem reiniciando
todo o processo.
Para o temporizador, o clock ser utilizado para decrementar o valor prprogramado pelo usurio em horas, minutos e segundos, at que se atinja o valor
zero, ou a contagem seja interrompida, ou reiniciada ao valor inicial ou caso seja
zerado.
Algumas mensagens do momento de funcionamento so exibidas no visor de
cristal lquido (LCD) como meio de informar ao usurio a funo que est sendo
executado
pelo
programa,
como
informe
dos
modos
de
operao
4. PARTE EXPERIMENTAL
Para a navegao entre todas as funes, apresentamos a mquina de
estados dividida em 3 figuras. Na Figura 1 apresenta-se a principal diviso do
programa, entre a metade relativa ao cronmetro e ao temporizador quando a
mquina est ligado, enquanto ela est no estado desligado aparece no visor a
mensagem CRONOMETRO E TEMPORIZADOR (dividida em 2 linhas).
A Figura 2 exibe a mquina de estados relativa ao cronmetro, na qual a
varivel B (vetor de dados de entrada) formada pela combinao das posies de
todas as 5 chaves de comando com exceo da liga/desliga (on_off no programa) e
da de seleo de modo (cron_1:temp_0 no programa), sendo que a regio de cdigo
concorrente com o comando CASE permite realizar a troca de funes com
agilidade e tambm expandir o tamanho da mquina em uma atualizao futura.
A Figura 3 apresenta a parte da mquina de estados respectiva do
temporizador. O estado de contagem possui uma condio na entrada para
determinar se alguma contagem anterior j foi iniciada, se nenhuma contagem
anterior foi registrada ento o valor inicial da contagem salvo, este valor poder ser
recuperado caso o usurio deseje entrando no estado de reiniciar contagem, neste
estado a condio na entrada da contagem feita de forma dual, i.e., os valores
iniciais salvos no inicio do processo de contagem sero copiados nos valores atuais
de contagem, permitindo o rpido reinicio de uma nova temporizao. A varivel que
controla este procedimento tambm atualizada sempre que for realizado algum
ajuste de tempo. Durante os estados de ajuste dos tempos, os respectivos visores
piscaro para indicar que este o valor a ser ajustado e tambm facilitar o comando
de incrementar ou decrementar as unidades e dezenas com uso dos 4 botes do kit
definidos no vetor de dados de entrada A.
Figura 1 Trecho inicial da mquina de estados iniciando a operao quando ligada e selecionando
entre cronmetro (Cron) e temporizador (Temp).
5. RESULTADOS E DISCUSSO
Entre a Figura 4 e a Figura 9 apresentam-se as informaes vistas no visor
LCD para os principais estados da mquina de estado
A Figura 4 mostra estado inicial desligado da mquina, aps ela ser ligada, a
opo selecionada ser mostrada no LCD.
Figura 4 Visor LCD com nome do projeto indicando que a mquina est no estado desligada.
Sendo:
A On_off.
B Reinicio de contagem.
C Ajuste das horas do temporizador.
D Zera a contagem do cronmetro / Ajuste dos minutos do temporizador.
E Ajuste dos segundos do temporizador.
10
11
12
6. CONCLUSO
O projeto permitiu englobar diversos aspectos da programao em VHDL como
mquinas de estados, sub-rotinas atravs do comando PROCEDURE para
simplificar a execuo de aes comuns a diversos trechos dos cdigos e estruturas
de seleo. Assim, ficou evidente a facilidade que a linguagem de alto nvel oferece
ao se projetar e implementar circuitos com funes variadas. Alm de que com o uso
do software Quartus a implementao fsica tambm muito simples, bastando
apenas associar as entradas e sadas do sistema com pinos fsicos do chip.
7. 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.
8. ANEXOS
8.1.
Programa principal
========================================
LIBRARY IEEE;
USE IEEE.STD_logic_1164.all;
USE IEEE.STD_LOGIC_ARITH.all;
USE IEEE.STD_LOGIC_UNSIGNED.all;
ENTITY Projeto_1_real_11_2 IS
PORT (clock_maquina
cron_1_temp_0, on_off
A
: IN BIT_VECTOR (3 DOWNTO 0);
B
: IN BIT_VECTOR (4 DOWNTO 0);
q
: BUFFER BIT_VECTOR (5 DOWNTO 0); --indicador do estado nos LEDs verdes
clkout_1, clkout_2, clkout_3 : BUFFER BIT;
HEX_0, HEX_1, HEX_2, HEX_3
--);
--PORT( -- LCD
LCD_RS, LCD_E
LCD_RW
LCD_ON
: OUT STD_LOGIC;
: OUT STD_LOGIC;
: OUT STD_LOGIC;
13
-- LCD_BLON
-- Com, CLK
-- exec_lcd
: BUFFER STD_LOGIC;
BUS_DADOS
);
END Projeto_1_real_11_2;
-- Cron e Temp
TYPE
st
IS
(decresce,
temp,
cron_parado_exibe_Tc,
cron_parado_exibe_Tc_e,
cron_cont_exibe_Tc_e,
: TIPOS_DE_ESTADO;
SIGNAL Texto_LCD
: letras_string;
SIGNAL CLK2
: STD_LOGIC_VECTOR(4 DOWNTO
0);
SIGNAL CLK2_HABILITAR,LCD_RW_INT
: STD_LOGIC;
PROCEDURE soma_tempo(VARIABLE T_7, T_6, T_5, T_4, T_3, T_2, T_1, T_0: INOUT INTEGER RANGE 0 TO 9) IS
BEGIN
T_0 := T_0 + 1;
IF T_0 = 10 THEN
T_0
:= 0;
T_1
:= T_1 + 1;
IF T_1 = 10 THEN
T_1
:= 0;
T_2
:= T_2 + 1;
IF T_2 = 10 THEN
T_2
:= 0;
T_3 := T_3 + 1;
IF T_3 = 6 THEN
T_3
:= 0;
T_4 := T_4 + 1;
IF T_4 = 10 THEN
T_4
:= 0;
T_5 := T_5 + 1;
IF T_5 = 6 THEN
T_5
:= 0;
14
T_6 := T_6 + 1;
IF T_6 = 10 THEN
T_6
:= 0;
T_7 := T_7 + 1;
END IF;
END IF;
END IF;
END IF;
END IF;
END IF;
END IF;
END soma_tempo;
-PROCEDURE sub_tempo(VARIABLE T_7, T_6, T_5, T_4, T_3, T_2, T_1, T_0: INOUT INTEGER RANGE -1 TO 9) IS
-- Apenas copiada a rotina soma_tempo
BEGIN
IF T_7 = 0 AND T_6 = 0 AND T_5 = 0 AND T_4 = 0 AND T_3 = 0 AND T_2 = 0 AND T_1 = 0 AND T_0 = 0 THEN
--CONTADOR ZERADO
ELSE
T_0 := T_0 - 1;
IF T_0 = -1 AND (T_7 /= 0 OR T_6 /= 0 OR T_5 /= 0 OR T_4 /= 0 OR T_3 /= 0 OR T_2 /= 0 OR T_1 /=
0)THEN --testar com zero e depois mudar para -1
T_0
:= 9;
T_1
:= T_1 - 1;
IF T_1 = -1 THEN
T_1
:= 9;
T_2
:= T_2 - 1;
IF T_2 = -1 THEN
T_2
:= 9;
T_3 := T_3 - 1;
IF T_3 = -1 THEN
T_3
:= 5;
T_4 := T_4 - 1;
IF T_4 = -1 THEN
T_4
:= 9;
T_5 := T_5 - 1;
IF T_5 = -1 THEN
T_5
:= 5;
T_6 := T_6 - 1;
IF T_6 = -1 THEN
T_6
:= 9;
T_7 := T_7 - 1;
END IF;
END IF;
END IF;
END IF;
END IF;
END IF;
END IF;
END IF;
15
END sub_tempo;
-PROCEDURE zera_tempo(VARIABLE T_7, T_6, T_5, T_4, T_3, T_2, T_1, T_0: INOUT INTEGER RANGE 0 TO 9) IS
BEGIN
T_7 := 0; T_6:= 0; T_5:= 0; T_4:= 0; T_3:= 0; T_2:= 0; T_1 := 0; T_0 := 0;
END zera_tempo;
-PROCEDURE grava_tempo_inicial(
CONSTANT T_7, T_6, T_5, T_4, T_3, T_2, T_1, T_0: IN INTEGER RANGE 0 TO 9;
VARIABLE T_i_7, T_i_6, T_i_5, T_i_4, T_i_3, T_i_2, T_i_1, T_i_0 : OUT INTEGER RANGE 0 TO 9) IS
BEGIN
T_i_7 := T_7; T_i_6 := T_6;
T_i_5 := T_5; T_i_4 := T_4;
T_i_3 := T_3; T_i_2 := T_2;
T_i_1 := T_1; T_i_0 := T_0;
END grava_tempo_inicial;
-PROCEDURE verifica_9_soma(VARIABLE T_0: INOUT INTEGER RANGE 0 TO 9) IS
BEGIN
IF T_0 >= 9 THEN
T_0 := 0;
ELSE
T_0 := T_0 + 1;
END IF;
END verifica_9_soma;
-PROCEDURE verifica_5_soma(VARIABLE T_0: INOUT INTEGER RANGE 0 TO 9) IS
BEGIN
IF T_0 >= 5 THEN
T_0 := 0;
ELSE
T_0 := T_0 + 1;
END IF;
END verifica_5_soma;
-PROCEDURE verifica_9_sub(VARIABLE T_0: INOUT INTEGER RANGE 0 TO 9) IS
BEGIN
IF T_0 <= 0 THEN
T_0 := 9;
ELSE
T_0 := T_0 - 1;
END IF;
END verifica_9_sub;
-PROCEDURE verifica_5_sub(VARIABLE T_0: INOUT INTEGER RANGE 0 TO 9) IS
BEGIN
IF T_0 <= 0 THEN
T_0 := 5;
ELSE
T_0 := T_0 - 1;
16
END IF;
END verifica_5_sub;
--
PROCEDURE Exibe_HEX_all(
CONSTANT T_7, T_6, T_5, T_4, T_3, T_2, T_1, T_0: IN INTEGER RANGE 0 TO 10;
SIGNAL HEX_7, HEX_6, HEX_5, HEX_4, HEX_3, HEX_2, HEX_1, HEX_0 : INOUT BIT_VECTOR (6 DOWNTO 0))
IS
BEGIN
CASE T_0 IS
WHEN 0 => HEX_0 <= NOT("0111111");
WHEN 1 => HEX_0 <= NOT("0000110");
WHEN 2 => HEX_0 <= NOT("1011011");
WHEN 3 => HEX_0 <= NOT("1001111");
WHEN 4 => HEX_0 <= NOT("1100110");
WHEN 5 => HEX_0 <= NOT("1101101");
WHEN 6 => HEX_0 <= NOT("1111101");
WHEN 7 => HEX_0 <= NOT("0000111");
WHEN 8 => HEX_0 <= NOT("1111111");
WHEN 9 => HEX_0 <= NOT("1100111");
WHEN OTHERS => HEX_0 <= NOT("0000000");
END CASE;
CASE T_1 IS
WHEN 0 => HEX_1 <= NOT("0111111");
WHEN 1 => HEX_1 <= NOT("0000110");
WHEN 2 => HEX_1 <= NOT("1011011");
WHEN 3 => HEX_1 <= NOT("1001111");
WHEN 4 => HEX_1 <= NOT("1100110");
WHEN 5 => HEX_1 <= NOT("1101101");
WHEN 6 => HEX_1 <= NOT("1111101");
WHEN 7 => HEX_1 <= NOT("0000111");
WHEN 8 => HEX_1 <= NOT("1111111");
WHEN 9 => HEX_1 <= NOT("1100111");
WHEN OTHERS => HEX_1 <= NOT("0000000");
END CASE;
CASE T_2 IS
WHEN 0 => HEX_2 <= NOT("0111111");
WHEN 1 => HEX_2 <= NOT("0000110");
WHEN 2 => HEX_2 <= NOT("1011011");
WHEN 3 => HEX_2 <= NOT("1001111");
WHEN 4 => HEX_2 <= NOT("1100110");
WHEN 5 => HEX_2 <= NOT("1101101");
WHEN 6 => HEX_2 <= NOT("1111101");
WHEN 7 => HEX_2 <= NOT("0000111");
WHEN 8 => HEX_2 <= NOT("1111111");
WHEN 9 => HEX_2 <= NOT("1100111");
WHEN OTHERS => HEX_2 <= NOT("0000000");
END CASE;
CASE T_3 IS
WHEN 0 => HEX_3 <= NOT("0111111");
17
18
--BEGIN
-LCD_ON <= '1';
-- Dados do LCD bidirecional
BUS_DADOS <= VALOR_BUS_DADOS WHEN LCD_RW_INT = '0' ELSE "ZZZZZZZZ";
: INTEGER RANGE 0 TO 9;
: INTEGER RANGE 0 TO 9;
VARIABLE Disparo_Temporizador
: BIT;
VARIABLE Pisca_Contador
: INTEGER RANGE 0 TO 20;
VARIABLE A_Aux_Contador
: INTEGER RANGE 0 TO 30;
BEGIN
IF on_off = '0' THEN
estado_cron_temp <= selecao;
Exibe_HEX_all( 0, 0, 0, 0, 0, 0, 0, 0,
19
HEX_7,
HEX_6,
HEX_5,
HEX_4,
HEX_3,
:= 0;
Disparo_Temporizador := '0';
Texto_LCD <= (
-- Escrita na primeira linha do display de LCD
-- "
"
X"20",X"20",X"43",X"52",X"4F",X"4E",X"4F",X"4D",X"45",X"54",X"52",X"4F",X"20",X"45",X"20",X"20",
-- Escrita na segunda linha do display de LCD - FRASE: "PASSO"
-- "
R
T
R
"
X"20",X"20",X"54",X"45",X"4D",X"50",X"4F",X"52",X"49",X"5A",X"41",X"44",X"4F",X"52",X"20",X"20");
Texto_LCD <= (
-- "
O
"
X"20",X"20",X"20",X"43",X"52",X"4F",X"4E",X"4F",X"4D",X"45",X"54",X"52",X"4F",X"20",X"20",X"20",
X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20");
-- contagem
WHEN "00001" =>
soma_tempo(Tc_h1, Tc_h2, Tc_m1, Tc_m2,
Tc_s1, Tc_s2, Tc_cs1, Tc_cs2);
Exibe_HEX_all( Tc_h1, Tc_h2, Tc_m1, Tc_m2,
Tc_s1, Tc_s2, Tc_cs1, Tc_cs2,
20
-- zerando a contagem
WHEN "00100" =>
zera_tempo(Tc_h1, Tc_h2, Tc_m1, Tc_m2,
Tc_s1, Tc_s2, Tc_cs1, Tc_cs2);
Exibe_HEX_all( Tc_h1, Tc_h2, Tc_m1, Tc_m2,
Tc_s1, Tc_s2, Tc_cs1, Tc_cs2,
-- Tratamento de excecoes
WHEN OTHERS =>
Exibe_HEX_all( Tc_h1, Tc_h2, Tc_m1, Tc_m2,
Tc_s1, Tc_s2, Tc_cs1, Tc_cs2,
END CASE;
WHEN OTHERS =>
estado_cron_temp <= cron;
END CASE;
ELSE
CASE estado_cron_temp IS
-- maquinas do temporizador
-- seleciona na primeira passagem
WHEN temp =>
CASE B IS
-- contagem interrompida
WHEN "00000" =>
Exibe_HEX_all( Tt_h1, Tt_h2, Tt_m1, Tt_m2,
Tt_s1, Tt_s2, Tt_cs1, Tt_cs2,
Texto_LCD <= (
-- "
E
T
O
"
X"20",X"20",X"54",X"45",X"4D",X"50",X"4F",X"52",X"49",X"5A",X"41",X"44",X"4F",X"52",X"20",X"20",
X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20",X"20");
21
-- decrementar
WHEN "00001" =>
IF (Disparo_Temporizador = '0')THEN
Disparo_Temporizador := '1';
grava_tempo_inicial(Tt_h1,
Tt_h2,
-- incrementa segundos
WHEN "00010" =>
IF Pisca_Contador <= 10 THEN
Exibe_HEX_all( Tt_h1, Tt_h2, Tt_m1,
Tt_m2, 10, 10, Tt_cs1, Tt_cs2,
(A(0)
NOT('1'))
AND
(A(1)
NOT('1'))
AND
(A(2)
NOT('1'))
AND
(A(3)
NOT('1'))
AND
22
END IF;
Pisca_Contador := Pisca_Contador + 1;
A_Aux_Contador := A_Aux_Contador + 1;
Disparo_Temporizador := '0';
Texto_LCD <= (
-- "
E
T
O
"
X"20",X"20",X"54",X"45",X"4D",X"50",X"4F",X"52",X"49",X"5A",X"41",X"44",X"4F",X"52",X"20",X"20",
-U
E
S
S
G
T
U
"
E
N
S
D
"
X"20",X"41",X"4A",X"55",X"53",X"54",X"45",X"20",X"53",X"45",X"47",X"55",X"4e",X"44",X"4f",X"53");
-- incrementa minutos
WHEN "00100" =>
IF Pisca_Contador <= 10 THEN
Exibe_HEX_all( Tt_h1, Tt_h2, 10, 10,
Tt_s1, Tt_s2, Tt_cs1, Tt_cs2,
(A(0)
NOT('1'))
AND
(A(1)
NOT('1'))
AND
(A(2)
NOT('1'))
AND
(A(3)
NOT('1'))
AND
23
A_Aux_Contador := A_Aux_Contador + 1;
Disparo_Temporizador := '0';
Texto_LCD <= (
-- "
E
T
O
"
X"20",X"20",X"54",X"45",X"4D",X"50",X"4F",X"52",X"49",X"5A",X"41",X"44",X"4F",X"52",X"20",X"20",
-J
M
U
I
S
U
T
T
"
E
O
"
X"20",X"41",X"4A",X"55",X"53",X"54",X"45",X"20",X"4d",X"49",X"4e",X"55",X"54",X"4f",X"53",X"20");
-- incrementa horas
WHEN "01000" =>
IF Pisca_Contador <= 10 THEN
Exibe_HEX_all(
10,
10,
Tt_m1,
(A(0)
NOT('1'))
AND
(A(1)
NOT('1'))
AND
(A(2)
NOT('1'))
AND
(A(3)
NOT('1'))
AND
24
-- "
E
T
O
"
X"20",X"20",X"54",X"45",X"4D",X"50",X"4F",X"52",X"49",X"5A",X"41",X"44",X"4F",X"52",X"20",X"20",
-U
"
J
H
"
X"20",X"20",X"41",X"4A",X"55",X"53",X"54",X"45",X"20",X"48",X"4f",X"52",X"41",X"53",X"20",X"20");
-- reiniciar a contagem
WHEN "10000" =>
IF (Disparo_Temporizador = '1')THEN
Disparo_Temporizador := '0';
grava_tempo_inicial(Tt_i_7,
Tt_i_6,
Tt_h1, Tt_h2, Tt_m1, Tt_m2, Tt_s1, Tt_s2, Tt_cs1, Tt_cs2); --retorna o tempo inicial
para o tempo atual
END IF;
Exibe_HEX_all( Tt_h1, Tt_h2, Tt_m1, Tt_m2,
Tt_s1, Tt_s2, Tt_cs1, Tt_cs2,
-- zerar a contagem
WHEN "11110" =>
zera_tempo(Tt_h1,
Tt_h2,
Tt_m1,
Tt_m2,
-- Tratamento de excecoes
WHEN OTHERS =>
Exibe_HEX_all( Tt_h1, Tt_h2, Tt_m1, Tt_m2,
Tt_s1, Tt_s2, Tt_cs1, Tt_cs2,
END CASE;
25
END IF;
END PROCESS maq_est;
-- Fracionadores de clock
-- 1 : 1000 , 50MHz -> 50KHz
contador_1: PROCESS (clock_maquina)
VARIABLE counter_1
BEGIN
IF (clock_maquina'EVENT and clock_maquina = '1') THEN
IF (counter_1 = 1000) THEN
counter_1 := 0;
clkout_1 <= '1';
ELSE
counter_1:= counter_1 + 1;
clkout_1 <= '0';
END IF;
END IF;
END PROCESS contador_1;
BEGIN
IF (clkout_1'EVENT and clkout_1 = '1') THEN
IF (counter_2 = 500) THEN
counter_2 := 0;
clkout_2 <= '1';
ELSE
counter_2:= counter_2 + 1;
clkout_2 <= '0';
END IF;
END IF;
END PROCESS contador_2;
BEGIN
IF (clkout_2'EVENT and clkout_2 = '1') THEN
IF (counter_3 = 10) THEN
counter_3 := 0;
clkout_3 <= '1';
ELSE
counter_3:= counter_3 + 1;
clkout_3 <= '0';
END IF;
END IF;
END PROCESS contador_3;
26
q <=
B & cron_1_temp_0;
--%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
--%%%%%%%%%%%% Display LCD %%%%%%%%%%%%%
--%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
27
28
29
END maquina_estados_geral;
========================================