Posts Tagged ‘ VHDL ’

Máquinas de estados em VHDL

Já estava preparando esse texto há um tempinho e complementei com algumas idéias desse outro texto do Marcelo Barros.

Inclusive, a leitura desse outro texto é altamente recomendada!

Vamos ao meu humilde post:

Meu primeiro contato com VHDL foi há mais de um ano, mas só comecei a fazer projetos com ele há 3 meses, o que não é quase nada. Se alguém leu um dos primeiros posts desse blog, vai perceber que eu dizia que não é possível atribuir valor a um signal em mais de um local do código e isso é algo facilmente resolvido com as máquinas de estado.

Você pode tranquilamente fazer alguns circuitos em VHDL só usando IF e ELSE, mas, com o tempo, isso acaba atrapalhando quando você precisa configurar um sinal, fazer uma ou várias ações e, por fim, configurá-lo novamente.

Com o CASE, é possível criar estados e esses estados podem, cada um na sua vez, configurar o valor de um mesmo sinal.

Veja o exemplo abaixo:
estados2

Esse seria o modelo de um programa fictício que começa no estado A e fica nele até um sinal X receber o valor 1 (como se alguém clicasse num botão para disparar o mecanismo) depois ele passaria pelos estados B, C, E, F, retornando ao B e seguindo o loop até que um certo sinal Y receba o valor 1, então o sistema entra no estado D e por fim volta ao estado A para aguardar novamente o sinal X.

Para implementar essa máquina de estados, pode-se usar flip-flops do tipo D ( D é a entrada e Q é a saída), um para cada estado. A saída Q de cada Flip-flop é o controle para um certo circuito que atua quando o estado está ativo.

flipflops_3

Traduzir isso para código VHDL é simplesmente seguir as setas e colocar o que acontece em cada estado.

codigo
O sinal “estado” pode ser definido como:

signal estado: natural range 0 to 5:= 0;

Além disso, o “when others” serve para prevenir possíveis erros no valor do estado. Nesse caso não vai ter problema, mas é uma boa prática de programação usá-lo.

Com esse exemplo, dá pra ver que em qualquer um dos estados B, C, E ou F o valor do sinal Y poderia ser modificado sem problemas. Além disso, fica mais fácil de entender para que o código serve se uma outra pessoa quiser ler.

No texto do Marcelo Barros, vocês vão notar que ele usa os estados com nomes. Isso também é uma boa prática de programação, mas como estou só mostrando o conceito, acho que fica mais simples de entender. Isso não é complicado de fazer:

Usando o “type”, você configura os possíveis nomes dos estados, como abaixo. Use sempre nomes que descrevam bem o que irá ser feito no estado.

type estados is (aguardando, setup, modulo, soma, iteracao, multiplicacao);

Para acabar, a parte do conteúdo do estado, que mostra o que ele realmente faz pode ser escrita num novo CASE dentro de um “process (estado)”. Serve para deixar o código mais limpo.

Bem, por hoje é só. Se estiver algo errado no código ou no desenho, avisem.

Básico das FPGAs

Se você quer entrar no mundo das FPGAs e aprender descrever Hardware em VHDL, eu aconselho a leitura de um texto curto e bem explicado sobre esse assunto no blog do Ricardo Bittencourt (Brain Dump): http://www.ricbit.com/2009/11/ataque-cilonio.html

Somente um pouco mais avançado que um Hello World da programação de Hardware, ele ensina a fazer leds acenderem em sequência. Tudo numa linguagem simples e com muitas imagens. 😀

Cronômetro em VHDL

Meu último projeto em VHDL foi um simples cronômetro com precisão de centésimos de segundo que, com dois displays de sete segmentos, apresenta o tempo.

disp7-seg

Como só é possível apresentar dois dígitos de cada vez, foi adicionado suporte a um botão que, quando pressionado, muda o que o display exibe: Ele começa exibindo décimos e centésimos de segundo. Com um clique, passa a exibir os segundos. No clique seguinte, os minutos e depois, com mais um clique, as horas.

Para parar e continuar o cronômetro, foi usado mais um botão, ficando um sistema bem simples e funcional.

Cronometro funcionando

Cronômetro rodando numa MAX 7k da Altera

A imagem está em baixa resolução, mas mostra o cronômetro gravado numa CPLD MAX7128S da Altera, que deve ter uns 15 anos. Ela tem um clock de 25,175MHz, que permite um cronômetro com precisão de cerca de 40 nanosegundos (3,97 x 10⁻⁸ s), mas isso seria impossível de ver no display (centésimos de segundos já aparecem borrados). Então, no código, tem um divisor de frequência onde é usado um clock de 100Hz para a contagem de tempo.

O WordPress não permite anexar arquivos de texto, então coloquei no pastebin: http://pastebin.com/ythU4TjH. Para ver melhor, use o Notepad++ ou o Kate.

Para poder reutilizar esse código, será preciso trocar o valor do clock da sua CPLD ou FPGA para que o cronômetro marque o tempo certo. Nesse caso, o divisor de frequência usa o valor 125875 ou 11110101110110011, criando 200 descidas e subidas por segundo, que equivale a um clock de 100Hz.

Meu próximo projeto em VHDL será um controlador de interface serial RS232, aquela que provavelmente não existe mais no seu computador. Mesmo assim, é possível utilizar um conversor USB – RS232, como o que eu comprei por US$3,00 no DealExtreme.

Por hoje é só, pessoal.

VHDL

Very complicated Hardware Description Language.

Pessoa sobre VHDL

Claro que não significa isso, mas bem que poderia.

Aprendendo VHDL para programar uma CPLD a fazer um simples circuito para criar um pulso ao clique de um botão me custou 3 dias.

E o projeto era simples: Criar um divisor de frequência para o conseguir 100Hz ao invés de 250MHz, esperar 3 ciclos do novo clock após o botão ser pressionado (evita ruído) e depois gerar um pulso para a saída.

Placa UP1 da Altera

Placa UP1 da Altera

Coisas que podem ser feitas em outras linguagens de programação dão problemas em VHDL, como mudar o valor de uma das variáveis duas vezes no processo.

Acho melhor começar a ler mais sobre VHDL.

Fui.