Você está na página 1de 40

TUTORIAL

Altera Quartus II

by Lucas Martins Guido


guido DOT lucas AT ieee DOT org

Versão Beta 1.0

Este Tutorial tem objetivo puramente educativo, sem nenhuma finalidade


lucrativa. Sua cópia para finalidades educacionais e pessoais, total ou parcial, é
totalmente permitida pelo autor.
Esse tutorial foi criado para finalidades educacionais, inicialmente com o objetivo
de auxiliar os alunos de EA773 – Laboratório de Circuitos Lógicos, na UNICAMP.
O software Quartus II que utilizei para a obtenção das imagens contidas neste
tutorial é a versão Web Edition que não requer licença.

Escrevi na forma de um passo-a-passo, que começa desde o download do


software e abrange a prototipagem do sistema digital, simulação em software e
dicas rápidas.
Não me preocupei em usar uma linguagem rebuscada e procurei durante o texto
todo colocar a informação de uma forma agradável.

No final desse tutorial você encontrar um FAQ com as perguntas mais frequentes
durante as monitorias. Possivelmente suas dúvidas futuras podem aparecer lá.

Meu objetivo é transmitir aos colegas um pouco da experiência que adquiri em


alguns semestres lidando com essa placa e software.
Dicas para melhorar esse material são muito bem-vindas.

Agradeço a todos que colaboraram para a criação deste tutorial, contribuindo


com dúvidas, incentivo e apoio.

Espero que ajude.

Abraços,

Lucas Martins Guido

06 de setembro de 2009

2
1. Download do Quartus II Web Edition e Instalação

A Altera disponibiliza uma versão do Quartus II Web Edition em seu site, sem a
necessidade de nenhuma licença comprada. Basta fazer o download e instalar no
seu PC.
Atualmente o link para download é esse:

https://www.altera.com/support/software/download/altera_design/quartus_we/d
nl-quartus_we.jsp

Após o download dos 1.31GB de programa, dois cliques para instalar.


Existem alguns detalhes que podem economizar um bom espaço no HD sem
prejudicar as funcionalidades necessárias para o programa, sabendo que nossa
placa de prototipagem usa uma FPGA Cyclone II da Altera.

No início da instalação, ao invés de escolher a opção de instalação completa,


opte por Custom.

Uma tela com opões será aberta. Nela existe a possibilidade de você não
selecionar uma série de arquivos de compilação, entre outros. Opte apenas pelas
seguintes opções:

Cyclone II support
Third-party EDA tool interfaces
Tutorial files

3
As demais opções podem ser todas desmarcadas. Caso queira, desmarque
também “Tutorial files”, o que implicará em abrir mão dos tutoriais que o help do
programa oferece.

Prossiga com a instalação até o fim. O programa não é muito leve, talvez a
instalação leve alguns minutos e PCs antigos (tomando como referência 2008)
podem rodá-lo com dificuldades.

Na primeira execução do programa será solicitado que o usuário escolha o


layout. Esse tutorial será montado utilizando o layout do Max+Plus II. Caso
tenha escolhido a opção Quartus II você pode alterá-la, como lembrado na
imagem abaixo.

A partir deste ponto irei me referir ao Quartus II como QII.

4
2. Conceitos Fundamentais

2.1 – Criando uma Pasta para o Projeto

Tanto o QII como diversos programas de engenharia usam o conceito de Projeto.


Um projeto é uma espécie de ambiente em que podemos desenvolver nosso
trabalho, executar simulações, compilações, etc. Arquivos que não estejam
relacionados ao projeto não serão levados em conta na simulação, muito menos
na compilação. Muitos erros ocorrem devido ao descaso com os arquivos do
projeto, que devem estar juntos em uma mesma pasta.

UM projeto, UMA pasta.

Isso não é um provérbio chinês, mas com certeza essa frase evita muitos
problemas.
O primeiro passo para começarmos um projeto no QII é criarmos uma pasta no
Windows para colocarmos os arquivos. Faça isso como de costume, escolha um
local (que pode ser um pendrive) no PC e crie uma pasta vazia. Arquivos .jpg
podem ser colocados nesta pasta sem problemas, porém prefira pastas vazias
para manter a ordem.

2.2 – O Conceito de Projeto

Criada a pasta é hora de darmos o primeiro passo no programa, criar o nosso


projeto. O projeto tem a seguinte estrutura: Uma página principal e diversas
auxiliares. Essas páginas são colocadas em uma espécie de árvore, o que forma
uma hierarquia. Não respeitar essa hierarquia de páginas resulta em um erro
muito comum, que citarei mais pra frente. Vamos entender a hierarquia das
páginas primeiro..

Imagine que desejamos criar um relógio digital com despertador. Já temos na


cabeça uma série de componentes que vamos usar, como o próprio relógio e um
comparador. Quando o horário for igual ao horário selecionado, o relógio vai
despertar. Precisamos indispensavelmente de um relógio e algum circuito que
faça essa comparação.
Vou dar um exemplo de uma hierarquia errada para esse projeto.

5
Como mostrado, a compilação é executa de forma ascendente, ou seja, o
arquivo principal será o último lido no processo de compilação.
Nesse exemplo o erro é evidente, vamos analisar.
Para um Relógio COM Despertador precisamos, claro, de um comparador.
Quando o programa ler o Relógio COM Despertador ainda não terá lido o
Comparador, ou seja, teremos problemas!
Existe uma forma de trocar de lugar o Comparador com o Relógio COM
Despertador, mas antes de aprendermos a consertar aprenderemos a fazer
direito.

O caso correto seria:

2.3 – Criando Projetos, Fechando Projetos, Abrindo Projetos...

Agora que temos os conceitos fundamentais para começarmos um projeto com


ordem, é hora de irmos para o QII.
O primeiro passo é criar um diagrama inicial.
File > New > Block Diagram / Schematic File

6
Na tela que foi aberta vamos desenvolver nosso projeto com as portas-lógicas,
componentes prontos (ALUs, contadores, flip-flops, etc) e componentes que
vamos criar.

Antes de qualquer coisa, hora de criar o projeto.


File > Save As

Na hora de salvar este projeto, escolhemos a pasta que criamos para tal.
Nomeamos o arquivo com qualquer coisa que nos lembre do que se trata o
projeto e alguma sinalização de que ele é o nosso arquivo principal, ou seja, o
Relógio COM Despertador do exemplo anterior.
Para indicar isso, usei _main no final do nome.
Perceba que abaixo do nome e do tipo do arquivo temos uma opção que já está
selecionada, que diz: “Criar um novo projeto baseado neste arquivo”. Claro que
sim, é exatamente o que queremos.
Após você clicar em Save uma janela vai aparecer, aperte uma vez Next e depois
aperte Finish.
Nosso projeto já está criado.

Atenção! Não crie outro projeto nesta pasta.

7
Mas e se eu quero usar um circuito do projeto X no projeto Y?

Abra o projeto X, copie o circuito com o Ctrl+C, feche o projeto Y, abra um novo
diagrama (File>New>Block Diagram/Schematic File), copie o conteúdo com
Ctrl+V e salve.

Para abrir e fechar projetos vá em:


File > Open Project
File > Close Project

Atenção! Quando você for abrir seu projeto para trabalhar nele, antes de abrir
qualquer esquemático, abra o projeto. Assim, a primeira coisa a se fazer quando
queremos abrir o QII para continuar um trabalho é File>Open Project. Somente
depois File>Open para escolher o esquemático com qual queremos lidar.

2.4 – Ambiente de Trabalho

Conceitos prontos, hora de conhecermos o ambiente de trabalho. Abrimos um


esquemático, criamos o projeto, precisamos colocar algo nele.

Usarei um Detector de RA como exemplo nesse tutorial. Falaremos dele mais pra
frente.

Vamos dar uma olhada no menu lateral.

Esse é o ambiente de trabalho em que ficaremos a maior parte do tempo.


Acostume-se com ele, possivelmente o verá por várias horas.
Na esquerda temos as ferramentas. Numerei as mais importantes para explicá-
las com detalhes.

8
1. Ferramenta de Seleção – É a setinha do Windows, clique e arraste para
selecionar.
2. Seleção de Componentes – Clicar nessa ferramenta ou clicar duas vezes
na área branca ao lado das ferramentas surte o mesmo efeito. Uma tela se
abrirá e nela selecionaremos o componente desejado para adicionar ao
esquema.
3. Fio – Aqui você não pica fio, você liga os fios, cria os fios.
4. Ligação Constante – Esse botão não é bem uma ferramenta, é uma opção.
Selecionar ela garante que todas as conexões fiquem firmes, como se fossem
fios elásticos. Suponhamos que eu tenho uma ligação entre a saída de um
componente A e a entrada de um componente B, e por motivos estéticos
quero distanciar B de A. Com essa opção selecionada, o fio vai continuar
ligado entre os componentes, esticando automaticamente quando eu
distancio os componentes. Sem esta opção, eu vou tirar um componente de
perto do outro e o fio se manterá como estava, ou seja, a ligação será
desfeita e teremos um fio com um lado ligado ao vazio. Muitíssimo útil para
não desligar o que queremos manter ligado, mas cuidado! Quando movemos
componentes é possível, sem querer, curto-circuitar fios no caminho sem
que percebamos, por isso muita atenção.
5. Seleção Parcial – Essa opção permite a seleção de apenas um pedaço do
fio, sem ter que selecioná-lo inteiro. Caso haja um fio que desejemos apagar
apenas sua ponta, com essa opção selecionada deletamos apenas a ponta do
fio. Sem essa opção, teríamos que deletar o fio todo e criar um novo.
6. Zoom – A ferramenta da lupa não é novidade para ninguém. Com ela
selecionada, clique na tela com o botão esquerdo para aumentar a imagem,
com o botão direito para diminuí-la.

No topo da tela há o menu de opções. Já usamos o File, usaremos diversos


outros. Conforme necessidade, vou explicando.

9
3 – Mão-na-Massa - Detector de RA como Exemplo

3.1 – Montando o Esquema Elétrico

Esse é um dos primeiros experimentos do laboratório.


A idéia é projetar um circuito combinacional que tenha como entrada os números
de 0 a 9 e na saída, 1 para algarismos detectados e 0 para não detectados.
Meu RA é 071580, ou seja, terei 1 na saída para as entradas 0 1 5 7 8 e 0 na
saída para as entradas 2 3 4 6 9.

Neste turorial usarei indicarei os bits como ABCD...KLMNOP, sendo o A o mais


significativo. A’ significa A barrado, A negado.
Z é a saída e em caso de mais saída, Z1 Z2 Z3 ... ZN com Z1 como a mais
significativa.
Minha expressão lógica ficou: Z = DB + D’A + C’B’A’

Vou usar as ferramentas citadas e criar o circuito lógico.


A única informação que falta para você é onde encontrar as portas-lógicas. Basta
clicar duas vezes no fundo da tela ou na ferramenta Seleção de Componentes e
seguir conforme a imagem abaixo.

10
Em Name você pode digitar o nome do componente, isso ganha tempo ao invés
de ficar procurando manualmente.
Tente fazer isso digitando 74194, dff, and3. A regra para memorizar é simples:
XXff leva aos flip-flops, onde XX é o tipo do flip-flop.
YYYK leva as portas-lógicas, onde YYY é o tipo da porta (and, or, xor) e K é o
número de entradas.

Abaixo segue a minha montagem inicial:

Observe que as portas estão devidamente colocadas e ligadas. Falta visivelmente


especificar as entradas e saídas, quem são A B C D e Z.
Aqui é um ponto importante, onde surge um grupo componentes que só existem
no programa: Os inputs e os outputs.
Naquela janela onde selecionamos componentes está a área Name, como dito
anteriormente. Digite lá input para selecionar entrada e output para selecionar
saída. Finja que são componentes que você liga nas entradas e saídas.

11
Veja como fica a montagem:

Agora temos as saídas e entradas especificadas. Para mudar o nome das


entradas e saídas basta dar dois cliques nelas.

Observe que onde os fios se ligamos temos ou um quadrado ou um bolinha.


Onde não há ligação os fios passam reto. Muita atenção nisso, conexões podem
ser criadas quando movemos os componentes e, caso isso passe desapercebido,
problemas ocorrerão.
Um X indica o fim do fio.

Existe também a possibilidade de se trabalhar com barramentos (coletivo de fio)


no QII. Devido a complexibilidade em se fazer isso nesta interface gráfica e ao
número de erros que já tive tentando isso, não vou citar esse método aqui. Para
mais detalhes use os tutoriais do programa ou pesquise na internet.

12
3.2 – Compilando

Compilando veremos se nossas ligações estão corretas, se não fizemos nenhuma


lambança estrutural.
Vamos compilar o projeto do RA.

Primeiramente, antes da compilação em si, precisamos selecionar para qual


FPGA compilaremos este projeto. No nosso laboratório usamos uma placa com a
FPGA Cyclone II EP2C20F484C7. Você pode observar esse modelo olhando na
própria placa. Mencionarei isso novamente com mais detalhes.
Para escolher o dispositivo seguimos o caminho:

Assignments > Device

Na tela que abre, selecione a família Cyclone II e o dispositivo EP2C20F484C7.

Uma vez selecionado o dispositivo, estamos prontos para compilar.

Max+Plus II > Compiler

Na tela que surge, aperte Start. Uma barra verde começará a andar mostrando a
porcentagem de compilação concluída. Ao clicar no Start o programa perguntará
se desejamos salvar o projeto. Se você pretende compilar é necessário ter o

13
projeto salvo antes, então opte por sim. Caso esteja inseguro, faça um backup
antes de compilar.

Caso a compilação transcorra sem problemas, teremos nessa parte de baixo da


tela várias mensagens em verde e alguns Warnings.

Dica: Esqueça os Warnings. Eles dizem diversas coisas sobre capacitâncias,


realimentação, etc. Isso não significa que ocorrerá um erro, mas sim que em
uma montagem completa (como a criação de um circuito integrado dedicado)
seriam fatos importante a se pensar. No nosso caso, simulação e prototipagem
simples, não influenciará no resultado. Como você não está na AMD (ainda) e
nem quer transformar seu atual projeto em um circuito integrado para ser
vendido pelo mundo (ainda), deixaremos os Warnings para depois.

Caso ocorresse algum problema a simulação não terminaria, e o programa


acusaria os problemas. Vou criar um erro muito comum, ligarei duas saídas de
duas portas diferentes em uma mesma entrada de uma terceira porta. Eu teria
que usar pelo menos um OR2 no caminho, mas não farei isso propositalmente.
Vamos ver o resultado na compilação.

14
Perceba que a compilação não terminou e o programa nos apontou erros. Ele deu
a dica que o problema pode estar em inst3. Essas marcações instX você pode ver
no desenho das portas no esquemático. Diga-se de passagem, inst3 é o
componente em cuja entrada implantei o erro.
Essas mensagens podem ajudar muito na hora de achar os erros de montagem.
Corrigir erros e fazer montagens melhores é uma questão de experiência, com o
tempo você vai pegando o jeito.

É importante lembrar que o fato de a compilação terminar sem problemas


significa que você construiu um projeto ESTRUTURALMENTE decente. Isso
significa que, do ponto de vista de ligações e hierárquico, você não cometeu
erros.
Porém NADA até agora garante que o seu projeto vai funcionar como você quer.
Se você projetou errado o que você terá agora é um circuito corretamente
montado que faz a coisa errada.
Atenção sempre! É por isso que engenheiros fazem máquinas, e não ao
contrário.

15
3.3 – Simulando

Essa é a hora da verdade. É preciso saber se o que fizemos tem o funcionamento


esperado.
Um erro aqui significará OU que você projetou errado OU que você fez ligações
incorretas.
Lembro que para simular é necessário anteriormente ter compilado.

Vamos abrir a tela de simulações, o Waveform.

Max+Plus II > Waveform Editor

Teremos a seguinte tela então:

Temos então um novo menu lateral, uma aba onde ficarão os pinos (inputs e
outputs) que serão testados e, na direita da tela, a linha do tempo. Essa mira na
tela não existe, eu coloquei ela ai e você já saberá porquê.

Primeiro vamos inserir os pinos que serão testados. Para isso clique nas
proximidades da mira com o botão direito. Surgirá uma telinha, onde você fará o
seguinte caminho:

16
Insert > Insert Node or Bus…

Aparecerá uma nova tela:

Clique em Node Finder…

Sua tela abrirá um pouco diferente dessa de cima. Inicialmente teremos as duas
telas (Nodes Found e Selected Nodes) em branco.
O primeiro passo é, onde indiquei na imagem com o número 1, selecinar “Pins:
all”. Após isso, clique em List. Na janela da esquerda aparecerão todos os pinos.

17
Você pode selecionar só os que deseja que apareçam na simulação e apertar o
botão > ou, caso queira simular todos os pinos (que é o nosso caso aqui) clique
em >> marcado na imagem pelo número 3.
OK duas vezes, voltamos a nossa tela de simulação. Agora ela está um pouco
diferente, vamos ver:

Temos agora os pinos listados, na figura vemos o B selecionado. As estradas


estão em 0 e a saída ainda não foi simulada, por isso está “riscada”.
Apontado pelo número 7 temos um indicador que podemos mover. Ele faz com
que visualizemos o tempo em que ele está colocado. Caso não seja desejável
usá-lo, basta colocá-lo no tempo zero (lá no início) e fingir que ele não está ai.

Indicado com o número 6 está o tempo final da simulação. Caso ele seja
pequeno ou grande demais, além da nossa vontade, podemos mudá-lo. Isso será
feito daqui a pouco. Procure manter esse tempo máximo em sua memória, ele
será necessário para referência várias vezes.

Vamos agora entender o menu lateral.

Na lateral temos um menu que só é ativado quando escolhemos um pino. No


exemplo, escolhi o pino B.
Como o pino B é um pino de entrada (input) temos que atribuir um valor a ele.
Esse valor pode ser 1, 0, uma onda oscilante periódica como um clock ou algo
aleatório. Caso eu tivesse agrupado A B C e D (ensinarei isso mais adiante)
poderia fazer com que eles fossem uma contagem de 0 até 15.
Meu objetivo é que você perceba que, em uma simulação, quem manda na
entrada é você.

Utilizarei os números da imagem acima para explicar algumas coisas aqui.

18
3.3.1 – Alterando o valor de uma entrada para 0 ou 1

Posso fazer isso individualmente ou em grupo. Para tal, selecionamos uma


entrada ou, com CTRL apertado, mais do que uma.
Para forçar um 1, clicamos no botão indicado pelo número 3. Para forçar 0,
clicamos no indicado por 2.

3.3.2 – Fazer com que uma entrada tenha o comportamento de Clock

Selecionamos o pino desejado e então pressionamos o botão indicado por 5. Veja


que há um pequeno relógio (clock) do lado do botão. Ao clicarmos nele teremos
uma tela, é importante interpretá-la bem.

Start e End time dizem onde começam e terminam as oscilações. Não confunda
isso com período. Não esqueça que o End Time não pode ser maior que o tempo
de simulação.
Logo abaixo temos a seleção de período. Deixe o Offset em ZERO, Duty Cicle em
50% (o que significa metade do tempo em 1, metade em 0) e ajuste o período.
Tome muito cuidado com o período escolhido para que ele não seja muito lento
(e o tempo de simulação não seja suficiente para tudo) e nem muito rápido (para
que o tempo de atrase se torne um problema).
Mais sobre tempo de atraso na parte 6 desse Tutorial.

Ajustados os parâmetros, observe o comportamento oscilatório no pino


selecionado.

19
3.3.3 – Agrupando entradas e atribuindo valores automaticamente

Essas duas coisas vem juntas pois assim se tornam muito eficientes.

Vamos voltar a pensar na nossa situação, um projeto de Detector de RA. Eu


tenho 4 entradas e estou interessado em valores que vão de 0 a 9 na entrada.
Existem diversas formas de eu colocar esses valores na entrada.
A primeira é colocando em cada uma um clock distinto, sendo que cada entrada
tem o dobro da frequência da anterior. A segunda forma é manualmente,
utilizando o botão indicado pelo número 1.

Particularmente eu gosto da opção de agrupar as entradas e fazê-las contar


