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.

Anúncios
  1. Eu também sou uma leitora assídua do seu blog, e fiquei pensando: para que você ainda usa VHDL?

    • Vianna
    • 8 de novembro de 2009

    Para criar circuitos.
    Leia mais sobre VHDL aqui: http://pt.wikipedia.org/wiki/VHDL

    • Bullshico
    • 9 de novembro de 2009

    Rapaz, obrigado pelo elogio, mas trabalho a muito pouco tempo com VHDL e hardware [reconfigurável] e pretendo mudar de área se possível. Minha experiência se resume em alguns poucos meses também. Para piorar, com raros projetos e – devido à falta de recursos do meu laboratório – praticamente apenas com simulações.

    A propósito, gostei do seu post. Mas assim como o Marcelo, eu não faria máquinas de estados dependentes de clocks: “Existem sugestões de máquinas de estado onde tudo é dependente do clock (rising_edge). No entanto, a divisão das partes combinacionais e sequenciais permite um circuito final, em geral, mais rápido. Uma vez que a parte combinacional tenha gerado um resultado, ele é usado na parte sequencial, atualizando as saídas”.

    Outra coisa, totalmente off-topic. Já que você aparentemente gosta da área. Conhece o Bluespec [1]? É uma linguagem de descrição de hardware mais funcional. E embora ela seja funcional, aparentemente os circuitos gerados por ela são muito bons (ela converte o código em bluespec para verilog). Particularmente, eu não sei nada de verilog (não sei se é o seu caso) e existem muitos macetes que só com o tempo pegamos. Nesses casos, o compilador dessa linguagem tem uma vantagem sobre nós: os engenheiros que a fizeram são bastante experientes e já pensaram neles! 🙂

    O único porém é que o compilador/simulador é pago. Existem licenças gratuitas para universidades, se não me engano. Caso você esteja interessado, posso conversar com o pessoal aqui para ver como a licença é adquirida.

    Abraços! 🙂

    [1] http://www.bluespec.com/

      • Vianna
      • 9 de novembro de 2009

      Nunca fui oficialmente apresentado ao Verilog. Só conheço pela wikipédia e tal, por curiosidade… Vou dar uma olhada nesse Bluespec.

      Sobre a dependência do clock, eu tinha até lido isso no post do Marcelo Barros, mas eu achei mais simples só passar a idéia das máquinas de estado sem entrar nessa (importante) questão… De qualquer maneira, o ‘clock’ do meu exemplo pode ser qualquer sinal e o segundo desenho que fiz seria análogo ao bloco ‘curr_demo_state’ do post do Marcelo.

      Exatamente por essas e por outras coisas que eu aconselhei a leitura do post do Marcelo (que você mesmo me indicou 🙂 ), pois ele é mais profundo.

      Depois vou ver se faço um update no post comentando isso.

      Abraços

  1. No trackbacks yet.

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair /  Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair /  Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair /  Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair /  Alterar )

w

Conectando a %s

Anúncios
%d blogueiros gostam disto: