terça-feira, 3 de junho de 2014

[FPGA] Tutorial 1 - Ligando LEDs com Switches em VHDL

Oi pessoal,
Nesse primeiro tutorial de VHDL para FPGA estaremos ligando os LEDs (light emitting diode) a partir das nossas chaves embutidas na placa. O conjunto de ferramentas utilizadas nesse projeto:

-          Altera DE0 Board;
-          Quartus II (versao 13.1);
-          Windows 8;

Acredito que você não enfretará nenhum problema caso esteja utilizando outra placa. O procedimento é basicamente o mesmo, embora as especificações do seu projeto (modelo do chip, modelo da EEPROM, localização dos pinos) serão diferentes.

Para iniciar, se este é o seu primeiro contato com a placa, você deve instalar os drivers USB-BLASTER para que a placa seja reconhecida pelo sistema operacional, para isso, no gerenciador de dispositivos do seu PC (pressione a tecla do windows + pause/break simultaneamente e clique em gerenciador de dispositivos) procure pelo USB-BLASTER e instale os drivers (são encontrados na pasta do Quartus II X:\Altera\13\quartus\drivers\usb-blaster). 


Figura 1: O driver foi instalado com sucesso.

Nota: Qualquer maior dificuldade, o manual do usuário deve ser consultado.

Ok, agora que sua placa já é reconhecida é hora de começar o projeto. Abra o Quartus II…


Figura 2: Tela inicial do Quartus II.


Clique em New Project Wizard
Nesse momento você irá passar por uma série de janelas as quais definirão as características da sua placa e do seu projeto. Leia a primeira tela e clique em next.


Figura 3: new project wizard.

Na segunda janela, escolha a pasta aonde você irá salvar seu projeto e nos outros dois campos escreva o nome do seu projeto, no caso “chaves”.

Dica: Não escolha nomes e diretórios com espaços vazio (“ “) nos seus projetos. Às vezes acontecem erros de compilação por causa disso... recomendo sempre utilizar caminhos curtos e sem espaços.


Figura 4: definindo a pasta e o nome do seu projeto.

Clique em next, nessa janela o programa pergunta se você já tem algum arquivo pronto e quer adicionar ao projeto, no nosso caso não temos nenhum, então pulamos essa janela, next.


Figura 5: adicionar arquivos ao projeto.

Nesse momento definimos a família do nosso FPGA. Para a DE0 Board escolhemos a família Cyclone III e em devices selecionamos EP3C16F484C6.

Nota: Caso esteja utilizando uma placa diferente as especificações nessa etapa serão diferentes. Observe qual a família e o chip da sua placa. Por exemplo, se estiver utilizando a placa DE2 você deve escolher a família Cyclone II e EP2C35F672C6.


Figura 6: Especificação da família.


Clicando em next, o programa pergunta se estaremos utilizando alguma ferramenta extra para utilização no projeto, como ferramentas CAD (EDA e CAD são basicamente sinônimos).


Figura 7: Escolha de ferramentas EDA.




A última tela exibe um relatório com todas as configurações que você escolher, revise e clique em finish.
Depois de instalar os drivers e configurar o seu projeto, eh hora de programar. Clique em File > New escolha a opção VHDL. Um editor de texto vai aparecer dentro da janela do Quartus II. Agora clique em Project > Add current file to project, com isso seu arquivo VHDL é adicionado ao seu projeto.

LIBRARY ieee;
USE ieee.std_logic_1164.all;
ENTITY chaves IS
        PORT (     
                LEDS :OUT STD_LOGIC_VECTOR (9 downto 0);
                SWITCHES :IN STD_LOGIC_VECTOR (9 downto 0)
        );
END chaves;

ARCHITECTURE arc_chaves OF chaves IS
BEGIN
        LEDS <= SWITCHES;

END arc_chaves;

Pronto, agora que o código ficou pronto, só nos resta entendê-lo.

LIBRARY ieee;
USE ieee.std_logic_1164.all;

Esse trecho do código chama o pacote ieee que é padrão para o VHDL. Dentro dele estao contidos vários outros arquivos que definem estruturas no nosso código, no exemplo de hoje chamamos apenas a std_logic_1164 que define sinais do tipo STD_ULOGIC, STD_ULOGIC_VECTOR e o resolved ulogic: STD_LOGIC e STD_LOGIC_VECTOR.





Figura 8: Código VHDL.

ENTITY chaves IS
        PORT (     
                LEDS :OUT STD_LOGIC_VECTOR (9 downto 0);
                SWITCHES :IN STD_LOGIC_VECTOR (9 downto 0)
        );
END chaves;


Nesse momento, criamos a entidade chaves que contem dois STD_LOGIC_VECTOR que chamamos de LEDS e SWITCHES, o primeiro sendo uma saida e o segundo uma entrada. E/S são definidas dentro de PORT, observe que a última linha antes de ‘);’ não contem ‘;’

ARCHITECTURE __chaves OF chaves IS
BEGIN
        LEDS <= SWITCHES;
END __chaves;

Finalizando, criamos um architecture. Ele é usado para descrever o comportamento, fluxo de dados e estrutura de uma entity. No exemplo, ele é utilizado para associar os valores de 'SWITCHES' nos 'LEDS'. Note que o sinal de atribuição não é o sinal de igualdade, e sim a seta '<='.

Para compilar nosso código clique no botão play roxo ou vá em Processing > Start compilation. Aguarde seu programa ser compilado, ao fim, o quartus irá exibir um relatório que pode ser acessado através do atalho ctrl + r.


Figura 9: Relatório de compilaçao.

Se seu programa não foi compilado com sucesso, revise as configurações do seu projeto (Assignment > Devices) e seu código. Agora, com tudo funcionando, vamos associar os pinos do seu FPGA com as entradas e saidas do nosso programa. Para isso, clique em Assignment > Pin Planner, uma nova tela abrirá. Nessa tela, com auxilio do seu manual de usuário você irá associar os pinos da sua placa com as variáveis de entrada e saida criadas. Por exemplo, para a variável SWITCHES[0], em location digite J6 e o pino PIN_J6 será marcado.

Nota: PIN_J6 é associado ao SWITCH_0 da placa DE0. Consulte o manual de usuário caso possua outra placa.




Figura 10: Tabela de pinos do switch da placa DE0.



Figura 11: Pin Planner.

Após associar todos os pinos, compile seu programa novamente.
Para testar seu programa na placa, ligue ela apertando no botao vermelho e com a chave no modo RUN. Clique em Programmer > Tools em Hardware Setup selecione USB-BLASTER e em mode selecione JTAG. Selecione o seu arquivo chaves.sof e clique em Start. Imediatamente o programa é transferido para sua placa e já pode ser testado.


Figura 12: gravacao da placa utilizando JTAG.

Agora é só usar as chaves para ligar os leds e voalà.


Figura 13: Resultado final.


Em breve estarei postando e ensinando a vocês como gravar o seu programa utilizando o active serial programming para que seu programa seja aberto mesmo quando a placa é desligada.

É isso ai, até a próxima.

Um comentário:

  1. Muito obrigado! Era justamente uma página assim que eu estava procurando!

    ResponderExcluir