automaticamente. Além de visualmente ficar mais organizado, existam muitas
saídas ou poucas, o trabalho é o mesmo.

Primeiro selecionamos, com CTRL apertado, as entradas A B C e D. Em seguida


clicamos no botão indicado por 4, que tem inclusive um C (de count) ao lado.
Clicar com o botão direito sobre as entradas e selecionar Group surtirá o mesmo
efeito.
É importante ressaltar que a entrada mais acima na tela será a mais significativa
no agrupamento. No nosso caso A é a mais significativo e está mais acima da
tela. OK. Caso D estivesse mais acima, teríamos um problema na interpretação
dos resultados. A solução seria arrastar o pino D para baixo e ordenar tudo
conforme desejado, bastante simples. Para fazer isso clicamos no desenho ao
lado esquerdo do nome do pino e arrastamos ele para onde desejamos.

Ao agrupar e clicar no botão de agrupamento, surge a tela que segue.

20
Aqui escolhemos o nome do grupo e o tipo de contagem.
Vou dar ao grupo o nome de RA e vou escolher uma contagem do tipo Unsigned
Decimal, ou seja, decimal sem sinal.

Observe que RA agora é um agrupamento de entradas. A está por cima, logo é a


mais significativa. D está por baixo, logo é a menos significativa.

Se desejado for desagrupar, basta clicar com o botão direito no agrupamento e


selecionar Grouping > Ungroup.

Agora que temos um agrupamento, queremos atribuir a ele uma contagem


automática.
Iniciamos clicando sobre o agrupamento RA e depois, novamente, no botão com
o C ao lado (que fica na esquerda da tela, usado para agrupar o conjunto).
Surgirá então uma tela com duas abas.
Vou colocar aqui abaixo as duas abas.

21
Na tela da esquerda temos que a contagem é binária, será mostrada como
decimais sem sinal, começa em 0 e é incrementado de 1 em 1.
Na tela da direita temos que a contagem começa em 0 e termina em 1us, o
tempo máximo da nossa simulação.
Os valores da contagem vão mudar a cada 40ns.

Podemos observar que, de fato, ocorre uma contagem automática. As entradas


de A até D estão variando até seu máximo possível (15 para 4 bits) e depois
retornam ao 0, onde continuam com o mesmo comportamento até 1us.

22
Já sabemos como manobrar as contagens, agora vamos de fato simular nossa
saída. Temos as entradas contando até 9, daí pra frente é Don’t Care.
Esperamos 1 em 0 7 1 5 8 e 0 no resto até 10. A partir de 10, seja o que for que
der na saída, não importa.

O primeiro passo para a simulação é salvar essa tela do Waveform. Basta clicar
em salvar e pronto.

Agora vamos ao simulador.

Max+Plus II > Simulator

A tela que se abre é essa.


Fique de olho no nome do arquivo de waveform que será simulado. É comum em
projetos maiores termos mais de um .vwf, muitas vezes você pode achar que o
projeto tem problema pois está simulando o arquivo .vwf errado. Cuidado!
No local onde selecionamos o tempo de simulação, certifique-se de não
extrapolar o tempo máximo e nem simular muito mais do que o necessário.
Na região Simulation Option, selecione as opções conforme a imagem acima.

23
Tudo pronto, “Start”.

Após a simulação ocorrer, se não houver problemas, clique fora ou clique em


Open. O programa fará uma pergunta, concorde com ele.

Eis que onde antes estava meio “riscado” no waveform (a saída Z) agora temos
informação. Vamos ver o que obtivemos.

Obtivemos, de fato, o que nós queríamos. Lembro que usei 10 em diante como
Don’t Cares.

Pergunta: Por que temos esse pico entre o 3 e o 4 e por que a saída está um
pouco deslocada da entrada? Explicarei brevemente mais adiante.

24
4 – Criando Componentes – Relógio Despertador como Exemplo

Você pode usar muitos componentes e circuitos integrados prontos, todos


disponível pelo programa.
Agora e se você é um aspirante a engenheiro(a) que quer um pouco mais de
emoção? Você quer fazer seus próprios componentes!

Muitas vezes, mais do que um luxo, isso é uma necessidade. Para montagens
muito grandes colocar tudo em uma tela apenas é inviável. Fica praticamente
impossível saber quem é quem em um mar de fios e portas.
Fazer seus componentes torna a montagem muito mais limpa e profissional.

Vamos fazer isso com o exemplo do Relógico com Despertador.

Primeiramente salvamos nosso trabalho anterior e fechamos o projeto.


File > Close Project

UM projeto, UMA pasta.

Criamos uma pasta nova.

Assim segue. A diferença é que aqui vamos criar 3 esquemas elétricos ao invés
de 1.

Para criar um componente, abra uma folha em branco. Obviamente não vamos
criar um componente da folha principal, não faz sentido.

Na folha correta, fazemos o circuito. Dele queremos fazer um componente. Com


essa folha na tela, seguimos o caminho:
File > Create / Update > Create Symbol Files for Current File

Salve com o nome que desejar e pronto. Lembro que o componente vale apenas
para esse projeto.

