· Web viewResolvendo-se a equação acima para todas as temperaturas possíveis obtêm-se a...

34
UNIVERSIDADE FEDERAL DO RIO GRANDE DO NORTE DEPARTAMENTO DE ENGENHARIA ELÉTRICA INSTRUMENTAÇÂO ELETRÔNICA LUCIANO FONTES CAVALCANTE PROJETO DE UM MEDIDOR DE DISTÂNCIA POR EMISSÃO DE ONDAS SONORAS GILENNON WILKER GOMES BEZERRA GILMAR GUEDES DE CARVALHO RAFAEL BRIANI BIONDI

Transcript of  · Web viewResolvendo-se a equação acima para todas as temperaturas possíveis obtêm-se a...

UNIVERSIDADE FEDERAL DO RIO GRANDE DO NORTEDEPARTAMENTO DE ENGENHARIA ELÉTRICA

INSTRUMENTAÇÂO ELETRÔNICALUCIANO FONTES CAVALCANTE

PROJETO DE UM MEDIDOR DE DISTÂNCIA POR EMISSÃO DE ONDAS SONORAS

GILENNON WILKER GOMES BEZERRAGILMAR GUEDES DE CARVALHORAFAEL BRIANI BIONDI

NATAL/RNJULHO DE 2011

SUMÁRIO

1. INTRODUÇÃO.......................................................................................................................... 5

2. PROJETO VHDL DO MEDIDOR DE DISTÂNCIA..................................................................5

2.1. BLOCO DIVISOR DE CLOCK.......................................................................................................52.2. BLOCO DE COMPENSAÇÃO TÉRMICA........................................................................................72.3. MÁQUINA DE ESTADOS.............................................................................................................82.4. BLOCO DO CONTADOR BINÁRIO/DECIMAL..............................................................................102.5. BLOCO DE MEMÓRIA DE EXIBIÇÃO..........................................................................................112.6. BLOCO DE CONVERSÃO BINÁRIA PARA DISPLAY DE SETE SEGMENTOS...............................122.7. SISTEMA DIGITAL DO INSTRUMENTO COMPLETO....................................................................13

3. CONCLUSÕES....................................................................................................................... 15

4. PROPOSIÇÕES DE MELHORAMENTO..............................................................................15

ANEXOS (CÓDIGOS EM VHDL)...................................................................................................15

LISTA DE FIGURAS

FIGURA 1: BLOCO DIVISOR DE CLOCK.......................................................................................................6FIGURA 2: SIMULAÇÃO DO BLOCO DIVISOR DE FREQÜÊNCIA....................................................................7FIGURA 3: BLOCO DE COMPENSAÇÃO TÉRMICA........................................................................................7FIGURA 4: SIMULAÇÃO DO BLOCO DE COMPENSAÇÃO TÉRMICA...............................................................8FIGURA 5: DIAGRAMA DE ESTADOS DO INSTRUMENTO..............................................................................8FIGURA 6: BLOCO DA MÁQUINA DE ESTADOS............................................................................................9FIGURA 7: SIMULAÇÃO DO BLOCO DA MÁQUINA DE ESTADOS.................................................................10FIGURA 8: BLOCO DO CONTADOR BINÁRIO/DECIMAL...............................................................................10FIGURA 9: SIMULAÇÃO DO BLOCO CONTADOR BINÁRIO DECIMAL...........................................................11FIGURA 10: BLOCO DE MEMÓRIA DE EXIBIÇÃO........................................................................................11FIGURA 11: SIMULAÇÃO DO BLOCO DE MEMÓRIA DE EXIBIÇÃO..............................................................12FIGURA 12: BLOCO DE CONVERSÃO BINÁRIA PARA DISPLAY DE SETE SEGMENTOS..............................13FIGURA 13: SIMULAÇÃO DO BLOCO DE CONVERSÃO BINÁRIA PARA DISPLAY DE SETE SEGMENTOS.....13FIGURA 14: SISTEMA COMPLETO.............................................................................................................13FIGURA 15: FUNCIONAMENTO NORMAL DO INSTRUMENTO......................................................................14FIGURA 16: FUNCIONAMENTO DO RESET GLOBAL DO SISTEMA..............................................................14

LISTA DE TABELAS

TABELA 1: VELOCIDADE DE PROPAGAÇÃO SONORA EM FUNÇÃO DA TEMPERATURA...............................6TABELA 2: FREQÜÊNCIA DE CLOCK EM FUNÇÃO DA TEMPERATURA.........................................................6TABELA 3: ESCOLHA DA COMPENSAÇÃO TÉRMICA....................................................................................7TABELA 4: ESTADOS DA MÁQUINA DE ESTADOS........................................................................................9TABELA 5: TABELA DE CONVERSÃO BINÁRIA PARA DISPLAY DE SETE SEGMENTOS...............................12TABELA 6: FUNÇÃO DAS ENTRADAS E SAÍDAS DO SISTEMA....................................................................14

PROJETO DE UM MEDIDOR DE DISTÂNCIA POR EMISSÃO DE ONDAS SONORAS

1. Introdução

