Arquivo de novembro \07\UTC 2009

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. 😀