André Castelan
"Em teoria não há diferença entre a pratica e a teoria, já na pratica..."

domingo, 30 de junho de 2013

Tutorial Quartus II: Piscando um LED

Boa noite pessoal, vamos a um post mais prático!

Com este post vou introduzir a ferramenta Quartus II da Altera para vocês e mostrar um pouco do que ela pode fazer.
Para começar você pode fazer o download do Quartus II direto do site da Altera em http://www.altera.com/ na seção de downloads (é necessário criar uma conta), a versão paga tem 30 dias de uso liberado mas recomendo baixar a versão grátis (Web Edition) que vem com tudo que é necessário para desenvolver projetos em FPGA, também é necessário realizar o download de um pacote de devices, dê uma olhada em qual kit você tem a disposição e qual FPGA ele possui, caso não possua kit algum escolha o Cyclone pois é a FPGA de entrada e provavelmente você vai encontrar uma Cyclone no seu primeiro kit.

Neste tutorial vou utilizar a versão Web Edition 13.0 (mais recente no momento do post) em um Windows 7 64 bits mas a interface é a mesma para Windows e Linux. Também vou utilizar o kit BeMicroSDK (falei sobre ele aqui) mas não é necessário ter o Kit para realizar as atividades.


Configurando o projeto no Quartus II


Após realizar o download do Quartus II de dois cliques no setup e na tela da Figura 1 selecione: Quartus II, device (no caso Cyclone) e Modelsim Starter edition. O Modelsim é um simulador de HDL muito utilizado, falarei mais sobre ele em outra ocasião.
Figura 1. Setup do Quartus II
Após realizar terminar a instalação inicie o Quartus II e você vai se deparar com uma tela igual a da Figura 2
Figura 2. Tela inicial do Quartus II

Clique em File -> New Quartus II Project para inicializar o wizard de novo projeto conforme Figura 3. É necessário fornecer o nome do projeto e o nome do top do projeto.
Fazendo uma analogia grosseira o top é o "equivalente" ao "main" em C. Quando um projeto é sintetizado ele começa pelo topo da hierarquia (top) e os outros módulos vão sendo sintetizados conforme instanciados. Chamei tanto o top quanto o projeto de pisca_led, é importante não haver espaços no caminho de diretórios do seu projeto. Depois clique em next duas vezes pois não serão inseridos arquivos no projeto.

Figura 3. Configurando o nome do projeto
Na tela seguinte é necessário escolher o FPGA em que o projeto será sintetizado, no caso da BeMicroSDK é um EP4CE22F17C7 (Figura 4) caso você não possua um kit pode escolher qualquer FPGA.

Figura 4. Escolhendo o FPGA do projeto
Com o projeto criado é necessário criar o nosso arquivo top que deve se chamar pisca_led.vhd, para isto vá em File->New->VHDL File. Escreva qualquer coisa no arquivo e salve-o como pisca_led.vhd para que ele seja o topo de hierarquia.

Desenvolvendo o VHDL


Como o ser humano não consegue enxergar um LED piscando muito rápido vamos realizar um atraso de um segundo na troca de estado do LED. Meu clock é de 50mhz, ou seja, ele pulsa 50 milhões de vezes por segundo. Fazendo uma matemática básica concluímos que é necessário que o LED troque de estado a cada 50 milhões de pulsos de clock. Para isso é criado um registrador do tipo Natural que vai de 0 a 50m, a própria ferramenta aloca a quantidade de bits necessária para este registrador conseguir representar este intervalo de valores.
O funcionamento do circuito é bem simples, ele possui um reset assíncrono que quando em 0 coloca nosso contador em 0 e o registrador do LED também, quando em 1 a cada pulso de clock nosso contador é incrementado. Quando este contador chega em 50m o registrador do led inverte o valor e o contador é zerado. Ainda estou devendo um post introdutório de VHDL mas espero que dê para entender este exemplo.

  library ieee;   
  use ieee.std_logic_1164.all;   
  entity pisca_led is   
  port   
  (   
    sys_clk_50mhz : in std_logic;   
    sys_rst : in std_logic;   
    led : out std_logic   
  );   
  end entity pisca_led;   
  architecture rtl of pisca_led is   
  signal led_delay : NATURAL range 0 to 50000000;   
  signal led_reg : std_logic;   
  begin   
  led <= led_reg; -- Atribui a porta de saída chamada led o valor do registrador
  process(sys_clk_50mhz, sys_rst) -- Executado a cada pulso de clock ou reset   
  begin   
    if sys_rst = '0' then -- Reset assíncrono, independe do clock  
       led_delay <= 0;   
       led_reg <= '0';   
    elsif rising_edge(sys_clk_50mhz) then   
       led_delay <= led_delay + 1;   
       if led_delay = 50000000 then   
         led_delay <= 0;   
         led_reg <= not led_reg; -- Inverte o valor do registrador do led  
       end if;   
    end if;   
  end process;   
  end architecture rtl;   


Conforme a Figura 5 podemos ver na lista de warnings do console que precisamos informar onde estão conectados as duas entradas e a saída do nosso FPGA. Para resolver isto vamos utilizar a ferramenta Pin Planner do Quartus II, está ferramenta serve para conectar as portas de entrada e saída do seu top aos pinos físicos do FPGA. Clique no ícone do Pin Planner conforme Figura 6.

Figura 5. Mensagens de warning
Figura 6. Abrindo o Pin Planner













Consultando a documentação da BeMicro SDK existe um clock de 50mhz conectado ao pino E1 da FPGA, um botão que será nosso reset no pino C2 e um LED no pino N15, vamos informar isto ao Quartus, para isto preencha os campos da Figura 7 de forma que fique igual a Figura 8.


Figura 8. Pinos configurados
   
Figura 7. Tela inicial do Pin Planner




Feche a janela e compile novamente o projeto, com isto os warnings referentes aos pinos não conectados sumirão. Teoricamente ainda seria necessário configurar a entrada de clock como clock em um arquivo .sdc e utilizar a ferramenta Timequest do Quartus mas não é faremos isto neste exemplo.

Agora vamos configurar o FPGA. Para isto utilizaremos o Programmer, primeiro conecte seu kit ao computador e depois clique no ícone da Figura 10. Na Figura 11 basta clicar em start e pronto! Seu kit está rodando o seu design e o primeiro LED irá piscar de um em um segundo, a não ser quando for segurado o botão User que é o reset.

Figura 11. Programmer
Figura 10. Ícone do Programmer






Na Figura 12 o resultado desta experiência.

Figura 12. Led piscando de um em um segundo na BeMicro SDK:)
Toda dúvida é bem vinda, fiquem a vontade para comentar.
Abraços! 

Nenhum comentário:

Postar um comentário