Este projeto tem como objetivo a concepção de um instrumento de medição de distancia por emissão de ondas sonoras. O enfoque do projeto será no sistema digital de controle e tratamento dos dados e o mesmo será desenvolvido em linguagem de descrição de hardware (VHDL). As especificações do projeto são listadas abaixo:

Distância mínima de medição igual a um centímetro; Distância máxima de medição igual a 99,99 metros (≈ 100 metros); Passo de medição igual a um centímetro; Correção térmica de propagação sonora “on board”; Codificação VHDL estruturada.

Tendo em vista que para maior robustez e simplicidade do sistema a codificação VHDL deverá ser estruturada, o projeto será dividido em blocos que uma vez interligados possibilitem o bom funcionamento do instrumento.

2. Projeto VHDL do medidor de distância

Como dito anteriormente a codificação VHDL deverá ser estruturada, e para que se possa estruturá-la deve-se dividir o projeto em blocos. Desta forma, o projeto será dividido entre:

Divisor de clock; Compensador térmico; Máquina de estados; Contador binário/decimal; Memória de exibição; Conversor binário para display de sete segmentos.

Todos os blocos serão apresentados a seguir, com suas respectivas descrições, codificações e simulações.

2.1. Bloco divisor de clock

Este bloco tem como principal função gerar uma freqüência conveniente a partir do clock proveniente do cristal gerador do circuito. O cristal utilizado na placa FPGA deste projeto possui uma freqüência igual a 50 MHz.

Para facilitar o tratamento dos dados do instrumento utilizar-se-á um clock tal que possibilite a medida de um centímetro por período. Desta forma, observa-se a Tabela 1 abaixo para definir-se o clock de saída do divisor de clock.

5

PROJETO DE UM MEDIDOR DE DISTÂNCIA POR EMISSÃO DE ONDAS SONORAS

Tabela 1: Velocidade de propagação sonora em função da temperatura

Temperatura (°C) -5 0 5 10 15 20 25 30Velocidade (m/s) 329 332 335 338 341 343 346 349

Desta forma, utiliza-se a seguinte equação para definir as freqüências que deverão ser geradas pelo bloco divisor de freqüências:

f= velocidade (cm / s)2

Nota-se que a freqüência é a velocidade em (cm/s) dividida por dois. Isto se deve ao fato da onda percorrer duas vezes à distância a ser medida, ou seja, a ida do instrumento ao objeto e a volta do objeto ao instrumento após reflexão. Resolvendo-se a equação acima para todas as temperaturas possíveis obtêm-se a seguinte tabela de freqüências em função de temperatura:

Tabela 2: Freqüência de clock em função da temperatura

Temperatura (°C) -5 0 5 10 15 20 25 30Freqüência (kHz) 16,5 16,6 16,8 16,9 17,1 17,2 17,3 17,5

Desta forma, pode-se concluir que o projeto deverá possuir oito divisores de clock, com oito valores de freqüência diferentes. A utilização destas freqüências será decidida pelo bloco de compensação térmica que será apresentado na seqüência.

O bloco divisor de clock desenvolvido em VHDL tem o seguinte aspecto:

Figura 1: Bloco divisor de clock

Pode-se observar que na entrada do bloco deve-se conectar o clock de 50 MHz e um sinal de reinicialização, enquanto que na saída do mesmo obter-se-á o clock desejado.

A Figura 2 a seguir mostra a simulação efetuada para este bloco, o que inicialmente garante o seu funcionamento. Por motivos visuais a freqüência simulada será dividida por quatro, entretanto, se o sistema garante a divisão por quatro o mesmo garantirá a divisão para geração das freqüências necessárias para o sistema de medição. O código completo do bloco de divisão de freqüência estará disponibilizado em anexo neste mesmo documento.

6

PROJETO DE UM MEDIDOR DE DISTÂNCIA POR EMISSÃO DE ONDAS SONORAS

Figura 2: Simulação do bloco divisor de freqüência

Como se pode observar a freqüência de saída do bloco divisor de freqüência é igual à freqüência de entrada dividida por quatro. Pode-se observar também que a saída do bloco divisor de freqüência somente passa a ser gerada quando o sinal de “reset” é desabilitado.

A seguir será apresentado o bloco de compensação térmica, que é o bloco responsável por gerir a freqüência que será utilizada pelo instrumento.

2.2. Bloco de compensação térmica

O bloco de compensação térmica tem como principal função escolher a freqüência que deverá ser utilizada no instrumento de acordo com a temperatura do meio externo. Este bloco é comandado por três variáveis de entrada e o funcionamento do mesmo é como mostra a Tabela 3 abaixo:

Tabela 3: Escolha da compensação térmica

Variável 1 (binária) 0 0 0 0 1 1 1 1Variável 2 (binária) 0 0 1 1 0 0 1 1Variável 3 (binária) 0 1 0 1 0 1 0 1Freqüência (kHz) 16,5 16,6 16,8 16,9 17,1 17,2 17,3 17,5

Desta forma, analisando-se a Tabela 3, bloco de compensação térmica desenvolvido em VHDL tem o seguinte aspecto:

Figura 3: Bloco de compensação térmica

A Figura 4 a seguir mostra a simulação efetuada para este bloco, o que inicialmente garante o seu funcionamento. O código completo do bloco de divisão de freqüência estará disponibilizado em anexo neste mesmo documento.

7

PROJETO DE UM MEDIDOR DE DISTÂNCIA POR EMISSÃO DE ONDAS SONORAS

Figura 4: Simulação do bloco de compensação térmica

Como se pode observar na Figura 4 acima, de acordo com a entrada escolhida para o bloco de compensação térmica obtém-se uma saída de freqüência referente à temperatura escolhida.

A seguir será apresentado o bloco da máquina de estados, responsável por gerir todo o funcionamento do instrumento de medição de distância por ondas sonoras.

2.3. Máquina de estados

O bloco da máquina de estados é responsável pelo controle central do instrumento, tendo em vista que é o bloco responsável por gerar os sinais que inicializarão todos os outros blocos. Outra função do bloco da máquina de estados é cadenciar a ordem dos acontecimentos, para que o instrumento apresente o funcionamento correto. A Figura 5 abaixo representa o funcionamento da máquina de estados desenvolvida para esta aplicação.

Figura 5: Diagrama de estados do instrumento

A variável de entrada “rst” reinicializa todo o sistema, a variável de entrada “start” habilita a medição e a variável de entrada “back” indica o fim da medida.

A Tabela 4 a seguir apresentará os descritivos e as conseqüências de cada estado representado nesta máquina de estados.

8

PROJETO DE UM MEDIDOR DE DISTÂNCIA POR EMISSÃO DE ONDAS SONORAS

Tabela 4: Estados da máquina de estados

Estado Descrição Variáveis

S0Estado de inicialização do sistema. Neste estado todas as variáveis são remetidas aos seus estados iniciais. Este é o estado de inicialização da memória.

clear_mem = ‘1’clear_count = ‘0’enable = ‘0’save = ‘0’sound = ‘0’

S1Estado de espera. Neste estado o sistema aguarda a requisição de funcionamento. Nenhuma variável é modificada neste estado.

clear_mem = ‘0’clear_count = ‘0’enable = ‘0’save = ‘0’sound = ‘0’

S2Estado de contagem. Neste estado inicia-se a contagem e aguarda-se o retorno do sinal enviado. A variável de emissão de som e o ‘enable’ do contador são inicializadas.

clear_mem = ‘0’clear_count = ‘0’enable = ‘1’save = ‘0’sound = ‘1’

S3Estado de armazenamento. Neste estado os dados provenientes da contagem são armazenados em memórias que alimentarão os displays. A variável de armazenamento é inicializada.

clear_mem = ‘0’clear_count = ‘0’enable = ‘0’save = ‘1’sound = ‘0’

S4Estado de reinicialização. Neste estado os contadores serão reinicializados. A variável de limpeza dos contadores é inicializada.

clear_mem = ‘0’clear_count = ‘1’enable = ‘0’save = ‘0’sound = ‘0’

A variável de saída “clear_mem” é responsável pela reinicialização das memórias, a variável de saída “clear_count” é responsável pela reinicialização dos contadores, a variável de saída “enable” habilita os contadores, a variável de saída “save” salva os dados dos contadores em memórias de exibição e por fim a variável de saída “sound” habilita o envio do som.

O bloco da máquina de estados desenvolvido em VHDL tem o seguinte aspecto:

Figura 6: Bloco da máquina de estados

A Figura 7 a seguir mostra a simulação efetuada para este bloco, o que inicialmente garante o seu funcionamento. O código completo do bloco de divisão de freqüência estará disponibilizado em anexo neste mesmo documento.

9

PROJETO DE UM MEDIDOR DE DISTÂNCIA POR EMISSÃO DE ONDAS SONORAS

Figura 7: Simulação do bloco da máquina de estados

A seguir será apresentado o bloco do contador binário/decimal, responsável por contar a distância medida diretamente em centímetros.

2.4. Bloco do contador binário/decimal

A função principal deste bloco é efetuar uma contagem binária de zero a nove, de maneira a possibilitar a simplificação do tratamento digital dos dados do instrumento. Levando-se em consideração que cada pulso de clock representa um centímetro de distância entre o instrumento e o objeto que se deseja medir a distância pode-se utilizar contadores binários/decimal para a obtenção direta do valor final em centímetros na saída dos displays de sete segmentos.

Levando-se em consideração que a distância máxima que se deseja medir é igual a 99,99 metros (9.999 centímetros) e que cada contador é responsável por um algarismo deveremos utilizar para este instrumento quatro blocos de contador binário/decimal.

O bloco contador binário/decimal desenvolvido em VHDL tem o seguinte aspecto:

Figura 8: Bloco do contador binário/decimal

Como se pode observar o bloco do contador binário decimal apresenta três entradas, sendo elas: a entrada de “clock”, a entrada de “reset” e a entrada de habilitação de funcionamento (“enable”). Como saída do bloco pode-se observar a saída binária/decimal com quatro bits e a saída de “overflow” que sinaliza o estouro do contador.

A Figura 9 a seguir mostra o funcionamento do bloco contador binário/decimal. Os códigos deste bloco estarão anexados a este documento.

10

PROJETO DE UM MEDIDOR DE DISTÂNCIA POR EMISSÃO DE ONDAS SONORAS

Figura 9: Simulação do bloco contador binário decimal

Como se pode observar na Figura 9 acima o bloco contador binário/decimal somente passa a operar como o desejado após a inicialização do sinal de entrada “enable”. Os contadores são colocados em cascata e ao término da contagem de um dos contadores o mesmo envia o seu sinal de “overflow” à entrada “enable” do subseqüente para que o mesmo incremente a sua saída em uma unidade. Os contadores vão, desta forma, formando um número com a quantidade de algarismos igual ao número de contadores em cascata. Quando o último contador estoura, o sinal de “overflow” do mesmo é enviado ao sinal de reinicialização do sistema que reinicializa o instrumento sinalizando que o mesmo excedeu o limite especificado (9.999 cm).

A seguir será apresentado o bloco de memória de exibição, responsável por manter os valores medidos no display após reinicialização dos contadores.

2.5. Bloco de memória de exibição

O bloco de memória de exibição tem como principal função manter os displays com o valor obtido através da medição após a reinicialização dos contadores. Analisando-se por este ângulo, o funcionamento deste bloco é bastante parecido com um flip-flop D.

O bloco de memória de exibição desenvolvido em VHDL tem o seguinte aspecto:

Figura 10: Bloco de memória de exibição

O funcionamento deste bloco é basicamente o seguinte: Envia-se um sinal “1” na entrada “escrever” e a variável da entrada “bcd_in” é armazenada na memória e passada diretamente para a saída “bcd_out”.

A Figura 11 a seguir mostra o funcionamento do bloco memória de exibição. Os códigos deste bloco estarão anexados a este documento.

11

PROJETO DE UM MEDIDOR DE DISTÂNCIA POR EMISSÃO DE ONDAS SONORAS

Figura 11: Simulação do bloco de memória de exibição

Como se pode observar o funcionamento deste bloco é tal qual se esperava. A seguir será apresentado o bloco de conversão binária para display de sete segmentos, responsável por fazer esta conversão.

2.6. Bloco de conversão binária para display de sete segmentos

O bloco de conversão binária para display de sete seguimentos tem como objetivo converte dados binários de quatro bits (decimal de zero a nove) em dados que possam ser mostrados nos displays de sete segmentos. Para o desenvolvimento deste bloco foi utilizada a seguinte tabela:

Tabela 5: Tabela de conversão binária para display de sete segmentos

Para a aplicação do instrumento de medição de distância os dados a serem mostrados pelos displays são unicamente numéricos e desta forma foi utilizada apenas esta parte da Tabela 5.

O bloco de conversão binária para display de sete segmentos desenvolvido em VHDL tem o seguinte aspecto:

12

PROJETO DE UM MEDIDOR DE DISTÂNCIA POR EMISSÃO DE ONDAS SONORAS

Figura 12: Bloco de conversão binária para display de sete segmentos

O conversor funciona de forma continua, ou seja, independente de inicializações. Todos os dados binários colocados na entrada do bloco de conversão são automaticamente convertidos para dados do formato display de sete segmentos.

A Figura 13 a seguir mostra o funcionamento do bloco de conversão binária para display de sete segmentos. Os códigos deste bloco estarão anexados a este documento.

Figura 13: Simulação do bloco de conversão binária para display de sete segmentos

Como se pode observar o funcionamento deste bloco é tal qual se esperava. A seguir será apresentado o bloco completo do sistema.

2.7. Sistema completo do instrumento

A Figura 14 abaixo é uma representação do circuito completo do instrumento de medição de distância por ondas sonoras.

Figura 14: Sistema completo

13

PROJETO DE UM MEDIDOR DE DISTÂNCIA POR EMISSÃO DE ONDAS SONORAS

As entradas e saídas globais do sistema estão representadas em vermelho, enquanto que os sinais internos estão representados em preto. A Tabela 6 abaixo apresenta um resumo das entradas e saídas do sistema, com um resumo de suas funções.

Tabela 6: Função das entradas e saídas do sistema

Entradas/Saídas FunçãoClk Clock global do sistema (50 MHz).Rst Reset global do sistema (Ativado com nível lógico ‘1’).Start Botão de inicialização da medição (Ativado com nível lógico ‘1’).Back Retorno do sensor de áudio (Ativado com nível lógico ‘1’).Sound Saída de ativação da saída de áudio (Ativado com nível lógico ‘1’).Chose Escolha da temperatura (Vetor de três bits).display_1 Saída do display sete segmentos 1.display_2 Saída do display sete segmentos 2.display_3 Saída do display sete segmentos 3.display_4 Saída do display sete segmentos 4.

A Figura 15 abaixo mostra o funcionamento normal do instrumento de medição de distância por ondas sonoras:

Figura 15: Funcionamento normal do instrumento

Como se pode observar na Figura 15 acima, após a inicialização do instrumento por intermédio do botão “start” o mesmo inicializa o envio do som e a contagem. Com o retorno do sinal de áudio, o instrumento envia o valor contado para os displays de sete segmentos, por intermédio das memórias de exibição. A Figura 16 abaixo mostra o funcionamento do reset global do sistema.