Caso queira fazer alterações no componente, altere o esquemático que usou para
gerá-lo e salve.
File > Create / Update > Create Symbol Files for Current File

Se você fez alterações em um componente e já o tinha usado em outras folhas,


vá nessas folhas e clique no fundo branco com o botão direito. Existe uma opção
chamada Update Symbol or Block. Clique nela e selecione para atualizar todos.
Faça isso para todas as folhas que tiverem o componente desatualizado.

Muitas vezes criamos um componente e ele fica com os pinos em locais


indesejados. Podemos resolver isso remanejando os pinos. Vá em Abrir e em
Files of Type coloque All. Os arquivos .bsf são arquivos de componentes, abra
um e verá na tela apenas o desenho externo do componente criado.
Divirta-se ai, mas cuidado para não remanejar pinos e esquecer os nomes em
lugares errados.

25
Segue abaixo algumas telas do relógio com despertador, usando componentes
customizados.

26
27
5 – A Placa e a Gravação

Temos um projeto pronto e provavelmente testamos ele anteriormente, se isso


for viável.
Máquinas de estado geralmente dão mais trabalho para serem simuladas do que
testadas em hardware, já um detector de RA pode ser muito rapidamente
simulado.
A escolha das ferramentas fica a cargo do projetista, você escolhe o que vai
usar.

A placa disponível no laboratório consiste em uma FPGA ligada a diversos


periféricos que ajudam no ensino, como LEDs, botões e chaves. Cada um desses
dispositivos está ligado a um pino da FPGA, que por sua vez possui um endereço.

É interessante saber o que é uma FPGA e como ela funciona. Não vou me
prolongar muito aqui sobre isso, mas muito conteúdo sobre isso pode ser achado
na internet. Uma introdução interessante pode ser achada na Wikipédia, sempre
com melhores conteúdos em sua versão inglesa.

5.1 – A Placa

A placa disponível no laboratório é a seguinte:

Observe que temos diversas opções nela, inclusive saídas para áudio e vídeo. No
curso de EA773 usaremos apenas os LEDs, displays, botões e as chaves.

28
Com esta vista de cima do equipamento observamos um botão vermelho que fica
na parte de cima, na esquerda. Ele liga e desliga a placa. É óbvio, mas vale
lembrar que não pode-se gravar nada com a placa desligada.

A FPGA é o maior circuito integrado da placa, com a volta verde. Nela está
marcado sua família (Cyclone II) e o modelo, no caso EP2C20F484C7.

A ligação entre placa e computador é feita através do cabo USB.


O USB é capaz de fornecer energia para o funcionamento da placa, inclusive se
você ligá-la somente no USB provavelmente ela vai funcionar. Porém caso você
de alguma forma drene mais corrente do que o USB pode fornecer, a saída do PC
pode ser danificada. Para evitar riscos, ligue também a fonte da placa na
tomada. Isso garante que a energia seja fornecida pela rede elétrica evitando
maiores problemas.

Cada periférico da placa tem um endereço de acesso.


Por exemplo, queremos ligar a saída do detector de RA em um LED. De alguma
forma precisamos relacionar o pino de saída ao endereço do LED da placa. Ao
fazermos isso e compilarmos o projeto, aquela saída virtual será na verdade
direcionada eletronicamente para uma saída física, exatamente a do LED.
Nenhum tipo de preocupação com corrente e tensão precisa ser tomado, o
pessoal da Altera já deu conta de tudo. Basta fazer as associações.

Existe também, embutido na placa, três fontes geradoras de clock.


As frequências são 24MHz, 27MHz e 50MHz.
Colocar um frequência dessa em um LED, visualmente, é como deixá-lo aceso.
Um pisca-pisca é uma luz acesa (para os olhos humanos) quando pisca mais que
24 vezes por segundo, ou seja, mais de 24Hz. Isso é uma média, mas serve para
alertar que deve-se tomar cuidado com a frequência dos LEDs.

Para maiores detalhes sobre a placa você pode ler o manual dela. No final dessa
parte do tutorial vou colocar os endereços mais utilizados, para referência rápida.

5.2 – A interface Hardware e Software

Até agora nos preocupamos em garantir um bom projeto no QII. Criamos o


projeto, montamos os esquemas, fizemos simulações. Agora resta uma ação,
prototipar nosso projeto na placa de desenvolvimento. Basicamente iremos
transferir nosso projeto para a FPGA, que garantirá o funcionamento dele como
se o tivéssemos montado com circuitos integrados TTL em um protoboard.
Além desse processo ser muito mais rápido, podemos nos despreocupar com a
montagem física e seus possíveis problemas (interferências, ruídos, mal-contato)
e focar a atenção no resultado do projeto.

O primeiro passo é ligar nossas entradas e saídas a pinos reais da placa,


associando endereços a elas, como eu já disse anteriormente.

Mas antes disso, compile!

Antes de começarmos a fazer qualquer coisa é necessário compilar o projeto.


Aqui é imprescindível termos a certeza de que escolhemos a família da FPGA e o
modelo corretamente. Compilar para uma família errada e tentar gravar é como

29
tentar colocar diesel em um fusca, ou um cartucho de Super Nintendo no drive
de CD. Simplesmente as coisas não irão combinar.

