Com este post vou introduzir a ferramenta Quartus II da Altera para vocês e mostrar um pouco do que ela pode fazer. É possível fazer todo o tutorial com ferramentas gratuitas.
O artigo foi escrito tendo como base o kit BeMicroSDK mas não é necessário ter o Kit para realizar as atividades. Quem quiser comprar o kit direto da arrow é só clicar neste link
Para começar você pode fazer o download do Quartus II direto do site da Altera 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.
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.
Após realizar terminar a instalação inicie o Quartus II e você vai se deparar com uma tela igual a da Figura 2
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, o top do projeto é o arquivo .vhd com o maior nível de hierarquia, é a partir dele que o FPGA se conecta com o mundo externo (pinos de I/O) e a partir dele que são instanciados os outros arquivos .vhd.
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.
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.
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 50 milhões, 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.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
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.
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.
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 9. Na Figura 10 basta clicar em start e pronto! Seu kit está rodando o seu design e o primeiro LED irá piscar a cada segundo, a não ser quando for segurado o botão User que é o reset.
Na Figura 11 o resultado desta experiência.
Toda dúvida é bem vinda, fiquem a vontade para comentar.
Abraços!
Obrigado pelo post, acabei de usá-lo para fazer o hello world com minha primeira placa fpga 🙂
Qual a vantagem de se utilizar fpga em comparação os pic por exemplo? Não estou sendo irônico é que gostaria de saber se algum dia deveria mudar….
Khelen são propósitos completamente diferentes hehe, um FPGA é muito mais potente do que um PIC e você desenvolve hardware com ele, você não faz um programa que roda em um FPGA, você faz um hardware que executa seu algoritmo.
Como nós vimos aqui https://embarcados.com.br/fpgadualcores/ um FPGA consegue mais througput do que muitos processadores i3/i7.
Existem FPGAs bem baratos que concorrem em preços com um PIC mas sinceramente se você consegue executar o que você quer com um PIC não há necessidade de se utilizar FPGA, FGPAs normalmente são utilizados para aplicações de alto valor agregado e muito poder computacional.
Legal! Bom saber! Mesmo que eu nunca trabalhe com fpga quero fazer pesquisas sobre, interessante.
Khelen aqui tem um post que fiz no meu antigo blog pessoal sobre FPGAs com preço semelhantes a microcontroladores mas mantenho a minha posição, são aplicações distintas.
https://www.andrecastelan.com.br/2013/09/fpgas-substituindo-microcontroladores.html
FPGA é bom d+, um pouco + caro que os microcontroladores.