Figura 16: Funcionamento do reset global do sistema

14

PROJETO DE UM MEDIDOR DE DISTÂNCIA POR EMISSÃO DE ONDAS SONORAS

Como se pode observar, quando o botão de reset global do sistema é acionado, todas as variáveis são remetidas aos seus estados de inicialização. A seguir serão apresentadas as conclusões deste projeto.

3. Conclusões

O sistema funcionou como o esperado e todos os resultados das simulações foram satisfatórios. O sistema apresenta um range de medição de 99,99 metros, com uma sensibilidade de um centímetro. A codificação respeitou as exigências no que se diz respeito à estruturação do código e desta forma pode-se obter um código robusto e de fácil implementação.

O sistema não foi montado na placa de FPGA, tendo em vista a dificuldade de obtenção da mesma e a curta duração do curso de instrumentação, entretanto os resultados de simulação mostram que o projeto é viável e que o funcionamento do mesmo é como o desejado.

O curso de instrumentação foi de grande importância na formação acadêmica de todos os integrantes do grupo responsável por este trabalho, mostrando a importância do sensoriamento e da instrumentação nas diversas áreas de engenharia.

4. Proposições de melhoramento

Seria interessante para os futuros grupos montar este sistema em uma placa de FPGA, projetando desta forma o emissor de áudio, o sensor receptor e os filtros necessários para o bom funcionamento do sistema.

Outro melhoramento possível seria a automatização do sistema de compensação térmico, com a montagem de um sensor de temperatura e de um conversor analógico – digital (ADC).

ANEXOS (Códigos em VHDL)

Divisor de clock (Código abaixo referente à freqüência de 16,5 kHz)

clk_div_16_5.vhd (freqüência de 16,5 kHz) clk_div_16_6.vhd (freqüência de 16,6 kHz) clk_div_16_8.vhd (freqüência de 16,8 kHz) clk_div_16_9.vhd (freqüência de 16,9 kHz) clk_div_17_1.vhd (freqüência de 17,1 kHz) clk_div_17_2.vhd (freqüência de 17,2 kHz) clk_div_17_3.vhd (freqüência de 17,3 kHz) clk_div_17_5.vhd (freqüência de 17,5 kHz)

Obs.: Um código para cada freqüência, ou seja, oito blocos separados de freqüências.

15

PROJETO DE UM MEDIDOR DE DISTÂNCIA POR EMISSÃO DE ONDAS SONORAS

library IEEE;use IEEE.STD_LOGIC_1164.ALL;use IEEE.STD_LOGIC_ARITH.ALL;use IEEE.STD_LOGIC_UNSIGNED.ALL;entity clk_div_16_5 is Port ( clk_in : in STD_LOGIC; rst : in STD_LOGIC; clk_out : out STD_LOGIC);end clk_div_16_5;architecture Behavioral of clk_div_16_5 issignal clk_out_sgn : STD_LOGIC;beginprocess(rst, clk_in)variable count : integer range 0 to 50000000 := 0;variable ref : integer := 3030; -- Valor que se deseja dividir a frequênciabeginif (rst = '1') then

count := 0;ref := 3030; -- Valor que se deseja dividir a frequênciaclk_out_sgn <= '0';

elseif (rising_edge(clk_in)) then

count := count + 1;if (count >= (ref/2)) then

count := 0;clk_out_sgn <= not clk_out_sgn;

end if;end if;

end if;end process;clk_out <= clk_out_sgn;end Behavioral;

Compensador térmico (comp_term.vhd)library IEEE;use IEEE.STD_LOGIC_1164.ALL;entity comp_term isPort ( clk_in : in STD_LOGIC; rst : in STD_LOGIC; chose : in STD_LOGIC_VECTOR (2 downto 0); clk_1 : in STD_LOGIC; clk_2 : in STD_LOGIC; clk_3 : in STD_LOGIC; clk_4 : in STD_LOGIC; clk_5 : in STD_LOGIC; clk_6 : in STD_LOGIC; clk_7 : in STD_LOGIC; clk_8 : in STD_LOGIC; clk_out : out STD_LOGIC

);end comp_term;architecture Behavioral of comp_term isbeginprocess(clk_in, rst, chose)

16

PROJETO DE UM MEDIDOR DE DISTÂNCIA POR EMISSÃO DE ONDAS SONORAS

beginif (rst = '1') then

clk_out <= '0';else

if (rising_edge(clk_in)) thencase chose is

when "000" =>clk_out <= clk_1;

when "001" =>clk_out <= clk_2;

when "010" =>clk_out <= clk_3;

when "011" =>clk_out <= clk_4;

when "100" =>clk_out <= clk_5;

when "101" =>clk_out <= clk_6;

when "110" =>clk_out <= clk_7;

when "111"=>clk_out <= clk_8;

when others =>clk_out <= '0';

end case;end if;

end if;end process;end Behavioral;

Máquina de Estados (state_machine.vhd)library IEEE;use IEEE.STD_LOGIC_1164.ALL;entity state_machine is Port ( clk : in STD_LOGIC; rst : in STD_LOGIC; start : in STD_LOGIC; back : in STD_LOGIC;

enable : out STD_LOGIC; clear_mem : out STD_LOGIC; clear_count : out STD_LOGIC; save : out STD_LOGIC;

sound : out STD_LOGIC);end state_machine;architecture Behavioral of state_machine istype state is (S0, S1, S2, S3, S4);signal current_state, next_state : state;signal clear_mem_sgn : STD_LOGIC;signal clear_count_sgn : STD_LOGIC;signal enable_sgn : STD_LOGIC;signal save_sgn : STD_LOGIC;signal sound_sgn : STD_LOGIC;beginprocess(clk, rst)

17

PROJETO DE UM MEDIDOR DE DISTÂNCIA POR EMISSÃO DE ONDAS SONORAS

beginif (rst = '1') then

current_state <= S0;else

if (rising_edge(clk)) thencurrent_state <= next_state;

end if;end if;end process;process(current_state, start, back)begin

case current_state iswhen S0 =>

next_state <= S1;when S1 =>

if (start = '1') thennext_state <= S2;

elsenext_state <= S1;

end if;when S2 =>

if (back = '1') thennext_state <= S3;

elsenext_state <= S2;

end if;when S3 =>

next_state <= S4;when S4 =>

next_state <= S1;end case;

end process;process(current_state)begin

case current_state iswhen S0 =>

clear_mem_sgn <= '1';clear_count_sgn <= '0';enable_sgn <= '0';save_sgn <= '0';sound_sgn <= '0';

when S1 =>clear_mem_sgn <= '0';clear_count_sgn <= '0';enable_sgn <= '0';save_sgn <= '0';sound_sgn <= '0';

when S2 =>clear_mem_sgn <= '0';clear_count_sgn <= '0';enable_sgn <= '1';save_sgn <= '0';sound_sgn <= '1';

when S3 =>clear_mem_sgn <= '0';

18

PROJETO DE UM MEDIDOR DE DISTÂNCIA POR EMISSÃO DE ONDAS SONORAS

clear_count_sgn <= '0';enable_sgn <= '0';save_sgn <= '1';sound_sgn <= '0';

when S4 =>clear_mem_sgn <= '0';clear_count_sgn <= '1';enable_sgn <= '0';save_sgn <= '0';sound_sgn <= '0';

end case;end process;clear_mem <= clear_mem_sgn;clear_count <= clear_count_sgn;enable <= enable_sgn;save <= save_sgn;sound <= sound_sgn;end Behavioral;

Contador Binário para decimal (count_bcd.vhd)library IEEE;use IEEE.STD_LOGIC_1164.ALL;use IEEE.STD_LOGIC_ARITH.ALL;use IEEE.STD_LOGIC_UNSIGNED.ALL;entity count_bcd is Port ( clk : in STD_LOGIC; rst : in STD_LOGIC; en : in STD_LOGIC;

c_out : out STD_LOGIC; bcd_out : out STD_LOGIC_VECTOR (3 downto 0));end count_bcd;architecture Behavioral of count_bcd issignal bcd_out_sgn : STD_LOGIC_VECTOR (3 downto 0);signal c_out_sgn : STD_LOGIC;beginprocess(clk, rst)beginif (rst = '1') then

bcd_out_sgn <= (others => '0');c_out_sgn <= '0';

elseif (rising_edge(clk)) then

if (en = '1') thenif (bcd_out_sgn = "1001") then

bcd_out_sgn <= (others => '0');c_out_sgn <= '1';

elsebcd_out_sgn <= bcd_out_sgn + '1';c_out_sgn <= '0';

end if;end if;

end if;end if;end process;

19

PROJETO DE UM MEDIDOR DE DISTÂNCIA POR EMISSÃO DE ONDAS SONORAS

bcd_out <= bcd_out_sgn;c_out <= c_out_sgn;end Behavioral;

Memória de exibição (memoire.vhd)library IEEE;use IEEE.STD_LOGIC_1164.ALL;entity memoire is Port ( clk : in STD_LOGIC; rst : in STD_LOGIC; escrever : in STD_LOGIC; bcd_in : in STD_LOGIC_VECTOR (3 downto 0); bcd_out : out STD_LOGIC_VECTOR (3 downto 0));end memoire;architecture Behavioral of memoire isbeginprocess(clk, rst)beginif (rst = '1') then

bcd_out <= (others => '0');else

if (rising_edge(clk)) thenif (escrever = '1') then

bcd_out <= bcd_in;end if;

end if;end if;end process;end Behavioral;

Conversor Binário para display de sete segmentos (Bin_to_7disp.vhd)library IEEE;use IEEE.STD_LOGIC_1164.ALL;use IEEE.STD_LOGIC_ARITH.ALL;use IEEE.STD_LOGIC_UNSIGNED.ALL;entity bin_to_7disp is Port ( clk : in STD_LOGIC; rst : in STD_LOGIC; binaire : in STD_LOGIC_VECTOR (3 downto 0); display : out STD_LOGIC_VECTOR (6 downto 0));end bin_to_7disp;architecture Behavioral of bin_to_7disp issignal display_sgn : STD_LOGIC_VECTOR (6 downto 0);signal binaire_sgn : STD_LOGIC_VECTOR (3 downto 0); beginprocess(clk, rst)beginif (rst = '1') then