Tendo essas certezas garantidas, vamos fazer o seguinte caminho:


Assignments > Pins

Essa é a tela que esperamos. À direita um desenho ilustrativo onde temos a


família e o modelo da FPGA, uma boa hora para conferir se estamos no caminho
certo.
Na parte de baixo temos todos os nossos pinos e, ao lado deles, diversas opções.
Muito dessa tela nunca usaremos, podemos até dar uma enxugada nela. Clicando
com o botão direito nessa região da tabela (parte de baixo da tela) surge a
opção Customize Columns. Nela, tire tudo menos Node Name e Location.

Vamos associar os pinos do exemplo do Detector de RA. O primeiro passo é ir


para o manual (ou a referência rápida no fim desse tutorial) e procurar o
endereço do que queremos ligar. No nosso caso, queremos que as entradas
sejam 4 chaves e a saída 1 LED.

Abrindo o manual veremos que o endereço de um LED verde, o LEDG7 é,


PIN_Y21.

30
Você pode ver os nomes olhando na placa. Perceba que na parte de cima, à
esquerda da imagem, temos o LEDG7

Vamos então para a tabela da página de associação de pinos. Queremos Z no


LEDG7.
Para isso, clico na célula Location ao lado do pino Z e digito Y21. Veja que o
programa já insere PIN_.

Para ligar as entradas A B C D nas chaves (switches) vamos pegar o endereço de


4 chaves no manual.

Usaremos SW3 para A, SW2 para B, SW1 para C e SW0 para D.

Vejamos como fica a tela com os pinos associados.

31
Agora que os pinos já estão endereçados, feche essa tela.
Retornando à tela dos esquemáticos, compile novamente o projeto.

32
5.2 – A Gravação

Chegou a hora de gravar a placa e testar o que fizemos.


Não esqueça de compilar o projeto novamente APÓS associar os pinos aos seus
endereços físicos.

Certifique-se de que o USB e a fonte estão conectador.


Ligue a placa !!

Max+Plus II > Programmer

Primeiro certifique-se de que a opção Program/Configure está selecionada.


Depois clique em “Hardware Setup...” e onde está “No Hardware” selecionamos a
opção referente ao USB.
Caso a opção USB já estiver selecionada, ótimo.

Tudo pronto, clique em Start.

A gravação é bastante rápida. Quando ela terminar, o projeto já está gravado.


Tire os olhos do monitor, volte-se para a placa. Seu projeto já está lá.

BOA SORTE !!

33
6 – FAQ

6.1 – Por que a onda da saída está um pouco para a direita em relação às
entradas?

Perceba que a saída Z é modificada um pouco depois da mudança das entradas.


Pensando de forma ideal essa mudança na saída deveria ocorrer ao mesmo
instante que as entradas fosse modificadas.
Assim como você deve lembrar de um dia ter aprendido em Circuitos Lógicos,
toda porta-lógico possui um tempo de propagação, um atraso. Esse tempo
representa quanto tempo demora para que um sinal na entrada seja interpretado
pelo circuito e a resposta se encontre na saída.

Os motivos pelos quais isso ocorre fogem do interesse desse tutorial, mas podem
ser entendidos estudando-se a eletrônica interna de cada porta lógica,
principalmente da tecnologia dos transistores envolvidos.
Como podemos observar na imagem, o tempo de atraso da FPGA que usamos é
aproximadamente 10ns.
Em termos engenheiros, não dizemos que ondas vem antes ou depois, mas sim
que elas estão defasadas de uma determinada quantidade.

Muitas vezes acima eu tive o cuidado de lembrá-lo que nenhum tempo de


transição do circuito deve ser muito próximo do tempo de atraso, senão a
veracidade dos dados na saída serão comprometidas.
Exemplo: Imagine que minha contagem, no detector de RA, fosse efetuada a
cada 9ns. O que eu estaria lendo na saída? Quando minha porta começasse a
colocar o dado na saída eu já teria outra coisa na entrada, e tudo começaria a se
encavalar. Para poucas entradas isso é gritante, mas para diversas entradas que
mudam em tempos diferentes, o cuidado com o tempo de atraso deve ser ainda
maior! Sempre preciso ter a certeza que leio minha saída um tempo de atraso
(ou mais) depois da minha última entrada ter sido colocada devidamente.

Por isso, lembre sempre de manter suas oscilações com períodos maiores que 3
vezes o tempo de atraso, pelo menos. Como não estamos nos preocupando aqui
com a velocidade, coloque umas 10 vezes. Isso faz com que o atraso, até
visualmente, fique despresível.

34
6.2 – O que são esses picos que ocorrem, às vezes, nas transições?

Esse pico é feio, mas vou te mostrar como ele é miserável. Olhando assim não
vemos a dimensão da coisa, mas vamos dar várias ampliadas.

Olhe só o pico amplicado. Repare no eixo do tempo para calcularmos a largura


dele. Ele mede um pouco menos do que 0.280ns, ou seja, 280 ps (pico
segundos).
Está convencido de que ele é muito pequeno?