display_sgn <= (others => '0');binaire_sgn <= (others => '0');

elseif (rising_edge(clk)) then

20

PROJETO DE UM MEDIDOR DE DISTÂNCIA POR EMISSÃO DE ONDAS SONORAS

binaire_sgn <= binaire;case binaire is

when "0000" =>display_sgn <= "1111110";

when "0001" =>display_sgn <= "0110000";

when "0010" =>display_sgn <= "1101101";

when "0011" =>display_sgn <= "1111001";

when "0100" =>display_sgn <= "0110011";

when "0101" =>display_sgn <= "1011011";

when "0110" =>display_sgn <= "0011111";

when "0111" =>display_sgn <= "1110000";

when "1000" =>display_sgn <= "1111111";

when "1001" =>display_sgn <= "1110011";

when others =>display_sgn <= "0000000";

end case;end if;

end if;end process;display <= display_sgn;end Behavioral;

Sistema Completo (circuito.vhd)library IEEE;use IEEE.STD_LOGIC_1164.ALL;

entity circuito is Port ( clk_in : in STD_LOGIC; rst : in STD_LOGIC; chose : in STD_LOGIC_VECTOR (2 downto 0); start : in STD_LOGIC;

back : in STD_LOGIC; display1 : out std_logic_vector (6 downto 0); display2 : out std_logic_vector (6 downto 0); display3 : out std_logic_vector (6 downto 0); display4 : out std_logic_vector (6 downto 0); sound : out STD_LOGIC);

end circuito;

architecture Behavioral of circuito is

COMPONENT clk_div_16_5 PORT( clk_in : IN std_logic; rst : IN std_logic;

21

PROJETO DE UM MEDIDOR DE DISTÂNCIA POR EMISSÃO DE ONDAS SONORAS

clk_out : OUT std_logic ); END COMPONENT;

COMPONENT clk_div_16_6

PORT( clk_in : IN std_logic; rst : IN std_logic; clk_out : OUT std_logic ); END COMPONENT;

COMPONENT clk_div_16_8

PORT( clk_in : IN std_logic; rst : IN std_logic; clk_out : OUT std_logic ); END COMPONENT;

COMPONENT clk_div_16_9

PORT( clk_in : IN std_logic; rst : IN std_logic; clk_out : OUT std_logic ); END COMPONENT;

COMPONENT clk_div_17_1

PORT( clk_in : IN std_logic; rst : IN std_logic; clk_out : OUT std_logic ); END COMPONENT;

COMPONENT clk_div_17_2

PORT( clk_in : IN std_logic; rst : IN std_logic; clk_out : OUT std_logic ); END COMPONENT;

COMPONENT clk_div_17_3

PORT( clk_in : IN std_logic; rst : IN std_logic; clk_out : OUT std_logic ); END COMPONENT;

COMPONENT clk_div_17_5

PORT(

22

PROJETO DE UM MEDIDOR DE DISTÂNCIA POR EMISSÃO DE ONDAS SONORAS

clk_in : IN std_logic; rst : IN std_logic; clk_out : OUT std_logic ); END COMPONENT;

COMPONENT comp_term

PORT( clk_in : IN std_logic; rst : IN std_logic; chose : IN std_logic_vector(2 downto 0); clk_1 : IN std_logic; clk_2 : IN std_logic; clk_3 : IN std_logic; clk_4 : IN std_logic; clk_5 : IN std_logic; clk_6 : IN std_logic; clk_7 : IN std_logic; clk_8 : IN std_logic; clk_out : OUT std_logic ); END COMPONENT;

COMPONENT state_machine

PORT( clk : IN std_logic; rst : IN std_logic; start : IN std_logic; back : IN std_logic; enable : OUT std_logic; clear_mem : OUT std_logic;

clear_count : OUT std_logic; save : OUT std_logic; sound : OUT std_logic ); END COMPONENT;

COMPONENT count_bcd PORT( clk : IN std_logic; rst : IN std_logic; en : IN std_logic; c_out : OUT std_logic;

bcd_out : OUT std_logic_vector(3 downto 0) ); END COMPONENT;

COMPONENT memoire PORT( clk : IN std_logic; rst : IN std_logic; escrever : IN std_logic; bcd_in : IN std_logic_vector(3 downto 0); bcd_out : OUT std_logic_vector(3 downto 0) );

23

PROJETO DE UM MEDIDOR DE DISTÂNCIA POR EMISSÃO DE ONDAS SONORAS

END COMPONENT;

COMPONENT bin_to_7disp PORT( clk : IN std_logic; rst : IN std_logic; binaire : IN std_logic_vector(3 downto 0); display : OUT std_logic_vector(6 downto 0) ); END COMPONENT;

SIGNAL clk_1 : STD_LOGIC; SIGNAL clk_2 : STD_LOGIC; SIGNAL clk_3 : STD_LOGIC; SIGNAL clk_4 : STD_LOGIC; SIGNAL clk_5 : STD_LOGIC; SIGNAL clk_6 : STD_LOGIC; SIGNAL clk_7 : STD_LOGIC; SIGNAL clk_8 : STD_LOGIC; SIGNAL clk_out : STD_LOGIC; SIGNAL enable : STD_LOGIC; SIGNAL clear_mem : STD_LOGIC; SIGNAL clear_count : STD_LOGIC; SIGNAL save: STD_LOGIC; signal en_sgn1 : std_logic;signal en_sgn2 : std_logic;signal en_sgn3 : std_logic;signal c_out : std_logic;signal bcd_out1 : std_logic_vector (3 downto 0);signal bcd_out2 : std_logic_vector (3 downto 0);signal bcd_out3 : std_logic_vector (3 downto 0);signal bcd_out4 : std_logic_vector (3 downto 0);

signal bcd_out_mem1 : std_logic_vector (3 downto 0);signal bcd_out_mem2 : std_logic_vector (3 downto 0);signal bcd_out_mem3 : std_logic_vector (3 downto 0);signal bcd_out_mem4 : std_logic_vector (3 downto 0);signal limpa_mem : std_logic;signal limpa_count : std_logic;signal limpa_machine : std_logic;

begin

limpa_mem <= rst or clear_mem or c_out;limpa_count <= rst or clear_count or c_out;limpa_machine <= rst or c_out;

uut1: clk_div_16_5 PORT MAP ( clk_in => clk_in, rst => rst, clk_out => clk_1 );

24

PROJETO DE UM MEDIDOR DE DISTÂNCIA POR EMISSÃO DE ONDAS SONORAS

uut2: clk_div_16_6 PORT MAP ( clk_in => clk_in, rst => rst, clk_out => clk_2 );

uut3: clk_div_16_8 PORT MAP ( clk_in => clk_in, rst => rst, clk_out => clk_3 );

uut4: clk_div_16_9 PORT MAP ( clk_in => clk_in, rst => rst, clk_out => clk_4 );

uut5: clk_div_17_1 PORT MAP ( clk_in => clk_in, rst => rst, clk_out => clk_5 );

uut6: clk_div_17_2 PORT MAP ( clk_in => clk_in, rst => rst, clk_out => clk_6 );

uut7: clk_div_17_3 PORT MAP ( clk_in => clk_in, rst => rst, clk_out => clk_7 );

uut8: clk_div_17_5 PORT MAP ( clk_in => clk_in, rst => rst, clk_out => clk_8 );

uut9: comp_term PORT MAP ( clk_in => clk_in, rst => rst, chose => chose, clk_1 => clk_1, clk_2 => clk_2, clk_3 => clk_3, clk_4 => clk_4, clk_5 => clk_5, clk_6 => clk_6, clk_7 => clk_7, clk_8 => clk_8,

25

PROJETO DE UM MEDIDOR DE DISTÂNCIA POR EMISSÃO DE ONDAS SONORAS

clk_out => clk_out );

uut10: state_machine PORT MAP ( clk => clk_in, rst => limpa_machine, start => start, back => back, enable => enable, clear_mem => clear_mem,

clear_count => clear_count, save => save, sound => sound );

uut11: count_bcd PORT MAP ( clk => clk_out, rst => limpa_count, en => enable, c_out => en_sgn1, bcd_out => bcd_out1 );

uut12: count_bcd PORT MAP (

clk => en_sgn1, rst => limpa_count, en => enable, c_out => en_sgn2, bcd_out => bcd_out2 );

uut13: count_bcd PORT MAP (

clk => en_sgn2, rst => limpa_count, en => enable, c_out => en_sgn3, bcd_out => bcd_out3 );

uut14: count_bcd PORT MAP ( clk => en_sgn2, rst => limpa_count, en => enable, c_out => c_out, bcd_out => bcd_out4 );

uut15: memoire PORT MAP ( clk => clk_in, rst => limpa_mem, escrever => save, bcd_in => bcd_out1, bcd_out => bcd_out_mem1 );

26

PROJETO DE UM MEDIDOR DE DISTÂNCIA POR EMISSÃO DE ONDAS SONORAS

uut16: memoire PORT MAP ( clk => clk_in, rst => limpa_mem, escrever => save, bcd_in => bcd_out2, bcd_out => bcd_out_mem2 );

uut17: memoire PORT MAP ( clk => clk_in, rst => limpa_mem, escrever => save, bcd_in => bcd_out3, bcd_out => bcd_out_mem3 );

uut18: memoire PORT MAP ( clk => clk_in, rst => limpa_mem, escrever => save, bcd_in => bcd_out4, bcd_out => bcd_out_mem4 );

uut19: bin_to_7disp PORT MAP ( clk => clk_in, rst => rst, binaire => bcd_out_mem1, display => display1 );

uut20: bin_to_7disp PORT MAP ( clk => clk_in, rst => rst, binaire => bcd_out_mem2, display => display2 );

uut21: bin_to_7disp PORT MAP ( clk => clk_in, rst => rst, binaire => bcd_out_mem3, display => display3 );

uut22: bin_to_7disp PORT MAP ( clk => clk_in, rst => rst, binaire => bcd_out_mem4, display => display4 ); end Behavioral;

27