Isso ocorre, novamente, devido a eletrônica interna das portas. Esse tipo de
fenômeno sempre ocorre nas transições.
Isso é mais um motivo para você não trabalhar muito próximo do tempo de
atraso. Quanto maior o tempo que o dado fica na saída, menos significativo é o
ruído e menor a chance dele ser lido como um dado.

6.3 – Como aumento o tempo máximo nas simulações?

Várias vezes foi citado que o tempo máximo não pode ser extrapolado, porém
muitas vezes ele é pouco para as nossas necessidades. Surge então a
necessidade de aumentálo.

Edit > End Time...

6.4 – Não compila e aparece que o problema é a hierarquia.

Primeiro você precisa ter certeza que não está com dois projetos na mesma
pasta, que não apagou o que não devia e colocou outra coisa em cima. Se você
suspeita disso, vale mais a pena criar um projeto novo e ir copiando e colando o
conteúdo dos esquemas.

Para mudar o arquivo principal na hierarquia, selecionando outra folha como


folha principal, faça o seguinte:
1- Abra na tela o arquivo que você quer colocar como principal (no exemplo o
Relógio COM Despertador)
2- Project > Set as Top-Level Entity

Isso pode resolver a maioria dos casos. Se não resolveu, crie outro projeto e
copie e cole o conteúdo dos esquemas.

35
Importante! Não copie e cole arquivos, copie e cole o conteúdo dos esquemas.
Existe sim como copiar os arquivos, mas já que o objetivo é consertar erros é
melhor arriscar o mínimo possível.

6.5 – O nome do meu projeto é Projetão da Moçada e não compila, por


quê?

Simples, nunca use em programas de engenheria ~ / * ç <espaço> nem nada de


estranho. Se possível evite letras maiúsculas também.
Existem programas que aceitam, outros não. Então na arrisque e evite dor de
cabeça desnecessária.

No caso do QII você pode usar letras maiúsculas.

6.6 – Tenho 200 entradas que ficam em 1 sempre, mais 200 que sempre
ficam em 0.. Quando coloco no Waveform fica uma bagunça. Já que eu
não tenho que mudar elas sempre, tem algo mais prático a ser feito?

Sim, com certeza.


Vá onde selecionamos componentes e digite vcc ou gnd. Vcc é sempre 1, gnd é
sempre 0. Ligue-os onde quer manter 1 ou 0 sempre e pronto.

6.7 – Fui no TTL HandBook e justamente a página que eu queria não


estava lá.. O que faço?

Você pode procurar a página perdida com alguém no laboratório, ou ir prevenido.

http://www.alldatasheet.com/

Esse site é muito eficiente, basta ir na busca e digitar o código do componente,


por exemplo 74194, bc548.

Fique atento pois os datasheets de componentes trazem muita informação,


muitas vezes muito mais do que você precisa. Caso queira apenas as
funcionalidades do circuito, dificilmente você vai precisar mais do que as duas
primeiras páginas. Por isso não saia imprimindo tudo logo de cara.

Vale lembrar que eu nunca vi um datasheet em português.

6.8 – Sumiram as ferramentas do Waveform.

Tools > Customize Waveform Editor...

6.9 – No simulador, os pinos não aparecem.

Compile e insira os pinos.

36
6.10 – Simulei anteriormente, inseri e tirei alguns pinos, quero simular
novamente. Compilo e quando abro o simulador só tenho pinos antigos.
Que fazer?

Isso é normal. Delete todos os pinos da lateral e insira-os novamente, como se


fosse a primeira vez que você abriu essa tela.

6.11 – Sumiram as ferramentas da área de trabalho.

Tools > Customize Block Editor...

6.12 – Estou na tela de associação de pinos com endereços, para


gravação. O problema é que minha tela não mostra, na parte de baixo,
os pinos do meu projeto.

Se aparece o local onde os pinos deveriam estar, mas não estão.. Compile o
projeto e abra a tela de associação novamente.
Caso o local onde os pinos deveriam aparecer simplesmente não está lá, ainda
nessa tela siga o caminho:
View > All Pins List

6.13 – Estou na tela de associação de pinos com endereços, para


gravação. O problema é que minha tela não mostra, ao lado dos pinos do
meu projeto, a coluna Location.

Clique com o botão direito nessa “tabela” e vá para a opção Customize Columns.
Insira Location na sua tabela.

6.14 – Estou na tela de gravação mas não consigo gravar.

Provavelmente se você olhar na parte superior dessa tela verá escrito No


Hardware.
Clique no botão Hardware Setup... e escolha a opção referente ao USB.

Se o cabo USB estiver desconectado você não ira conseguir.

6.15 – Usei o clock da placa e todos os meus LEDs ficam acesos.

Como eu expliquei anteriormente, para que você veja com clareza o piscar dos
LEDs é preciso que eles pisquem em frequência muito baixa.
Para diminuir a frequência do clock divida-a várias vezes. Um componente que
ajuda muito nesse tipo de serviço é o freqdiv.

37
7 – Referência Rápida aos Endereços dos Periféricos

Aqui coloco as tabelas de endereços que você pode ver no manual. As imagens e
a tabelas abaixo foram feitas pelo pessoal da Altera, crédito a eles.

LEDs

38
Displays

39
Switches (Chavinhas)

Botões

Clocks

40

Você também pode gostar