SlideShare uma empresa Scribd logo
1 de 118
Agosto de 2013
Fundamentos de VHDL
em Lógica Programável v1.1
Fundamentos de VHDL
em Lógica Programável v1.1
Eng. Alcides Silveira Costa
2 Fundamentos de VHDL em LP
v1.1
Objetivos
 Aprender e aplicar as construções básicas da
linguagem VHDL
 Obter experiência prática em ferramentas
comerciais de desenvolvimento em lógica
programável (LP)
 Compreender o uso de testbenches para a
verificação de circuitos digitais
 Identificar ASICs, FPGAs e CPLDs
 Entender a arquitetura de dispositivos lógico
programáveis
3 Fundamentos de VHDL em LP
v1.1
Agenda
 Dia 1
 Introdução
➢ Somador
➢ Decodificar 2 para 4
 Dispositivos Lógico
Programáveis
 Circuitos combinacionais
➢ Display de 7 Segmentos
➢ Unidade Lógica
➢ Unidade Lógica Aritimética
 Dia 2
 Circuitos sequenciais
➢ Contador Binário
➢ Registrador Circular
➢ Contador BCD
 FSM* em VHDL
➢ Contador Controlado
➢ Multiplicador
Fundamentos de VHDL em LP
v1.1
IntroduçãoIntrodução
Dia 1
5 Fundamentos de VHDL em LP
v1.1
Neste módulo você vai ...
 Aprender a história da criação da linguagem
 Entender a descrição de um somador em VHDL
 Criar projetos no Quartus II da Altera
 Passar por todas as etapas do fluxo de projetos no
Quartus II
 Descrever um decodificar 2 para 4 em VHDL
 Entender o básico de síntese, simulação e
programação de FPGAs
 Ter uma visão geral da VHDL
6 Fundamentos de VHDL em LP
v1.1
The US Department of Defense
 Por volta do início da década de 80, o DoD* enfrentava sérias
dificuldades com projetos de hardware
 Diversos fornecedores, cada um com diferentes ferramentas e
linguagens
 Projetos mal documentados
 Falta de padronização na documentação
 Custo elevado do ciclo de vida do hardware
 Necessidade uma linguagem de descrição de hardware
 Abrangente
 Independente de fornecedor
 Não proprietária
 Human readable (documentação)
 Machine readable (ferramentas de simulação)
*DoD: Departament of Defense dos Estados Unidos da América
7 Fundamentos de VHDL em LP
v1.1
The VHSIC* Program
 Esforço do DoD na criação de uma HDL** para a descrição e
simulação de circuitos integrados
 Tentativa de desenvolver a “Fortran” da descrição de hardware
 Deve padronizar a documentação dos fornecedores (human readable)
 Deve ser utilizada por ferramentas de simulação (machine readable)
 Programa organizado em duas fases
 Fase A (12 meses): entrega da especificação e documentação
preliminar da linguagem e seu respectivo ambiente de desenvolvimento
(simulador e compilador).
 Fase B (14 meses): entrega da especificação e documentação final da
linguagem e seu respectivo ambiente de desenvolvimento (simulador e
compilador) por parte do fornecedor escolhido na fase 1.
* VHSIC: Very High Speed Integrated Circuit
** HDL: Hardware Description Language
8 Fundamentos de VHDL em LP
v1.1
Cronologia 1/3
 1981 – Coleta de requisitos
 Report of IDA* Summer Study on HDL, Massachusetts
➢ Formado por membros da indústria, governo e academia
 VHSIC III Transportability for CAD Data: Final Report
➢ Estudo conduzido pela TRW (air-bag, mísseis e satélites para a NASA)
 Análise de diversos estudos enviados pela academia (subcontratados)
 07/82 – Declaração de Trabalho (Statement of Work)
 09/82 – Solicitação de Propostas (Draft Request for Proposals)
 01/83 – Department of Defense Requirements for HDL
 Resultado da coleta de requisitos + base de conhecimento do DoD
adquirido no programa ADA + revisões das propostas dos fornecedores
 03/83 – Solicitação de Propostas (Request for Proposals)
* IDA – Insititute for Defense Analyses
9 Fundamentos de VHDL em LP
v1.1
Cronologia 2/3
 07/83 – IBM, Intermetrics e Texas Instruments fecham contrato
com governo norte-americano
 IBM já tinha desenvolvido diversas HDL internamente em seus projetos
 08/85 – versão final da linguagem VHDL sob contrato do
governo é lançada (versão 7.2)
 02/86 – Direitos da linguagem VHDL transferidos para a IEEE
 03/88 – IEEE publica padrão VHDL 1076-1987, LRM*
 1988 - ASIC Mandate (DoD MIL STD 454)
 Todos os ASICs fornecidos para o DoD devem ser codificados em VHDL
 1990 – Primeiro vôo do F22 Raptor
 VHDL utilizado no desenvolvimento de ASICs** pela Lockheed Sanders
* LRM: Language Reference Manual
** ASIC: Application Specific Integrated Circuit
10 Fundamentos de VHDL em LP
v1.1
Cronologia 3/3
 1994 – IEEE publica primeira revisão
LRM (VHDL 1076-1993)
 1997 – VHDL Synthesis Packages
(VHDL 1076.3-1997)
 1999 – Publicado padrão IEEE
contendo extensões AMS* (VHDL
1076.1-1999)
 2007 – adição de uma API (VHPI) que
permite programas em C acessar
código (VHDL 1076c-2007)
 2009 – PSL** é inserido no padrão
IEEE (VHDL 1076-2008)
* AMS: Analog and Mixed-Signal
** Property Specification Language
11 Fundamentos de VHDL em LP
v1.1
 VHDL – VHSIC Hardware Description Language
 Descreve o comportamento e estrutura de circuitos
 Criada inicialmente para descrever circuitos integrados (ASICs)
 Atualmente utilizada também na descrição de circuitos digitais em
FPGAs e CPLDs
 Utilizada por diversas ferramentas de EDA*
 Padrão internacional regulado pela IEEE
 Não proprietária
 Independente/portável
 Manutenção contínua
 VHDL não se programa!!!
* EDA – Electronic Design Automation
O que é VHDL?
12 Fundamentos de VHDL em LP
v1.1
Descrevendo um somador 1/2
 Tabela Verdade
11111
01110
01101
10100
01011
10010
10001
00000
scoutcinba a
b
cin
cout
s
 Esquemático
VHDL?
13 Fundamentos de VHDL em LP
v1.1
full_adder
Descrevendo um somador 2/2
 VHDL  Esquemático
a
b
cin
cout
s
s <= a xor b xor cin;
cout <= (a and b) or (a and cin) or
(b and cin);
architecture behavioral of full_adder is
begin
end behavioral;
entity full_adder is
port(
a, b, cin : in bit;
s, cout : out bit);
end full_adder;
 Arquitetura
14 Fundamentos de VHDL em LP
v1.1
Entity, Port & Architecture
 entity
 Especifica os pinos de I/O do
circuito
 port
 Indica direção e tipo dos
pinos da entity
 architecture
 Contém o código VHDL que
descreve o comportamento
do circuito
entity mux_2to1 is
port(
a, b, sel: in bit;
s: out bit);
end mux_2to1;
architecture behavioral of
mux_2to1 is
begin
s <= (a and sel) or (b and (not
sel));
end behavioral;
mux_2to1
a
b
sel
s
Você consegue desenhar a
arquitetura desse código?
15 Fundamentos de VHDL em LP
v1.0
Lab#01 – Somador
 Objetivo
 Familiarizar-se com o ambiente de desenvolvimento
Quartus II da Altera
 Verificar a descrição do somador completo em VHDL na
prática
 Instruções
 Abra o ambiente de desenvolvimento Quartus II da Altera
clicando em Start > All Programs > Altera > Quartus II
9.0sp2 Web Edition > Quartus II 9.0sp2 Web Edition
 Siga os passos mostrados nos slides a seguir
 Após, utilize os switches SW0-SW2 da placa de
desenvolvimento para analisar os resultados do full adder. O
resultado será mostrado nos leds LEDR1 e LEDR2
16 Fundamentos de VHDL em LP
v1.0
Criando Projetos
1
2
33
4
17 Fundamentos de VHDL em LP
v1.0
Sintetizando
11
22
44
33
18 Fundamentos de VHDL em LP
v1.0
Criando Waveforms
1
2
3
4
5
19 Fundamentos de VHDL em LP
v1.0
Gerando estímulos de entrada
1
2
3
4
20 Fundamentos de VHDL em LP
v1.0
Simulando
1
2
3
21 Fundamentos de VHDL em LP
v1.0
Atribuindo Pinos
1
2
3 4
22 Fundamentos de VHDL em LP
v1.0
Programando o dispositivo
1
2
3
4
23 Fundamentos de VHDL em LP
v1.0
Mais recursos sobre o Quartus II ...
 Quartus II Introduction for VHDL Users
 Clique em Help > PDF Tutorials
 Tutoriais em Flash
 Clique em Help > Tutorials
 Apresentações Online
 Help > Altera on the Web > Quartus II Online Demo
Help Is Your Best Friend!!!
24 Fundamentos de VHDL em LP
v1.1
Fundamentos de VHDL 1/2
 VHDL é concorrente por
definição
 Comandos são analisados em
paralelo
 Declarações concorrentes
localizadas entre begin e end
de uma declaração
architecture
 VHDL não é case sensitive
 Comentários
 são indicados por dois hífens
consecutivos (--)
 Não existe comentários em
bloco
 Não há dependência entre
comandos
architecture example1 of concurrent_area is
begin
-- concurrent area
...
-- concurrent statements
...
end example1;
25 Fundamentos de VHDL em LP
v1.1
Fundamentos de VHDL 2/2
 Concurrent Signal
Assignments (<=)
 Descrevem conexões entre
nodos
 signal
 declaração de sinais internos a
arquitetura
architecture example2 of
concurrent_area is
signal a, d: bit;
begin
a <= b and c;
d <= e or f;
g <= a nand d;
end example2;
ARCHITECTURE EXAMPLE3 OF
CONCURRENT_AREA IS
SIGNAL A, D: BIT;
BEGIN
G <= A NAND D;
D <= E OR F;
A <= B AND C;
END EXAMPLE3;
b
c
e
f
g
a
d
Circuitos diferentes?
26 Fundamentos de VHDL em LP
v1.0
Lab#02 – Decodificador 2 para 4
 Objetivo
 Descrever em VHDL o
decodificador conforme
arquitetura e tabela verdade
decoder2to4
a0
a1
en r3
r2
r1
r0
 Arquitetura
0000--0
0001111
0010011
0100101
1000001
r0r1r2r3a0a1en
27 Fundamentos de VHDL em LP
v1.1
Finalizando ...
 Entity
 Especifica a interface de uma arquitetura
 Nome do arquivo deve ser igual ao nome da entidade
 Port
 Define a direção das portas de uma entidade. Pode ser in, out ou inout
(utilizado em barramentos)
 Architecture
 É a descrição comportamental do circuito
 Comentários
 Em VHDL, só existem comentários de linha
 Comentários iniciam com dois hifens consecutivos (--)
 Signal
 Utilizado na declaração de sinais internos à arquitetura
Agosto de 2013
Dispositivos Lógico
Programáveis
Dispositivos Lógico
Programáveis
Módulo 2
29 Fundamentos de VHDL em LP
v1.1
Neste módulo você vai ...
 Aprender o histórico das arquiteturas lógico
programáveis
 Entender as tecnologias de programação de
hardware disponíveis
 Identificar a necessidade que levou o
surgimento de FPGAs
 Compreender as diferenças entre CPLDs,
FPGAs e ASICs
30 Fundamentos de VHDL em LP
v1.1
SPLD* - PROM
* SPLD: Simple Programmable Logic Device
31 Fundamentos de VHDL em LP
v1.1
SPLD - PLA
32 Fundamentos de VHDL em LP
v1.1
SPLD - PAL
33 Fundamentos de VHDL em LP
v1.1
CPLD (Complex PLD)
34 Fundamentos de VHDL em LP
v1.1
Um espaço ...
35 Fundamentos de VHDL em LP
v1.1
… preenchido por FPGAs
36 Fundamentos de VHDL em LP
v1.1
Look Up Table (LUT)
 Uso de multiplexadores
 Registradores programáveis
 ISP – In-System
Programmability
37 Fundamentos de VHDL em LP
v1.1
SRAM-Based
 Grande maioria das FPGAs
 Arquivo de Bitstream
 Cadeia de Scan (scan-chain)
 Volátil
38 Fundamentos de VHDL em LP
v1.1
Fusíveis e anti-fusíveis
 Anti-fusível
 Utilizada em
algumas FPGAs
 Condutores são
“criados” através de
alta tensão
 OTP (one time
programmable)
 Fusível
 Utilizada em SPLDs
 Programação através da
“queima” de fusíveis
39 Fundamentos de VHDL em LP
v1.1
EPROM
 EPROM
 Erasable PROM
 Tensão elevada no gate
de controle
 Tecnologia desenvolvida pela
Intel em 1971
 Apagável, reprogramável
40 Fundamentos de VHDL em LP
v1.1
EEPROM e FLASH
 EEPROM - Electric Erasable
PROM
 Apagável, sem necessidade
de UV
 ISP – In-System
reprogrammability
 FLASH – blocos de
EEPROM
41 Fundamentos de VHDL em LP
v1.1
Resumo das Tecnologias
42 Fundamentos de VHDL em LP
v1.1
Arquitetura – Cyclone II 1/3
Cyclone II EP2C20 Device Block Diagram
43 Fundamentos de VHDL em LP
v1.1
Arquitetura – Cyclone II 2/3
Cyclone II LAB Structure
LE
44 Fundamentos de VHDL em LP
v1.1
Arquitetura – Cyclone II 3/3
Cyclone II Logic Element (LE)
45 Fundamentos de VHDL em LP
v1.1
Arquitetura – Spartan III 1/3
Spartan-3 Family Architecture
46 Fundamentos de VHDL em LP
v1.1
Arquitetura – Spartan III 2/3
Arrangement of Slices within the CLB
47 Fundamentos de VHDL em LP
v1.1
Arquitetura – Spartan III 3/3
Simplified Diagram of the Left-Hand SLICEM
48 Fundamentos de VHDL em LP
v1.1
Arquitetura – CoolRunner II
CoolRunner-II CPLD Architecture
49 Fundamentos de VHDL em LP
v1.1
Arquitetura – Max II
MAX II Logic Element (LE)
50 Fundamentos de VHDL em LP
v1.1
Finalizando ...
 FPGAs
 Volátil*
➢ SRAM-Based
 Muitos registradores
 Memória externa
 Programação
 LUT-based
 Aplicações
➢ DSP (multipliers)
➢ Telecom (SERDES)
➢ ASIC Prototyping
 CPLDs
 Não-volátil**
➢ Anti-fusível
 Poucos registradores
 Single-Chip
 Instant-on
 PLA-based***
 Aplicações
➢ Expansão de IO
➢ Interface Briding
➢ Level-shifting
* Inicialmente, FPGA eram voláteis. Porém, atualmente, se encontra uma gama de FPGAs não voláteis (anti fusível)
** Inicialmente, CPLDs eram diferenciadas por serem OTP (one time programmable). Porém, atualmente, quase todos os modelos
podem ser reprogramados (EEPROM)
*** Atualmente, algumas CPLDs são LUT-based (Família MAX II da Altera)
Fundamentos de VHDL em LP
v1.1
Descrição de Circuitos
Combinacionais
Descrição de Circuitos
Combinacionais
Módulo 3
52 Fundamentos de VHDL em LP
v1.1
Neste módulo você vai ...
 Aprender as construções utilizadas para descrever
circuitos combinacionais
 Utilizar vetores de bits
 Escrever código parametrizável
 Criar projetos no ISE da Xilinx
 Passar por todas as etapas do fluxo de projetos no
ISE
 Aprender a usar o tipo standard logic
 Usar os conceitos aprendidos para descrever uma
unidade lógica e aritmética
53 Fundamentos de VHDL em LP
v1.1
Conditional Signal Assignment
 Similar as declarações “if-
then-else” encontradas em
linguagens de programação
 Descreve e multiplexadores
 Condição define lógica de
seleção
 Resultado booleano
 Utiliza operadores relacionais
entity mux_2to1 is
port(
a, b, sel : in bit;
s : out bit);
end mux_2to1;
architecture lowlevel of mux_2to1 is
begin
s <= (a and sel)or(b and (not sel));
end lowlevel;
architecture highlevel of mux_2to1 is
begin
s <= a when sel = '0' else b;
end highlevel;
 Uma entity pode possuir
mais de uma arquitetura
condição
condição
sel = b
a /= '1'
a < b and sel = '1'
a > b
a <= b xnor sel = '0'
a => sel or sel = '1'
operador
=
/=
<
>
<=
>=
operação
igualdade
desigualdade
menor que
maior que
menor igual a
maior igual a
54 Fundamentos de VHDL em LP
v1.1
Selected Signal Assignment
 Similar as declarações
“case/switch” encontradas
em linguagens de
programação
 Deve cobrir todas as
combinações
 others
 define todas as outras
combinações não definidas
 Construção similar ao “default”
em C
entity mux_2to1 is
port(
a, b, sel : in bit;
s : out bit);
end mux_2to1;
architecture conditional of mux_2to1 is
begin
s <= a when sel = '0' else b;
end conditional;
architecture selected of mux_2to1 is
begin
with sel select
s <= a when '0',
b when others;
end selected;
configuration cfg of mux_2to1 is
for selected
end for;
end cfg;
Qual arquitetura será
escolhida?
55 Fundamentos de VHDL em LP
v1.1
Generic, Downto & To
 generic: utilizado para
definir arquiteturas com
vetores de bits
parametrizáveis.
 bit_vector: vetor de bits
 downto: define vetores de
bits em ordem descendente
 to: define vetores de bits em
ordem ascendente
 integer: tipo inteiro de 32
bits
entity generic_mux is
generic(N: integer := 4);
port(
e0, e1: in bit_vector(N-1 downto 0);
e2, e3: in bit_vector(N-1 downto 0);
sel : in bit_vector(1 downto 0);
s : out bit_vector(N-1 downto 0));
end generic_mux;
architecture selected of generic_mux is
begin
with sel select
s <= e0 when "00",
e1 when "01",
e2 when "10",
e3 when "11";
end selected;
architecture conditional of generic_mux is
begin
s <= e0 when sel = "00" else
e1 when sel = "01" else
e2 when sel = "10" else
e3;
end conditional;
Vetores são representados
com aspas duplas
56 Fundamentos de VHDL em LP
v1.0
Lab#03 – Display de 7 Segmentos
 Objetivo
 Descrever um decodificador de
números binários (4 bits) para
hexadecimal num display de 7
segmentos usando o Quartus II
 Especificação
 Use a interface mostrada ao
lado (entidade)
 A porta “en” deve habilitar o
display quando em '1'
 Os segmentos do display são
ativos em zero
0
1
2
3
4
5
6
 Utilize a seguinte convenção
para as portas de saída
lcd(6:0)
 lcd(0)=0, lcd(1)=1,
 lcd(2)=2, lcd(3)=3,
 lcd(4)=4, lcd(5)=5,
 lcd(6)=6.
entity display_decoder is
port (
-- entradas
en : in bit;
bin : in bit_vector(3 downto 0);
-- saidas
lcd : out bit_vector(6 downto 0));
end display_decoder;
57 Fundamentos de VHDL em LP
v1.1
Tipo Bit e suas Limitações
 Tipo bit possui apenas dois
estados ('0' e '1')
 Um sinal digital pode ter
mais estados
 IEEE Std 1164-1993
 Introduzido para superar
limitações da VHDL
 Possui 2 novos tipos: std_logic
e std_ulogic
 Ambos tipos adicionam 7
novos estados
 Funções lógicas apresentam
tabela verdade mais complexa
 std_logic é um subtipo de
std_ulogic
Weak 1H
Don't-care-
Weak 0L
Weak unknownW
High impedanceZ
Forcing 11
Forcing 00
Forcing UnknownX
UninitializedU
DescriçãoValor
 Tipo std_logic resolve
conflitos de sinais (curtos)
58 Fundamentos de VHDL em LP
v1.1
Tabela Verdade AND
UUU0UUU0UU
UXX0XXX0X-
UX10XX10XH
000000000L
UXX0XXX0XW
UXX0XXX0XZ
UX10XX10X1
0000000000
UXX0XXX0XX
U-HLWZ10X
Valores não inicializados são propagados!!!
Zero tem prioridade em uma porta AND!!!
59 Fundamentos de VHDL em LP
v1.1
Tabela de Resolução de Conflitos
XXXXXXXXUU
XXXXXXXXX-
XXHWWH10XH
XXWLWL10XL
XXWWWW10XW
XXHLWZ10XZ
XX11111XX1
XX0000X0X0
UXXXXXXXXX
U-HLWZ10X
Resistor de pull-down!!!
Curto!!!
60 Fundamentos de VHDL em LP
v1.1
Usando Standard Logic
 O tipo standard logic está
definido dentro de uma
biblioteca IEEE
 library - define a biblioteca
 use - especifica qual parte da
biblioteca será usada
(package)
 all - designa que todo
conteúdo dentro do pacote
será utilizado
 Na prática, library é um
diretório com arquivos
 Cada arquivo é um package
 use indica qual arquivo será
usado
library ieee;
use ieee.std_logic_1164.all;
entity nor3 is
port(
a, b, c: in std_logic;
f : out std_logic);
end nor3;
architecture behavioral of nor3 is
begin
F <= not(a or b or c);
end behavioral;
 Definições de tipos e
funções dentro de cada
package
 Código fonte de alguns
pacotes podem não estar
disponíveis (compilados)
61 Fundamentos de VHDL em LP
v1.1
Operações Aritméticas em std_logic 1/3
 Standard logic também
possui o tipo vetor
 std_logic_vector
 std_ulogic_vector
 Vetores permitem a
realização de operações
mais complexas
 aritméticas
 lógicas
 Problema???
library ieee;
use ieee.std_logic_1164.all;
entity example3 is
port(
a: in std_logic_vector(7 downto 0);
b: in std_logic_vector(7 downto 0);
x: out std_logic_vector(7 downto 0);
y: out std_logic_vector(7 downto 0));
end example3;
architecture behavioral of example3 is
begin
x <= a + b;
y <= a and b;
end behavioral;
Erro!!!Erro!!!
 Tipo std_logic não permite
operações aritméticas
Solução???
62 Fundamentos de VHDL em LP
v1.1
Operações Aritméticas em std_logic 2/3
 Usar tipos definidos no
pacote std_logic_arith
 Biblioteca da Synopsys
(não é IEEE)
 Possui tipo com sinal
(signed) e sem sinal
(unsigned)
 Permite diversas operações
(+, -, *, abs)
 Possui funções de conversão
entre tipos
 Problema???
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_arith.all;
entity example3 is
port(
a: in unsigned(7 downto 0);
b: in unsigned(7 downto 0);
x: out unsigned(7 downto 0);
y: out unsigned(7 downto 0));
end example3;
architecture behavioral of example3 is
begin
x <= a + b;
y <= a and b;
end behavioral;
 Tipo signed/unsigned não
permite operações lógicas
Erro!!!Erro!!!
Outra solução???
63 Fundamentos de VHDL em LP
v1.1
Operações Aritméticas em std_logic 3/3
 Adicionar os pacotes
std_logic_signed e
std_logic_unsigned
 Permite operações
aritméticas e lógicas
 Permite o uso do tipo
std_logic
 Mantém compatibilidade
 Evita uso de funções de
conversão
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
entity example3 is
port(
a: in std_logic_vector(7 downto 0);
b: in std_logic_vector(7 downto 0);
x: out std_logic_vector(7 downto 0);
y: out std_logic_vector(7 downto 0));
end example3;
architecture behavioral of example3 is
begin
x <= a + b;
y <= a and b;
end behavioral

64 Fundamentos de VHDL em LP
v1.1
Operador de Concatenação “&”
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
entity split_adder is
generic(N : positive := 8);
port(
-- entradas
-- operandos
a: in std_logic_vector(N-1 downto 0);
b: in std_logic_vector(N-1 downto 0);
-- saídas
-- resultado
s: out std_logic_vector(N-1 downto 0);
c: out std_logic);
end split_adder;
a[7:0]
b[7:0]
s[7:0]
c
sum_lsb
sum_msb
carry_lsb
a[7:4]
b[7:4]
a[3:0]
b[3:0]
split_adder
architecture behavioral of split_adder is
-- sinais internos
signal sum_lsb, sum_msb: std_logic_vector((N-1)/2+1 downto 0);
begin
end behavioral;
sum_lsb <= ('0'&a((N-1)/2 downto 0)) + ('0'&b((N-1)/2 downto 0));
sum_msb <= ('0'&a(N-1 downto (N-1)/2+1)) + ('0'&b(N-1 downto (N-1)/2+1)) +
sum_lsb((N-1)/2+1);
s <= sum_msb((N-1)/2 downto 0) & sum_lsb((N-1)/2 downto 0);
c <= sum_msb((N-1)/2+1);
65 Fundamentos de VHDL em LP
v1.1
Tabela de Operadores
bit, std_logic e std_ulogic,
signed e unsigned
&Concatenação
bit_vectorsll, srl, sla, sra, ror, rolDeslocamento
Todos=, /=, <, >, <=, >=Relacional
integer, unsigned, signed,
std_logic e std_ulogic
+, -, /, *, **, abs, rem e
mod
Aritmético
bit, std_logic e std_ulogicnot, and, or, xor, nand,
nor e xnor
Lógico
Todos<=, :=, =>Atribuição
Tipo de dadosSímbolosOperador
 O tipos de dados define o operador que pode ser utilizado
 A descrição de cada operador pode ser encontrada em sua
respectiva biblioteca
66 Fundamentos de VHDL em LP
v1.0
Lab#04 – Unidade Lógica
 Objetivo
 Familiarizar-se com o ambiente de desenvolvimento ISE da
Xilinx
 Verificar a descrição de uma unidade lógica na placa de
desenvolvimento da Xilinx
 Instruções
 Abra o ambiente de desenvolvimento ISE da Xilinx clicando
em Start > All Programs > Xilinx ISE Design Suite 11 > ISE >
Project Navigator
 Siga os passos mostrados nos slides a seguir
 Após, utilize a placa de desenvolvimento para verificar o
funcionamento da unidade lógica implementada.
67 Fundamentos de VHDL em LP
v1.0
Criando Projetos
1
2
3
D
esm
arque
D
esm
arque
4
68 Fundamentos de VHDL em LP
v1.0
Simulando
1
2
3
4
69 Fundamentos de VHDL em LP
v1.0
Sintetizando
1
2
3
70 Fundamentos de VHDL em LP
v1.0
Atribuindo Pinos
1
2
3
4
71 Fundamentos de VHDL em LP
v1.0
Programando o Dispositivo 1/2
1 2 3
4
72 Fundamentos de VHDL em LP
v1.0
Programando o Dispositivo 2/2
1
2
3
4
73 Fundamentos de VHDL em LP
v1.0
Mais recursos sobre o ISE ...
 Tutoriais
 Clique em Help > Tutorials > Tutorials on the Web
 Tutoriais em Flash
 Clique em Help > Tutorials > ISE Quick Start
 Manuais da Ferramenta
 Help > Software Manuals
Help Is Your Best Friend!!!
Again!!!
74 Fundamentos de VHDL em LP
v1.0
Lab#05 – Unidade Lógica Aritmética
 Objetivo
 Projetar uma unidade lógica
aritmética (ULA) genérica
utilizando o ISE da Xilinx
 Especificação
 Operandos A e B de 4 bits,
parametrizáveis
 Deve realizar as operações
mostradas na tabela ao lado
 Deve possuir flags de carry (c)
e zero (z)
 Operações aritméticas em
inteiros positivos
s <= a + b
s <= shl a
s <= b
s <= shr b
s <= a – b
s <= not a
s <= a xnor b
s <= a nor b
s <= a nand b
s <= a
s <= a xor b
s <= a or b
s <= a and b
Descrição
1000
1010
11 - -
1011
1001
0111
0110
0101
0100
0011
0010
0001
0000
opcode
 Tabela de Opcodes
75 Fundamentos de VHDL em LP
v1.1
Finalizando ...
 Library
 Contém definições funções,
componentes, procedimentos,
constantes e tipos organizados
na forma de pacotes
 Use
 Indica quais partes do pacote
da biblioteca serão utilizados
 Conditional Signal
Assignment
 Identifica prioridades
 Selected Signal Assignment
 Necessita testar todos os
valores do identificador
 Biblioteca IEEE
 Possui diversos pacotes para
superar as limitações da
linguagem
➢ std_logic_1164: Possui
diversos estados além de '1' e
'0'
➢ Operações matemáticas
podem ser realizadas
adicionando um dos seguintes
pacotes: std_logic_arith,
std_logic_signed ou
std_logic_unsigned
 Operador de concatenação
 Usado para a manipulação de
vetores
Fundamentos de VHDL em LP
v1.1
Descrição de Circuitos
Sequenciais
Descrição de Circuitos
Sequenciais
Módulo 4
77 Fundamentos de VHDL em LP
v1.1
Neste módulo você vai ...
 Aprender as construções utilizadas para descrever
circuitos sequenciais
 Reutilizar código
 Utilizar construções mais complexas para geração de
lógica combinacional
 Aprender a usar variáveis em VHDL
 Entender a diferença entre VHDL estrutural e
comportamental
 Utilizar os conceitos aprendidos para projetar um
contador binário, um registrador circular e um
contador BCD
78 Fundamentos de VHDL em LP
v1.1
Asynchronous D-type Flip-Flop
library ieee;
use ieee.std_logic_1164.all;
entity async_dff is
port(
d, clk, arst: in std_logic;
q: out std_logic);
end async_dff;
architecture behavioral of async_dff is
begin
async_dff: process(clk, arst)
begin
if (arst='1') then
q <= '0';
elsif(clk‘event and clk='1') then
q <= d;
end if;
end process async_dff;
end behavioral;
d
clk
arst
q
async_dff
d0
0X1
qclkarst
lista de sensibilidade
Como tornar síncrono?
79 Fundamentos de VHDL em LP
v1.1
Synchronous D-type Flip-Flop
library ieee;
use ieee.std_logic_1164.all;
entity sync_dff is
port(
d, clk,arst: in std_logic;
q: out std_logic);
end sync_dff;
architecture behavioral of sync_dff is
begin
sync_dff: process(clk)
begin
if(clk‘event and clk='1') then
if (rst='1') then
q <= '0';
else
q <= d;
end if;
end process sync_dff;
end behavioral;
d
clk
rst
q
sync_dff
d0
01
qclkrst
lista de sensibilidade
Qual usar?
80 Fundamentos de VHDL em LP
v1.1
Circuitos Síncronos
 Process
 Utilizados para descrever
circuitos sequenciais
 Código sequencial deve ser
descrito entre identificadores
begin e end
 Sinais dentro da lista de
sensibilidade indicam quando o
processo deve ser executado
 if/then/else
 Análogo a construções
if/then/elsif/else em linguagens
de computadores
 event
 Atributo que indica mudança de
estado do sinal (evento)
process(clk)
begin
if (clk`event and clk='1') then
if(ce = '1') then
q <= d;
end if;
end if;
if (clk`event and clk='1') then
if(ce = '1') then
q <= d;
end if;
end if;
end process;
Sintetizável?
81 Fundamentos de VHDL em LP
v1.1
Atributos
retorna true se declarado em ordem ascendented’ascending
retorna true se ocorrer um eventod’event
retorna limites do vetor (invertido)d’reverse_range
retorna limites do vetord’range
retorna comprimento do vetord’length
retorna posição mais a direita do vetord’right
retorna posição mais a esquerda do vetord’left
retorna limite superiord’high
retorna limite inferiord’low
DescriçãoAtributo
 Utilizados em conjunto com sinais
82 Fundamentos de VHDL em LP
v1.0
Lab#06 – Contador Binário
 Objetivo
 Projetar um contador binário usando o Quartus II ou o ISE
 Especificação
 Descrever um contador de 30 bits que incremente a cada
borda de subida de relógio
 O contador deve voltar a zero após o estouro
 Utilizar reset assíncrono
 Usar um pino para controle do contador (habilitar/desabilitar
função incrementar)
 Sinais de reset e de incremento devem ser ativos em ‘0’
 Ver cabeçalho do código VHDL localizado na pasta do
laboratório para maiores detalhes
83 Fundamentos de VHDL em LP
v1.1
Processos
 Utilizado para descrever o
comportamento de circuitos
síncronos
 Dois ou mais processos são
executados
concorrentemente
 Não há limite de processos
em um código
 Podem ser utilizados para
construir lógica
combinacional
 Utilizado na codificação de
máquina de estados (FSM)
 Pode utilizar variáveis
 Escopo interno ao processo
 Inicializável
 Atualização imediata
 Sinais são atualizados no
final do processo
 Diversas construções são
permitidas internamente ao
processo (if, wait, case e
loop)
84 Fundamentos de VHDL em LP
v1.1
Wait
 Processo não pode conter
lista de sensibilidade
 Apresenta-se em 3 formas
diferentes
 wait until
➢ Aceita apenas um sinal
➢ Apropriado para descrição de
circuitos síncronos
➢ Uso simular ao if
process
begin
wait until (clk‘event and clk='1');
if (rst='1') then
output <= "00000000";
elsif (clk‘event and clk='1') then
output <= input;
end if;
end process;
 wait on
➢ Aceita múltiplos sinais
process
begin
wait on clk, rst;
if (rst='1') then
output <= "00000000";
elsif(clk‘event and clk='1') then
output <= input;
end if;
end process;
 wait for
➢ Utilizado em testbenches
➢ Não sintetizável
process
begin
d_ff <= '0';
wait for 10 ns;
d_ff <= '1';
wait for 10 ns;
end process;
85 Fundamentos de VHDL em LP
v1.1
Constantes
 Devem ser declaradas dentro da arquitetura
 Utilize letras maiúsculas para identificá-las
(convenção)
 Sintaxe
constant name: type := value;
 Exemplo
architecture behavioral of example is
-- declaração de constantes
constant LOGIC_HIGH: std_logic := '1';
constant LOGIC_LOW : std_logic := ‘0';
begin
-- ...
end behavioral;
86 Fundamentos de VHDL em LP
v1.1
Component 1/2
 Permite criar níveis de
hierarquia e reutilizar código
 Modularização de projetos
 Divider & Conquer
 Utilizada para declarar qual
módulo será utilizado
 Sintaxe da declaração similar
ao entity
 Pode ter parâmetros
genéricos
 Componentes devem ser
declarados entre
architecture e begin
library ieee;
use ieee.std_logic_1164.all;
entity top is
generic(
N: positive := 8;
SYNC_DELAY : positive := 24);
port(
clk, rst: in std_logic;
leds: out std_logic_vector(N-1 downto
0));
end top;
architecture structural of top is
component sync_counter is
generic(N : positive := 24);
port(
clk, rst: in std_logic;
sync: out std_logic);
end component;
component rotate_register is
generic(N : positive := 8);
port(
clk, rst, rot: in std_logic;
q: out std_logic_vector(N-1
downto 0));
end component;
Declaração
87 Fundamentos de VHDL em LP
v1.1
Component 2/2
 Componentes devem ser
instanciados entre begin e
end
 Não há limite para instâncias
 São blocos de hardware
 Port Map
 Realiza as conexões entre os
sinais de um componente e a
arquitetura
 Generic Map
 Define os parâmetros da
instância
 Pode gerar instâncias
diferentes
 Arquivo topo de projetos
normalmente descrito em
nível estrutural
begin
-- instanciamento de componentes
-- registrador de sincronismo
sync_blk: sync_counter
generic map(N => SYNC_DELAY)
port map(
clk => clk,
rst => rst,
sync=> sync_sig);
-- registrador circular
rot_blk: rotate_register
generic map(N => N)
port map(
clk => clk,
rst => rst,
rot => sync_sig,
q => leds);
end structural;
Instanciação
88 Fundamentos de VHDL em LP
v1.1
Netlist
Síntese
VHDL Comportamental x Estrutural
 VHDL comportamental
 Utiliza construções da
linguagem, tais como, process,
signal conditional assignment,
if/then/elsif/else, etc.
 É o nível mais alto de
codificação
sync_blk
clk
rst
sync
rot_blk
clk
rst q
rot
top
leds
clk
rst
sync_sig
 VHDL estrutural
 Baseado em blocos de
hardware já descritos
 É a descrição mais próxima
do hardware final
 Netlist
 Resultado da síntese
 Contém todas as células do
circuito (ASICs)
89 Fundamentos de VHDL em LP
v1.0
Lab#07 – Registrador Circular
 Objetivo
 Aplicar os conceitos de hierarquia e instanciação de componentes
 Especificação
 Baseando-se no diagrama de blocos mostrado no slide anterior,
desenvolver os blocos faltantes para o projeto
➢ sync_blk: deve emitir pulsos de sincronismo em períodos de tempo
determinados pelo usuário (frequência do clock: 50MHz).
➢ rotate_register: deve rotacionar dados previamente inicializados em um
registrador a cada borda de subida de relógio, apenas quando este estiver
habilitado (rot = ‘1’, proveniente do sinal de sincronismo sync)
 Utilize reset síncrono ativo em zero em ambos os blocos
 Respeite a declaração dos blocos sync_counter e rotate_register
conforme arquitetura topo (top.vhd)
 Para maiores detalhes sobre os blocos a serem implementados, leia o
cabeçalho dos arquivos sync_counter.vhd e rotate_register.vhd
90 Fundamentos de VHDL em LP
v1.1
Case
 Similar a construções
case/switch em linguagens
de programação
 Testa múltiplas condições
 when others
➢ utilizado para definir todos os
outros possíveis estados
➢ algumas ferramentas de
síntese exigem essa
construção
 null – operação nula
 Utilizado na codificação de
máquina de estados
 Comando interno ao process
library ieee;
use ieee.std_logic_1164.all;
entity sync_dff is
port (
d, clk, rst: in std_logic;
q: out std_logic);
end sync_dff;
architecture behavioral of sync_dff is
begin
process(clk)
begin
if (clk’event and clk='1') then
case rst is
when '1' =>
q <= '0';
when '0' =>
q <= d;
when others =>
null;
end case;
end if;
end process;
end behavioral;
recomendado, pois
std_logic
apresenta
mais valores
além de 0 e 1
91 Fundamentos de VHDL em LP
v1.1
Loop
 Similar a construções em
linguagens de programação
 Apresenta 2 formas
 for .. loop (iterações fixas)
 while .. loop (iterações
variáveis)
 Exit – sai do loop
 Next – passa para a próxima
iteração do loop
bit_counter: process (clk)
variable cnt_var: natural range 0 to N-1;
begin
if (clk'event and clk='1') then
a_reg <= dat;
cnt_var := 0;
for i in 0 to N-1 loop
case a_reg(i) is
when '1' =>
cnt_var := cnt_var + 1;
when others =>
null;
end case;
end loop;
b_reg <= cnt_var;
end if;
end process bit_counter;
variável
signal
...
0 N-1
cnt_var = 0
1
0
1
1
0
1
1
0
1
...
b_reg
a_reg
92 Fundamentos de VHDL em LP
v1.1
Usando Variáveis
 Escopo limitado ao processo
onde foi declarada
 Atribuição imediata
 Utilizada na geração de
circuitos combinacionais
 Podem gerar caminhos
combinacionais muito longos
 O seu uso não correto pode
gerar hardware desnecessário
 Suportam os mesmos tipos
que “signal”
library ieee;
use ieee.std_logic_1164.all;
entity generic_adder is
generic (N : positive := 8);
port(
a: in std_logic_vector(N-1 downto 0);
b: in std_logic_vector(N-1 downto 0);
cin: in std_logic;
s: out std_logic_vector(N-1 downto 0);
cout: out std_logic);
end generic_adder;
architecture behavioral of generic_adder is
begin
process(a, b, cin)
variable carry: std_logic_vector(N downto
0);
begin
carry(0) := cin;
for i in 0 to N-1 loop
s(i) <= a(i) xor b(i) xor carry(i);
carry(i+1) := (a(i) and b(i)) or
(a(i) and carry(i)) or
(b(i) and carry(i));
end loop;
cout <= carry(N);
end process;
end behavioral;
lógicacombinacional
Você consegue desenhar
a arquitetura da
codificação ao lado?
93 Fundamentos de VHDL em LP
v1.1
Variable x Signal
 Signal
 Apenas a última
atribuição do processo é
validada
 Escopo limitado a
arquitetura onde foi
declarada
 Utilizada na geração
circuitos sequenciais e
combinacionais
 Variable
 Atribuição imediata
 Escopo limitado ao
processo onde foi
declarada
 São construções
auxiliares ao signal
 Utilizada na geração
circuitos combinacionais
 Utilizada em funções,
procedimentos e
testbenches
94 Fundamentos de VHDL em LP
v1.1
Lab#08 – Contador BCD up/down
 Objetivo
 Descrever lógica
combinacional usando
variáveis e processos
 Especificação
 Desenvolver um contador BCD
que realiza a contagem de
0000 até 9999
 Contador deve “virar” quando
atingir 9999
 Utilize variáveis para gerar o
controle do contador BCD
 Altere apenas o arquivo
bcd_counter.vhd
 Não altere a entidade
 Reset assíncrono deve ser
ativo em '0'
 Sinal de incremento (up) e
counter enable (ce) devem ser
ativos em '1'
 Trabalhe com “casas” para
gerar o controle
0011
3
1001
9
0101
5
0001
1
unidade
dezena
centena
milhar
95 Fundamentos de VHDL em LP
v1.1
Lab#08 – Implementação
Reuso de
código!!!
Xilinx
Spartan 3
Altera
Cyclone 2
Decodificador
Display
Contador BCD
+
Sincronizador
96 Fundamentos de VHDL em LP
v1.1
Finalizando ...
 Process
 Construção básica para a
geração de circuitos
sequenciais
 Variáveis
 Atribuição imediata. Utilizada
na geração de circuitos
combinacionais
 For .. loop/while
 Utilizado em conjunto com
variáveis para a geração de
circuitos combinacionais
 Exit/Next
 Utilizados para sair ou pular de
iterações em loops
 VHDL Estrutural
 Permite o desenvolvedor ter
mais controle sobre a
arquitetura desenvolvida
 Saída das ferramentas de
CAD, particularmente em
projetos de ASICs
 VHDL Comportamental
 Permite a ferramenta de
síntese inferir e ter mais
controle sobre o hardware
mais gerado
Fundamentos de VHDL em LP
v1.1
Descrição de Máquina de
Estados em VHDL
Descrição de Máquina de
Estados em VHDL
Módulo 5
98 Fundamentos de VHDL em LP
v1.1
Neste módulo você vai ...
 Entender as diferenças entre máquinas de Moore e
Mealy
 Identificar as vantagens e desvantagens de cada tipo
de codificação de máquina de estados
 Aprender a codificar circuitos digitais a partir de um
diagrama de estados e operações RTL
 Obter uma metodologia para a codificação de circuitos
digitais
99 Fundamentos de VHDL em LP
v1.1
Moore x Mealy
 Moore
 Saídas dependem do
estado atual
 Saídas síncronas
 Requer mais estados
 Mealy
 Saídas dependem do
estado atual + entradas
 Saídas assíncronas
 Requer menos estados
100 Fundamentos de VHDL em LP
v1.1
Codificação de Estados
 Registrador de estados pode apresentar
diversas codificações para cada estado. Cada
qual apresenta suas vantagens e
desvantagens
 One-Hot
 Binary
 Gray
101 Fundamentos de VHDL em LP
v1.1
Binary
 Estados representados na
forma binária
 Número reduzido de flip-flops
(menos área)
 Utilizado em arquiteturas
onde não há exigência de
performance
 Lógica de decodificação e
controle tende a ser maior
em área
 A mudança de estados
normalmente exige um
somador (carry chain)
000
001
011
100 010
arst = '0'
btn = '0'
btn = '1'
btn = '0'
btn = '1'
btn = '0'
btn = '1'
102 Fundamentos de VHDL em LP
v1.1
One-Hot
 Estados apresentam apenas
1 bit ativo (hot-bit)
 Mudança entre estados
ocasiona o chaveamento de
2 bits
 Utilizado em arquiteturas
onde um grande número de
flip-flops estão disponíveis
 Lógica de decodificação e
controle tende a ser menor
em área
 Mudança de estados
realizada através de
deslocamento de bits
00001
00010
01000
10000 00100
arst = '0'
btn = '0'
btn = '1'
btn = '0'
btn = '1'
btn = '0'
btn = '1'
103 Fundamentos de VHDL em LP
v1.1
Gray
 Chaveamento entre estados
altera apenas 1 bit
 Reduz hazards e glitches
 Alternativa para máquinas de
Mealy
 Indicado para arquiteturas
low-power devido ao número
reduzido de chaveamentos
 Exige lógica especial para a
troca de estados
000
001
010
110 011
arst = '0'
btn = '0'
btn = '1'
btn = '0'
btn = '1'
btn = '0'
btn = '1'
104 Fundamentos de VHDL em LP
v1.1
FSMs em VHDL
 Neste material, será
abordado a descrição de
FSMs do tipo Moore
 Mais estados
 Mais Estável (menos glitches)
 Mais Simples
 Metodologia de 2 processos
 Processo RTL
➢ Descrição de operações
➢ Síncrono
➢ Representa o caminho de
dados
 Processo de decodificação de
próximo estado
➢ Processo assíncrono
➢ Lógica combinacional
 Facilita documentação
➢ Arquitetura pode ser
documentada antes do
código
➢ Evita “programação”
➢ Mais didática
 Facilita portar arquitetura para
VHDL e vice-versa
105 Fundamentos de VHDL em LP
v1.1
FSMs em VHDL - Descrição
 RTL
 a_st
➢ a_cnt <= (others => '0');
 b_st
➢ a_cnt <= a_cnt + 1;
 c_st
➢ null;
 d_st
➢ null;
 FSM
a_st
b_st
d_st c_st
arst = '0'
btn = '1'
btn = '0'
btn = '1'
btn = '1'
btn = '0'
btn = '0'
106 Fundamentos de VHDL em LP
v1.1
FSMs em VHDL - Processo RTL
 RTL
 a_st
➢ a_cnt <= (others => '0');
 b_st
➢ a_cnt <= a_cnt + 1;
 c_st
➢ null;
 d_st
➢ null;
rtl: process(clk)
begin
if(clk'event and clk='1')then
case current_state is
end case;
current_state <= next_state;
end if;
end process rtl;
Evita estados
indesejáveis
when a_st =>
a_cnt <= (others => '0');
when b_st =>
a_cnt <= a_cnt + 1;
when c_st =>
null;
when d_st =>
null;
when others =>
null;
Como o próximo estado
é decodificado???
107 Fundamentos de VHDL em LP
v1.1
FSMs em VHDL – Decodificação 1/3
fsm: process(current_state,
arst, btn)
begin
 FSM
a_st
b_st
d_st c_st
arst = '0'
btn = '1'
btn = '0'
btn = '1'
btn = '1'
btn = '0'
btn = '0'
if (arst = '0') then
next_state <= a_st;
else
case current_state is
when a_st =>
if (btn= '0') then
next_state <= a_st;
else
next_state <= b_st;
end if;
when b_st =>
next_state <= c_st;
Todos os sinais de entrada devem estar na lista de sensibilidade!!!
108 Fundamentos de VHDL em LP
v1.1
FSMs em VHDL – Decodificação 2/3
when c_st =>
if (btn= '1') then
next_state <= c_st;
else
next_state <= d_st;
end if;
when d_st =>
if (btn= '0') then
next_state <= d_st;
else
next_state <= b_st;
end if;
when others =>
next_state <= a_st;
end case;
end if;
end process fsm;
 FSM
a_st
b_st
d_st c_st
arst = '0'
btn = '1'
btn = '0'
btn = '1'
btn = '1'
btn = '0'
btn = '0'
Evita estados
indesejáveis
109 Fundamentos de VHDL em LP
v1.1
FSMs em VHDL – Decodificação 3/3
fsm: process(current_state, arst, btn)
begin
if (arst = '0') then
next_state <= a_st;
else
case current_state is
when a_st =>
if (btn= '0') then
next_state <= a_st;
else
next_state <= b_st;
end if;
when b_st =>
next_state <= c_st;
when c_st =>
if (btn= '1') then
next_state <= c_st;
else
next_state <= d_st;
end if;
when d_st =>
if (btn= '0') then
next_state <= d_st;
else
next_state <= b_st;
end if;
when others =>
next_state <= a_st;
end case;
end if;
end process fsm;
 FSM
a_st
b_st
d_st c_st
arst = '0'
btn = '1'
btn = '0'
btn = '1'
btn = '1'
btn = '0'
btn = '0'
TODAS as condições
devem estar definidas,
caso contrário,
elementos
de memória serão
inferidos (latches)!!!
110 Fundamentos de VHDL em LP
v1.1
Arquitetura Resultante
 Metodologia de 2 processos
 Lógica de decodificação de
próximo estado
➢ Processo assíncrono
 Descrição de operações (RTL)
➢ Processo síncrono. Realiza
operações entre registradores
 Lógica de controle de
operações
 Inferida pela ferramenta de
síntese
 Pode ser realizado por um
terceiro processo (maior
controle sobre o hardware)
111 Fundamentos de VHDL em LP
v1.0
Lab#09 – Contador Controlado 1/2
 Objetivo
 Usar a metodologia de 2 processos para descrever uma FSM
 Especificação
 Implementar um contador de 16 bits (0000 -> FFFF) que incremente a
cada vez que um push button for pressionado por uma pessoa
 O contador deve incrementar apenas uma vez. Desconsidere possíveis
oscilações do push button.
Inserir controle
112 Fundamentos de VHDL em LP
v1.0
Lab#09 – Contador Controlado 2/2
 Terminou???
 Conecte o pino btn do arquivo topo diretamente em btn no bloco
button_control, conforme mostrado na figura abaixo
➢ Quais as conseqüências práticas dessa ação? Porquê?
➢ Note que, as vezes, o contador é resetado. Porquê?
 O que faz o arquivo digital_debouncer? Abra o código e analise.
Desenhe.
113 Fundamentos de VHDL em LP
v1.0
Lab#10 – Multiplicador 1/2
 Objetivo
 Descrever um multiplicador usando FSMs
 Especificação
 Descrever em VHDL um bloco que realize a multiplicação
de dois números inteiros positivos
 Os operandos devem ter 4 bits. Resultado em 8 bits
 Verifique o cabeçalho do arquivo multiplier.vhd para obter
maiores detalhes das funcionalidades dos pinos
 Utilize a especificação mostrada na página a seguir
114 Fundamentos de VHDL em LP
v1.0
Lab#10 – Multiplicador 2/2
115 Fundamentos de VHDL em LP
v1.1
Finalizando ...
 Variáveis
 Em processos, utilize variáveis para gerar lógica combinacional. Caso
contrário, use sinais.
 Quando mal utilizadas em circuitos síncronos, longos caminhos
combinacionais são inferidos
 FSMs
 Máquinas de Moore possuem mais estados, porém, são mais estáveis
que as de Mealy
 Evite estados indesejáveis com when others
 Cubra todos os branches, caso contrário, latches serão inferidos
 Jamais faça lógica com clock! Use clock enable controlado por sinais de
sincronismo
 Mantenha código comportamental (folhas) separado de código
estrutural (topo)
Fundamentos de VHDL em LP
v1.1
AnexoAnexo
117 Fundamentos de VHDL em LP
v1.1
Comentários e Editores
 Comentários são essenciais para manter códigos reusáveis. Embora VHDL
seja considerado por si mesmo documentado, procure comentar seu código
 Inclua sempre cabeçalho no seu código, contendo informações sobre a
arquitetura que você está descrevendo (autor, data de criação, revisões,
propósito, interface do bloco, nome do arquivo, etc.)
 Use um editor de textos que forneça edição de colunas e um estilo de
indentação consistente (ver códigos exemplo). Como bons editores de texto
freeware podemos citar
 TextPad (http://www.textpad.com/)
 Crimson Editor (http://www.crimsoneditor.com/)
 jEdit (http://www.jedit.org/)
 Procure evitar linhas maiores que 80 colunas. Isto prejudica a leitura do
código quando impresso.
118 Fundamentos de VHDL em LP
v1.1
Convenções para sinais
 Use convenções para nomes de
sinais
 Sinais básicos
➢ clk – clock
➢ rst – reset síncrono
➢ arst – reset assíncrono
➢ ce – clock enable
➢ rdy –ready (handshake)
➢ dat – dados
➢ addr – address
➢ read – read memory
➢ write – write memory
➢ start – start (handshake)
 Use sufixos
 _reg – register
 _cnt – counter
 _ror – rotator
 _sht – shifter
 _sig – signal
 _var - variable
 _x2 – multiplied by 2
 _div2 – divided by 2
 _l – sinal ativo em ‘0’
 _ff – flip-flop
 Exemplos
 dat_reg: reg. de dados
 a_cnt: contador A
 clk_x2: clock multiplicado por 2
 ce_l: clock enable ativo em ‘0’

Mais conteúdo relacionado

Mais procurados

Resumo linguagem c para microcontroladores PIC usando MikroC
Resumo linguagem c para microcontroladores PIC usando MikroCResumo linguagem c para microcontroladores PIC usando MikroC
Resumo linguagem c para microcontroladores PIC usando MikroCFabio Souza
 
Lista de Exercícios - Linguagem Formais e Autômatos
Lista de Exercícios - Linguagem Formais e AutômatosLista de Exercícios - Linguagem Formais e Autômatos
Lista de Exercícios - Linguagem Formais e AutômatosTárcio Sales
 
Sistemas de aterramento em baixa tensão
Sistemas de aterramento em baixa tensãoSistemas de aterramento em baixa tensão
Sistemas de aterramento em baixa tensãoJeane Silva
 
Apostila Eplan p8 (2006)
Apostila Eplan p8 (2006)Apostila Eplan p8 (2006)
Apostila Eplan p8 (2006)Vanderson Dias
 
Lógica binária, potas lógicas e circuitos lógicos
Lógica binária, potas lógicas e circuitos lógicosLógica binária, potas lógicas e circuitos lógicos
Lógica binária, potas lógicas e circuitos lógicosMauro Pereira
 
Nbr iec 61439 1 - 2016 - versão corrigida-2017 - conjuntos de manobra e coman...
Nbr iec 61439 1 - 2016 - versão corrigida-2017 - conjuntos de manobra e coman...Nbr iec 61439 1 - 2016 - versão corrigida-2017 - conjuntos de manobra e coman...
Nbr iec 61439 1 - 2016 - versão corrigida-2017 - conjuntos de manobra e coman...EdmilsonNDosSantos
 
UFCD 6024.pptx
UFCD 6024.pptxUFCD 6024.pptx
UFCD 6024.pptxteresa rua
 
Estruturas de sustentação dos alimentadores n1 n2-n3-n4 e meio beco
Estruturas de sustentação dos alimentadores n1 n2-n3-n4 e meio becoEstruturas de sustentação dos alimentadores n1 n2-n3-n4 e meio beco
Estruturas de sustentação dos alimentadores n1 n2-n3-n4 e meio becoJonatas Ramos
 
Introdução a Linguagem C
Introdução a Linguagem CIntrodução a Linguagem C
Introdução a Linguagem Capolllorj
 

Mais procurados (20)

2. Amplificadores Operacionais e Aplicações
2. Amplificadores Operacionais e Aplicações2. Amplificadores Operacionais e Aplicações
2. Amplificadores Operacionais e Aplicações
 
3 sensores-e-atuadores
3 sensores-e-atuadores3 sensores-e-atuadores
3 sensores-e-atuadores
 
Resumo linguagem c para microcontroladores PIC usando MikroC
Resumo linguagem c para microcontroladores PIC usando MikroCResumo linguagem c para microcontroladores PIC usando MikroC
Resumo linguagem c para microcontroladores PIC usando MikroC
 
Lista de Exercícios - Linguagem Formais e Autômatos
Lista de Exercícios - Linguagem Formais e AutômatosLista de Exercícios - Linguagem Formais e Autômatos
Lista de Exercícios - Linguagem Formais e Autômatos
 
Eletronica de potencia
Eletronica de potenciaEletronica de potencia
Eletronica de potencia
 
08 amplificador operacional
08 amplificador operacional08 amplificador operacional
08 amplificador operacional
 
Sistemas de aterramento em baixa tensão
Sistemas de aterramento em baixa tensãoSistemas de aterramento em baixa tensão
Sistemas de aterramento em baixa tensão
 
Circuitos Integrados Digitais
Circuitos Integrados DigitaisCircuitos Integrados Digitais
Circuitos Integrados Digitais
 
Ge protecao diferencial
Ge protecao diferencialGe protecao diferencial
Ge protecao diferencial
 
Apostila Eplan p8 (2006)
Apostila Eplan p8 (2006)Apostila Eplan p8 (2006)
Apostila Eplan p8 (2006)
 
Lógica binária, potas lógicas e circuitos lógicos
Lógica binária, potas lógicas e circuitos lógicosLógica binária, potas lógicas e circuitos lógicos
Lógica binária, potas lógicas e circuitos lógicos
 
Fet completo
Fet completoFet completo
Fet completo
 
Transístores
TransístoresTransístores
Transístores
 
Amplificador operacional
Amplificador operacionalAmplificador operacional
Amplificador operacional
 
O protocolo hart
O protocolo hartO protocolo hart
O protocolo hart
 
Nbr iec 61439 1 - 2016 - versão corrigida-2017 - conjuntos de manobra e coman...
Nbr iec 61439 1 - 2016 - versão corrigida-2017 - conjuntos de manobra e coman...Nbr iec 61439 1 - 2016 - versão corrigida-2017 - conjuntos de manobra e coman...
Nbr iec 61439 1 - 2016 - versão corrigida-2017 - conjuntos de manobra e coman...
 
UFCD 6024.pptx
UFCD 6024.pptxUFCD 6024.pptx
UFCD 6024.pptx
 
Estruturas de sustentação dos alimentadores n1 n2-n3-n4 e meio beco
Estruturas de sustentação dos alimentadores n1 n2-n3-n4 e meio becoEstruturas de sustentação dos alimentadores n1 n2-n3-n4 e meio beco
Estruturas de sustentação dos alimentadores n1 n2-n3-n4 e meio beco
 
Introdução ao Arduino
Introdução ao ArduinoIntrodução ao Arduino
Introdução ao Arduino
 
Introdução a Linguagem C
Introdução a Linguagem CIntrodução a Linguagem C
Introdução a Linguagem C
 

Semelhante a Fundamentos de VHDL em Lógica Programável v1.1

Aula 1 introdução a VHDL 2016.pdf
Aula 1 introdução a VHDL 2016.pdfAula 1 introdução a VHDL 2016.pdf
Aula 1 introdução a VHDL 2016.pdfDeboraMateus3
 
VHDL_Descricao_e_Sintese_de_Circuitos_Di.pdf
VHDL_Descricao_e_Sintese_de_Circuitos_Di.pdfVHDL_Descricao_e_Sintese_de_Circuitos_Di.pdf
VHDL_Descricao_e_Sintese_de_Circuitos_Di.pdfssuser6f13ac
 
Microcontroladores PIC.pptx
Microcontroladores PIC.pptxMicrocontroladores PIC.pptx
Microcontroladores PIC.pptxfmtpereira
 
Embarcados Live - microROS: ROS2 no seu ESP32
Embarcados Live - microROS: ROS2 no seu ESP32Embarcados Live - microROS: ROS2 no seu ESP32
Embarcados Live - microROS: ROS2 no seu ESP32Embarcados
 
Programe a STM32L4 Discovery kit IoT node com ARM mbed
Programe a STM32L4 Discovery kit IoT node com ARM mbedPrograme a STM32L4 Discovery kit IoT node com ARM mbed
Programe a STM32L4 Discovery kit IoT node com ARM mbedFabio Souza
 
Linux embarcado - tudo o que seu projeto precisa está aqui!
Linux embarcado - tudo o que seu projeto precisa está aqui!Linux embarcado - tudo o que seu projeto precisa está aqui!
Linux embarcado - tudo o que seu projeto precisa está aqui!Embarcados
 
Gerenciador do atmega16
Gerenciador do atmega16Gerenciador do atmega16
Gerenciador do atmega16Gabriel Lima
 
PLCduino - A PLC using Arduino platform
PLCduino - A PLC using Arduino platformPLCduino - A PLC using Arduino platform
PLCduino - A PLC using Arduino platformRenato Mintz
 
ArquiteturaRisc_GabiCoelho
ArquiteturaRisc_GabiCoelhoArquiteturaRisc_GabiCoelho
ArquiteturaRisc_GabiCoelhoGabriela Coelho
 
CCS COMPILADOR - PARTE II
CCS COMPILADOR -  PARTE IICCS COMPILADOR -  PARTE II
CCS COMPILADOR - PARTE IISaldit Software
 
Apresentação #TDC2013 - Aplicações Profissionais com Radiuino
Apresentação #TDC2013 - Aplicações Profissionais com RadiuinoApresentação #TDC2013 - Aplicações Profissionais com Radiuino
Apresentação #TDC2013 - Aplicações Profissionais com RadiuinoOmar Branquinho
 
R&c 02 14_1 - A Internet e Conceitos Basicos (Parte 1)
R&c 02 14_1 - A Internet e Conceitos Basicos (Parte 1)R&c 02 14_1 - A Internet e Conceitos Basicos (Parte 1)
R&c 02 14_1 - A Internet e Conceitos Basicos (Parte 1)Mariana Hiyori
 

Semelhante a Fundamentos de VHDL em Lógica Programável v1.1 (20)

Lab2 vhdl fluxo_quartus
Lab2 vhdl fluxo_quartusLab2 vhdl fluxo_quartus
Lab2 vhdl fluxo_quartus
 
Aula 1 introdução a VHDL 2016.pdf
Aula 1 introdução a VHDL 2016.pdfAula 1 introdução a VHDL 2016.pdf
Aula 1 introdução a VHDL 2016.pdf
 
VHDL_Descricao_e_Sintese_de_Circuitos_Di.pdf
VHDL_Descricao_e_Sintese_de_Circuitos_Di.pdfVHDL_Descricao_e_Sintese_de_Circuitos_Di.pdf
VHDL_Descricao_e_Sintese_de_Circuitos_Di.pdf
 
LEON3 e KIT ALTERA.
LEON3 e KIT ALTERA.LEON3 e KIT ALTERA.
LEON3 e KIT ALTERA.
 
Introducaoplds
IntroducaopldsIntroducaoplds
Introducaoplds
 
Microcontroladores PIC.pptx
Microcontroladores PIC.pptxMicrocontroladores PIC.pptx
Microcontroladores PIC.pptx
 
Embarcados Live - microROS: ROS2 no seu ESP32
Embarcados Live - microROS: ROS2 no seu ESP32Embarcados Live - microROS: ROS2 no seu ESP32
Embarcados Live - microROS: ROS2 no seu ESP32
 
Blackfin
BlackfinBlackfin
Blackfin
 
Programe a STM32L4 Discovery kit IoT node com ARM mbed
Programe a STM32L4 Discovery kit IoT node com ARM mbedPrograme a STM32L4 Discovery kit IoT node com ARM mbed
Programe a STM32L4 Discovery kit IoT node com ARM mbed
 
CompactLogix
CompactLogixCompactLogix
CompactLogix
 
Linux embarcado - tudo o que seu projeto precisa está aqui!
Linux embarcado - tudo o que seu projeto precisa está aqui!Linux embarcado - tudo o que seu projeto precisa está aqui!
Linux embarcado - tudo o que seu projeto precisa está aqui!
 
03 linguagem ladder instrucoes de bit
03 linguagem ladder instrucoes de bit03 linguagem ladder instrucoes de bit
03 linguagem ladder instrucoes de bit
 
Gerenciador do atmega16
Gerenciador do atmega16Gerenciador do atmega16
Gerenciador do atmega16
 
PLCduino - A PLC using Arduino platform
PLCduino - A PLC using Arduino platformPLCduino - A PLC using Arduino platform
PLCduino - A PLC using Arduino platform
 
ArquiteturaRisc_GabiCoelho
ArquiteturaRisc_GabiCoelhoArquiteturaRisc_GabiCoelho
ArquiteturaRisc_GabiCoelho
 
CCS COMPILADOR - PARTE II
CCS COMPILADOR -  PARTE IICCS COMPILADOR -  PARTE II
CCS COMPILADOR - PARTE II
 
Apresentação #TDC2013 - Aplicações Profissionais com Radiuino
Apresentação #TDC2013 - Aplicações Profissionais com RadiuinoApresentação #TDC2013 - Aplicações Profissionais com Radiuino
Apresentação #TDC2013 - Aplicações Profissionais com Radiuino
 
Pic18xx
Pic18xxPic18xx
Pic18xx
 
R&c 02 14_1 - A Internet e Conceitos Basicos (Parte 1)
R&c 02 14_1 - A Internet e Conceitos Basicos (Parte 1)R&c 02 14_1 - A Internet e Conceitos Basicos (Parte 1)
R&c 02 14_1 - A Internet e Conceitos Basicos (Parte 1)
 
Cpld top dos tops
Cpld top dos topsCpld top dos tops
Cpld top dos tops
 

Fundamentos de VHDL em Lógica Programável v1.1

  • 1. Agosto de 2013 Fundamentos de VHDL em Lógica Programável v1.1 Fundamentos de VHDL em Lógica Programável v1.1 Eng. Alcides Silveira Costa
  • 2. 2 Fundamentos de VHDL em LP v1.1 Objetivos  Aprender e aplicar as construções básicas da linguagem VHDL  Obter experiência prática em ferramentas comerciais de desenvolvimento em lógica programável (LP)  Compreender o uso de testbenches para a verificação de circuitos digitais  Identificar ASICs, FPGAs e CPLDs  Entender a arquitetura de dispositivos lógico programáveis
  • 3. 3 Fundamentos de VHDL em LP v1.1 Agenda  Dia 1  Introdução ➢ Somador ➢ Decodificar 2 para 4  Dispositivos Lógico Programáveis  Circuitos combinacionais ➢ Display de 7 Segmentos ➢ Unidade Lógica ➢ Unidade Lógica Aritimética  Dia 2  Circuitos sequenciais ➢ Contador Binário ➢ Registrador Circular ➢ Contador BCD  FSM* em VHDL ➢ Contador Controlado ➢ Multiplicador
  • 4. Fundamentos de VHDL em LP v1.1 IntroduçãoIntrodução Dia 1
  • 5. 5 Fundamentos de VHDL em LP v1.1 Neste módulo você vai ...  Aprender a história da criação da linguagem  Entender a descrição de um somador em VHDL  Criar projetos no Quartus II da Altera  Passar por todas as etapas do fluxo de projetos no Quartus II  Descrever um decodificar 2 para 4 em VHDL  Entender o básico de síntese, simulação e programação de FPGAs  Ter uma visão geral da VHDL
  • 6. 6 Fundamentos de VHDL em LP v1.1 The US Department of Defense  Por volta do início da década de 80, o DoD* enfrentava sérias dificuldades com projetos de hardware  Diversos fornecedores, cada um com diferentes ferramentas e linguagens  Projetos mal documentados  Falta de padronização na documentação  Custo elevado do ciclo de vida do hardware  Necessidade uma linguagem de descrição de hardware  Abrangente  Independente de fornecedor  Não proprietária  Human readable (documentação)  Machine readable (ferramentas de simulação) *DoD: Departament of Defense dos Estados Unidos da América
  • 7. 7 Fundamentos de VHDL em LP v1.1 The VHSIC* Program  Esforço do DoD na criação de uma HDL** para a descrição e simulação de circuitos integrados  Tentativa de desenvolver a “Fortran” da descrição de hardware  Deve padronizar a documentação dos fornecedores (human readable)  Deve ser utilizada por ferramentas de simulação (machine readable)  Programa organizado em duas fases  Fase A (12 meses): entrega da especificação e documentação preliminar da linguagem e seu respectivo ambiente de desenvolvimento (simulador e compilador).  Fase B (14 meses): entrega da especificação e documentação final da linguagem e seu respectivo ambiente de desenvolvimento (simulador e compilador) por parte do fornecedor escolhido na fase 1. * VHSIC: Very High Speed Integrated Circuit ** HDL: Hardware Description Language
  • 8. 8 Fundamentos de VHDL em LP v1.1 Cronologia 1/3  1981 – Coleta de requisitos  Report of IDA* Summer Study on HDL, Massachusetts ➢ Formado por membros da indústria, governo e academia  VHSIC III Transportability for CAD Data: Final Report ➢ Estudo conduzido pela TRW (air-bag, mísseis e satélites para a NASA)  Análise de diversos estudos enviados pela academia (subcontratados)  07/82 – Declaração de Trabalho (Statement of Work)  09/82 – Solicitação de Propostas (Draft Request for Proposals)  01/83 – Department of Defense Requirements for HDL  Resultado da coleta de requisitos + base de conhecimento do DoD adquirido no programa ADA + revisões das propostas dos fornecedores  03/83 – Solicitação de Propostas (Request for Proposals) * IDA – Insititute for Defense Analyses
  • 9. 9 Fundamentos de VHDL em LP v1.1 Cronologia 2/3  07/83 – IBM, Intermetrics e Texas Instruments fecham contrato com governo norte-americano  IBM já tinha desenvolvido diversas HDL internamente em seus projetos  08/85 – versão final da linguagem VHDL sob contrato do governo é lançada (versão 7.2)  02/86 – Direitos da linguagem VHDL transferidos para a IEEE  03/88 – IEEE publica padrão VHDL 1076-1987, LRM*  1988 - ASIC Mandate (DoD MIL STD 454)  Todos os ASICs fornecidos para o DoD devem ser codificados em VHDL  1990 – Primeiro vôo do F22 Raptor  VHDL utilizado no desenvolvimento de ASICs** pela Lockheed Sanders * LRM: Language Reference Manual ** ASIC: Application Specific Integrated Circuit
  • 10. 10 Fundamentos de VHDL em LP v1.1 Cronologia 3/3  1994 – IEEE publica primeira revisão LRM (VHDL 1076-1993)  1997 – VHDL Synthesis Packages (VHDL 1076.3-1997)  1999 – Publicado padrão IEEE contendo extensões AMS* (VHDL 1076.1-1999)  2007 – adição de uma API (VHPI) que permite programas em C acessar código (VHDL 1076c-2007)  2009 – PSL** é inserido no padrão IEEE (VHDL 1076-2008) * AMS: Analog and Mixed-Signal ** Property Specification Language
  • 11. 11 Fundamentos de VHDL em LP v1.1  VHDL – VHSIC Hardware Description Language  Descreve o comportamento e estrutura de circuitos  Criada inicialmente para descrever circuitos integrados (ASICs)  Atualmente utilizada também na descrição de circuitos digitais em FPGAs e CPLDs  Utilizada por diversas ferramentas de EDA*  Padrão internacional regulado pela IEEE  Não proprietária  Independente/portável  Manutenção contínua  VHDL não se programa!!! * EDA – Electronic Design Automation O que é VHDL?
  • 12. 12 Fundamentos de VHDL em LP v1.1 Descrevendo um somador 1/2  Tabela Verdade 11111 01110 01101 10100 01011 10010 10001 00000 scoutcinba a b cin cout s  Esquemático VHDL?
  • 13. 13 Fundamentos de VHDL em LP v1.1 full_adder Descrevendo um somador 2/2  VHDL  Esquemático a b cin cout s s <= a xor b xor cin; cout <= (a and b) or (a and cin) or (b and cin); architecture behavioral of full_adder is begin end behavioral; entity full_adder is port( a, b, cin : in bit; s, cout : out bit); end full_adder;  Arquitetura
  • 14. 14 Fundamentos de VHDL em LP v1.1 Entity, Port & Architecture  entity  Especifica os pinos de I/O do circuito  port  Indica direção e tipo dos pinos da entity  architecture  Contém o código VHDL que descreve o comportamento do circuito entity mux_2to1 is port( a, b, sel: in bit; s: out bit); end mux_2to1; architecture behavioral of mux_2to1 is begin s <= (a and sel) or (b and (not sel)); end behavioral; mux_2to1 a b sel s Você consegue desenhar a arquitetura desse código?
  • 15. 15 Fundamentos de VHDL em LP v1.0 Lab#01 – Somador  Objetivo  Familiarizar-se com o ambiente de desenvolvimento Quartus II da Altera  Verificar a descrição do somador completo em VHDL na prática  Instruções  Abra o ambiente de desenvolvimento Quartus II da Altera clicando em Start > All Programs > Altera > Quartus II 9.0sp2 Web Edition > Quartus II 9.0sp2 Web Edition  Siga os passos mostrados nos slides a seguir  Após, utilize os switches SW0-SW2 da placa de desenvolvimento para analisar os resultados do full adder. O resultado será mostrado nos leds LEDR1 e LEDR2
  • 16. 16 Fundamentos de VHDL em LP v1.0 Criando Projetos 1 2 33 4
  • 17. 17 Fundamentos de VHDL em LP v1.0 Sintetizando 11 22 44 33
  • 18. 18 Fundamentos de VHDL em LP v1.0 Criando Waveforms 1 2 3 4 5
  • 19. 19 Fundamentos de VHDL em LP v1.0 Gerando estímulos de entrada 1 2 3 4
  • 20. 20 Fundamentos de VHDL em LP v1.0 Simulando 1 2 3
  • 21. 21 Fundamentos de VHDL em LP v1.0 Atribuindo Pinos 1 2 3 4
  • 22. 22 Fundamentos de VHDL em LP v1.0 Programando o dispositivo 1 2 3 4
  • 23. 23 Fundamentos de VHDL em LP v1.0 Mais recursos sobre o Quartus II ...  Quartus II Introduction for VHDL Users  Clique em Help > PDF Tutorials  Tutoriais em Flash  Clique em Help > Tutorials  Apresentações Online  Help > Altera on the Web > Quartus II Online Demo Help Is Your Best Friend!!!
  • 24. 24 Fundamentos de VHDL em LP v1.1 Fundamentos de VHDL 1/2  VHDL é concorrente por definição  Comandos são analisados em paralelo  Declarações concorrentes localizadas entre begin e end de uma declaração architecture  VHDL não é case sensitive  Comentários  são indicados por dois hífens consecutivos (--)  Não existe comentários em bloco  Não há dependência entre comandos architecture example1 of concurrent_area is begin -- concurrent area ... -- concurrent statements ... end example1;
  • 25. 25 Fundamentos de VHDL em LP v1.1 Fundamentos de VHDL 2/2  Concurrent Signal Assignments (<=)  Descrevem conexões entre nodos  signal  declaração de sinais internos a arquitetura architecture example2 of concurrent_area is signal a, d: bit; begin a <= b and c; d <= e or f; g <= a nand d; end example2; ARCHITECTURE EXAMPLE3 OF CONCURRENT_AREA IS SIGNAL A, D: BIT; BEGIN G <= A NAND D; D <= E OR F; A <= B AND C; END EXAMPLE3; b c e f g a d Circuitos diferentes?
  • 26. 26 Fundamentos de VHDL em LP v1.0 Lab#02 – Decodificador 2 para 4  Objetivo  Descrever em VHDL o decodificador conforme arquitetura e tabela verdade decoder2to4 a0 a1 en r3 r2 r1 r0  Arquitetura 0000--0 0001111 0010011 0100101 1000001 r0r1r2r3a0a1en
  • 27. 27 Fundamentos de VHDL em LP v1.1 Finalizando ...  Entity  Especifica a interface de uma arquitetura  Nome do arquivo deve ser igual ao nome da entidade  Port  Define a direção das portas de uma entidade. Pode ser in, out ou inout (utilizado em barramentos)  Architecture  É a descrição comportamental do circuito  Comentários  Em VHDL, só existem comentários de linha  Comentários iniciam com dois hifens consecutivos (--)  Signal  Utilizado na declaração de sinais internos à arquitetura
  • 28. Agosto de 2013 Dispositivos Lógico Programáveis Dispositivos Lógico Programáveis Módulo 2
  • 29. 29 Fundamentos de VHDL em LP v1.1 Neste módulo você vai ...  Aprender o histórico das arquiteturas lógico programáveis  Entender as tecnologias de programação de hardware disponíveis  Identificar a necessidade que levou o surgimento de FPGAs  Compreender as diferenças entre CPLDs, FPGAs e ASICs
  • 30. 30 Fundamentos de VHDL em LP v1.1 SPLD* - PROM * SPLD: Simple Programmable Logic Device
  • 31. 31 Fundamentos de VHDL em LP v1.1 SPLD - PLA
  • 32. 32 Fundamentos de VHDL em LP v1.1 SPLD - PAL
  • 33. 33 Fundamentos de VHDL em LP v1.1 CPLD (Complex PLD)
  • 34. 34 Fundamentos de VHDL em LP v1.1 Um espaço ...
  • 35. 35 Fundamentos de VHDL em LP v1.1 … preenchido por FPGAs
  • 36. 36 Fundamentos de VHDL em LP v1.1 Look Up Table (LUT)  Uso de multiplexadores  Registradores programáveis  ISP – In-System Programmability
  • 37. 37 Fundamentos de VHDL em LP v1.1 SRAM-Based  Grande maioria das FPGAs  Arquivo de Bitstream  Cadeia de Scan (scan-chain)  Volátil
  • 38. 38 Fundamentos de VHDL em LP v1.1 Fusíveis e anti-fusíveis  Anti-fusível  Utilizada em algumas FPGAs  Condutores são “criados” através de alta tensão  OTP (one time programmable)  Fusível  Utilizada em SPLDs  Programação através da “queima” de fusíveis
  • 39. 39 Fundamentos de VHDL em LP v1.1 EPROM  EPROM  Erasable PROM  Tensão elevada no gate de controle  Tecnologia desenvolvida pela Intel em 1971  Apagável, reprogramável
  • 40. 40 Fundamentos de VHDL em LP v1.1 EEPROM e FLASH  EEPROM - Electric Erasable PROM  Apagável, sem necessidade de UV  ISP – In-System reprogrammability  FLASH – blocos de EEPROM
  • 41. 41 Fundamentos de VHDL em LP v1.1 Resumo das Tecnologias
  • 42. 42 Fundamentos de VHDL em LP v1.1 Arquitetura – Cyclone II 1/3 Cyclone II EP2C20 Device Block Diagram
  • 43. 43 Fundamentos de VHDL em LP v1.1 Arquitetura – Cyclone II 2/3 Cyclone II LAB Structure LE
  • 44. 44 Fundamentos de VHDL em LP v1.1 Arquitetura – Cyclone II 3/3 Cyclone II Logic Element (LE)
  • 45. 45 Fundamentos de VHDL em LP v1.1 Arquitetura – Spartan III 1/3 Spartan-3 Family Architecture
  • 46. 46 Fundamentos de VHDL em LP v1.1 Arquitetura – Spartan III 2/3 Arrangement of Slices within the CLB
  • 47. 47 Fundamentos de VHDL em LP v1.1 Arquitetura – Spartan III 3/3 Simplified Diagram of the Left-Hand SLICEM
  • 48. 48 Fundamentos de VHDL em LP v1.1 Arquitetura – CoolRunner II CoolRunner-II CPLD Architecture
  • 49. 49 Fundamentos de VHDL em LP v1.1 Arquitetura – Max II MAX II Logic Element (LE)
  • 50. 50 Fundamentos de VHDL em LP v1.1 Finalizando ...  FPGAs  Volátil* ➢ SRAM-Based  Muitos registradores  Memória externa  Programação  LUT-based  Aplicações ➢ DSP (multipliers) ➢ Telecom (SERDES) ➢ ASIC Prototyping  CPLDs  Não-volátil** ➢ Anti-fusível  Poucos registradores  Single-Chip  Instant-on  PLA-based***  Aplicações ➢ Expansão de IO ➢ Interface Briding ➢ Level-shifting * Inicialmente, FPGA eram voláteis. Porém, atualmente, se encontra uma gama de FPGAs não voláteis (anti fusível) ** Inicialmente, CPLDs eram diferenciadas por serem OTP (one time programmable). Porém, atualmente, quase todos os modelos podem ser reprogramados (EEPROM) *** Atualmente, algumas CPLDs são LUT-based (Família MAX II da Altera)
  • 51. Fundamentos de VHDL em LP v1.1 Descrição de Circuitos Combinacionais Descrição de Circuitos Combinacionais Módulo 3
  • 52. 52 Fundamentos de VHDL em LP v1.1 Neste módulo você vai ...  Aprender as construções utilizadas para descrever circuitos combinacionais  Utilizar vetores de bits  Escrever código parametrizável  Criar projetos no ISE da Xilinx  Passar por todas as etapas do fluxo de projetos no ISE  Aprender a usar o tipo standard logic  Usar os conceitos aprendidos para descrever uma unidade lógica e aritmética
  • 53. 53 Fundamentos de VHDL em LP v1.1 Conditional Signal Assignment  Similar as declarações “if- then-else” encontradas em linguagens de programação  Descreve e multiplexadores  Condição define lógica de seleção  Resultado booleano  Utiliza operadores relacionais entity mux_2to1 is port( a, b, sel : in bit; s : out bit); end mux_2to1; architecture lowlevel of mux_2to1 is begin s <= (a and sel)or(b and (not sel)); end lowlevel; architecture highlevel of mux_2to1 is begin s <= a when sel = '0' else b; end highlevel;  Uma entity pode possuir mais de uma arquitetura condição condição sel = b a /= '1' a < b and sel = '1' a > b a <= b xnor sel = '0' a => sel or sel = '1' operador = /= < > <= >= operação igualdade desigualdade menor que maior que menor igual a maior igual a
  • 54. 54 Fundamentos de VHDL em LP v1.1 Selected Signal Assignment  Similar as declarações “case/switch” encontradas em linguagens de programação  Deve cobrir todas as combinações  others  define todas as outras combinações não definidas  Construção similar ao “default” em C entity mux_2to1 is port( a, b, sel : in bit; s : out bit); end mux_2to1; architecture conditional of mux_2to1 is begin s <= a when sel = '0' else b; end conditional; architecture selected of mux_2to1 is begin with sel select s <= a when '0', b when others; end selected; configuration cfg of mux_2to1 is for selected end for; end cfg; Qual arquitetura será escolhida?
  • 55. 55 Fundamentos de VHDL em LP v1.1 Generic, Downto & To  generic: utilizado para definir arquiteturas com vetores de bits parametrizáveis.  bit_vector: vetor de bits  downto: define vetores de bits em ordem descendente  to: define vetores de bits em ordem ascendente  integer: tipo inteiro de 32 bits entity generic_mux is generic(N: integer := 4); port( e0, e1: in bit_vector(N-1 downto 0); e2, e3: in bit_vector(N-1 downto 0); sel : in bit_vector(1 downto 0); s : out bit_vector(N-1 downto 0)); end generic_mux; architecture selected of generic_mux is begin with sel select s <= e0 when "00", e1 when "01", e2 when "10", e3 when "11"; end selected; architecture conditional of generic_mux is begin s <= e0 when sel = "00" else e1 when sel = "01" else e2 when sel = "10" else e3; end conditional; Vetores são representados com aspas duplas
  • 56. 56 Fundamentos de VHDL em LP v1.0 Lab#03 – Display de 7 Segmentos  Objetivo  Descrever um decodificador de números binários (4 bits) para hexadecimal num display de 7 segmentos usando o Quartus II  Especificação  Use a interface mostrada ao lado (entidade)  A porta “en” deve habilitar o display quando em '1'  Os segmentos do display são ativos em zero 0 1 2 3 4 5 6  Utilize a seguinte convenção para as portas de saída lcd(6:0)  lcd(0)=0, lcd(1)=1,  lcd(2)=2, lcd(3)=3,  lcd(4)=4, lcd(5)=5,  lcd(6)=6. entity display_decoder is port ( -- entradas en : in bit; bin : in bit_vector(3 downto 0); -- saidas lcd : out bit_vector(6 downto 0)); end display_decoder;
  • 57. 57 Fundamentos de VHDL em LP v1.1 Tipo Bit e suas Limitações  Tipo bit possui apenas dois estados ('0' e '1')  Um sinal digital pode ter mais estados  IEEE Std 1164-1993  Introduzido para superar limitações da VHDL  Possui 2 novos tipos: std_logic e std_ulogic  Ambos tipos adicionam 7 novos estados  Funções lógicas apresentam tabela verdade mais complexa  std_logic é um subtipo de std_ulogic Weak 1H Don't-care- Weak 0L Weak unknownW High impedanceZ Forcing 11 Forcing 00 Forcing UnknownX UninitializedU DescriçãoValor  Tipo std_logic resolve conflitos de sinais (curtos)
  • 58. 58 Fundamentos de VHDL em LP v1.1 Tabela Verdade AND UUU0UUU0UU UXX0XXX0X- UX10XX10XH 000000000L UXX0XXX0XW UXX0XXX0XZ UX10XX10X1 0000000000 UXX0XXX0XX U-HLWZ10X Valores não inicializados são propagados!!! Zero tem prioridade em uma porta AND!!!
  • 59. 59 Fundamentos de VHDL em LP v1.1 Tabela de Resolução de Conflitos XXXXXXXXUU XXXXXXXXX- XXHWWH10XH XXWLWL10XL XXWWWW10XW XXHLWZ10XZ XX11111XX1 XX0000X0X0 UXXXXXXXXX U-HLWZ10X Resistor de pull-down!!! Curto!!!
  • 60. 60 Fundamentos de VHDL em LP v1.1 Usando Standard Logic  O tipo standard logic está definido dentro de uma biblioteca IEEE  library - define a biblioteca  use - especifica qual parte da biblioteca será usada (package)  all - designa que todo conteúdo dentro do pacote será utilizado  Na prática, library é um diretório com arquivos  Cada arquivo é um package  use indica qual arquivo será usado library ieee; use ieee.std_logic_1164.all; entity nor3 is port( a, b, c: in std_logic; f : out std_logic); end nor3; architecture behavioral of nor3 is begin F <= not(a or b or c); end behavioral;  Definições de tipos e funções dentro de cada package  Código fonte de alguns pacotes podem não estar disponíveis (compilados)
  • 61. 61 Fundamentos de VHDL em LP v1.1 Operações Aritméticas em std_logic 1/3  Standard logic também possui o tipo vetor  std_logic_vector  std_ulogic_vector  Vetores permitem a realização de operações mais complexas  aritméticas  lógicas  Problema??? library ieee; use ieee.std_logic_1164.all; entity example3 is port( a: in std_logic_vector(7 downto 0); b: in std_logic_vector(7 downto 0); x: out std_logic_vector(7 downto 0); y: out std_logic_vector(7 downto 0)); end example3; architecture behavioral of example3 is begin x <= a + b; y <= a and b; end behavioral; Erro!!!Erro!!!  Tipo std_logic não permite operações aritméticas Solução???
  • 62. 62 Fundamentos de VHDL em LP v1.1 Operações Aritméticas em std_logic 2/3  Usar tipos definidos no pacote std_logic_arith  Biblioteca da Synopsys (não é IEEE)  Possui tipo com sinal (signed) e sem sinal (unsigned)  Permite diversas operações (+, -, *, abs)  Possui funções de conversão entre tipos  Problema??? library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_arith.all; entity example3 is port( a: in unsigned(7 downto 0); b: in unsigned(7 downto 0); x: out unsigned(7 downto 0); y: out unsigned(7 downto 0)); end example3; architecture behavioral of example3 is begin x <= a + b; y <= a and b; end behavioral;  Tipo signed/unsigned não permite operações lógicas Erro!!!Erro!!! Outra solução???
  • 63. 63 Fundamentos de VHDL em LP v1.1 Operações Aritméticas em std_logic 3/3  Adicionar os pacotes std_logic_signed e std_logic_unsigned  Permite operações aritméticas e lógicas  Permite o uso do tipo std_logic  Mantém compatibilidade  Evita uso de funções de conversão library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all; entity example3 is port( a: in std_logic_vector(7 downto 0); b: in std_logic_vector(7 downto 0); x: out std_logic_vector(7 downto 0); y: out std_logic_vector(7 downto 0)); end example3; architecture behavioral of example3 is begin x <= a + b; y <= a and b; end behavioral 
  • 64. 64 Fundamentos de VHDL em LP v1.1 Operador de Concatenação “&” library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all; entity split_adder is generic(N : positive := 8); port( -- entradas -- operandos a: in std_logic_vector(N-1 downto 0); b: in std_logic_vector(N-1 downto 0); -- saídas -- resultado s: out std_logic_vector(N-1 downto 0); c: out std_logic); end split_adder; a[7:0] b[7:0] s[7:0] c sum_lsb sum_msb carry_lsb a[7:4] b[7:4] a[3:0] b[3:0] split_adder architecture behavioral of split_adder is -- sinais internos signal sum_lsb, sum_msb: std_logic_vector((N-1)/2+1 downto 0); begin end behavioral; sum_lsb <= ('0'&a((N-1)/2 downto 0)) + ('0'&b((N-1)/2 downto 0)); sum_msb <= ('0'&a(N-1 downto (N-1)/2+1)) + ('0'&b(N-1 downto (N-1)/2+1)) + sum_lsb((N-1)/2+1); s <= sum_msb((N-1)/2 downto 0) & sum_lsb((N-1)/2 downto 0); c <= sum_msb((N-1)/2+1);
  • 65. 65 Fundamentos de VHDL em LP v1.1 Tabela de Operadores bit, std_logic e std_ulogic, signed e unsigned &Concatenação bit_vectorsll, srl, sla, sra, ror, rolDeslocamento Todos=, /=, <, >, <=, >=Relacional integer, unsigned, signed, std_logic e std_ulogic +, -, /, *, **, abs, rem e mod Aritmético bit, std_logic e std_ulogicnot, and, or, xor, nand, nor e xnor Lógico Todos<=, :=, =>Atribuição Tipo de dadosSímbolosOperador  O tipos de dados define o operador que pode ser utilizado  A descrição de cada operador pode ser encontrada em sua respectiva biblioteca
  • 66. 66 Fundamentos de VHDL em LP v1.0 Lab#04 – Unidade Lógica  Objetivo  Familiarizar-se com o ambiente de desenvolvimento ISE da Xilinx  Verificar a descrição de uma unidade lógica na placa de desenvolvimento da Xilinx  Instruções  Abra o ambiente de desenvolvimento ISE da Xilinx clicando em Start > All Programs > Xilinx ISE Design Suite 11 > ISE > Project Navigator  Siga os passos mostrados nos slides a seguir  Após, utilize a placa de desenvolvimento para verificar o funcionamento da unidade lógica implementada.
  • 67. 67 Fundamentos de VHDL em LP v1.0 Criando Projetos 1 2 3 D esm arque D esm arque 4
  • 68. 68 Fundamentos de VHDL em LP v1.0 Simulando 1 2 3 4
  • 69. 69 Fundamentos de VHDL em LP v1.0 Sintetizando 1 2 3
  • 70. 70 Fundamentos de VHDL em LP v1.0 Atribuindo Pinos 1 2 3 4
  • 71. 71 Fundamentos de VHDL em LP v1.0 Programando o Dispositivo 1/2 1 2 3 4
  • 72. 72 Fundamentos de VHDL em LP v1.0 Programando o Dispositivo 2/2 1 2 3 4
  • 73. 73 Fundamentos de VHDL em LP v1.0 Mais recursos sobre o ISE ...  Tutoriais  Clique em Help > Tutorials > Tutorials on the Web  Tutoriais em Flash  Clique em Help > Tutorials > ISE Quick Start  Manuais da Ferramenta  Help > Software Manuals Help Is Your Best Friend!!! Again!!!
  • 74. 74 Fundamentos de VHDL em LP v1.0 Lab#05 – Unidade Lógica Aritmética  Objetivo  Projetar uma unidade lógica aritmética (ULA) genérica utilizando o ISE da Xilinx  Especificação  Operandos A e B de 4 bits, parametrizáveis  Deve realizar as operações mostradas na tabela ao lado  Deve possuir flags de carry (c) e zero (z)  Operações aritméticas em inteiros positivos s <= a + b s <= shl a s <= b s <= shr b s <= a – b s <= not a s <= a xnor b s <= a nor b s <= a nand b s <= a s <= a xor b s <= a or b s <= a and b Descrição 1000 1010 11 - - 1011 1001 0111 0110 0101 0100 0011 0010 0001 0000 opcode  Tabela de Opcodes
  • 75. 75 Fundamentos de VHDL em LP v1.1 Finalizando ...  Library  Contém definições funções, componentes, procedimentos, constantes e tipos organizados na forma de pacotes  Use  Indica quais partes do pacote da biblioteca serão utilizados  Conditional Signal Assignment  Identifica prioridades  Selected Signal Assignment  Necessita testar todos os valores do identificador  Biblioteca IEEE  Possui diversos pacotes para superar as limitações da linguagem ➢ std_logic_1164: Possui diversos estados além de '1' e '0' ➢ Operações matemáticas podem ser realizadas adicionando um dos seguintes pacotes: std_logic_arith, std_logic_signed ou std_logic_unsigned  Operador de concatenação  Usado para a manipulação de vetores
  • 76. Fundamentos de VHDL em LP v1.1 Descrição de Circuitos Sequenciais Descrição de Circuitos Sequenciais Módulo 4
  • 77. 77 Fundamentos de VHDL em LP v1.1 Neste módulo você vai ...  Aprender as construções utilizadas para descrever circuitos sequenciais  Reutilizar código  Utilizar construções mais complexas para geração de lógica combinacional  Aprender a usar variáveis em VHDL  Entender a diferença entre VHDL estrutural e comportamental  Utilizar os conceitos aprendidos para projetar um contador binário, um registrador circular e um contador BCD
  • 78. 78 Fundamentos de VHDL em LP v1.1 Asynchronous D-type Flip-Flop library ieee; use ieee.std_logic_1164.all; entity async_dff is port( d, clk, arst: in std_logic; q: out std_logic); end async_dff; architecture behavioral of async_dff is begin async_dff: process(clk, arst) begin if (arst='1') then q <= '0'; elsif(clk‘event and clk='1') then q <= d; end if; end process async_dff; end behavioral; d clk arst q async_dff d0 0X1 qclkarst lista de sensibilidade Como tornar síncrono?
  • 79. 79 Fundamentos de VHDL em LP v1.1 Synchronous D-type Flip-Flop library ieee; use ieee.std_logic_1164.all; entity sync_dff is port( d, clk,arst: in std_logic; q: out std_logic); end sync_dff; architecture behavioral of sync_dff is begin sync_dff: process(clk) begin if(clk‘event and clk='1') then if (rst='1') then q <= '0'; else q <= d; end if; end process sync_dff; end behavioral; d clk rst q sync_dff d0 01 qclkrst lista de sensibilidade Qual usar?
  • 80. 80 Fundamentos de VHDL em LP v1.1 Circuitos Síncronos  Process  Utilizados para descrever circuitos sequenciais  Código sequencial deve ser descrito entre identificadores begin e end  Sinais dentro da lista de sensibilidade indicam quando o processo deve ser executado  if/then/else  Análogo a construções if/then/elsif/else em linguagens de computadores  event  Atributo que indica mudança de estado do sinal (evento) process(clk) begin if (clk`event and clk='1') then if(ce = '1') then q <= d; end if; end if; if (clk`event and clk='1') then if(ce = '1') then q <= d; end if; end if; end process; Sintetizável?
  • 81. 81 Fundamentos de VHDL em LP v1.1 Atributos retorna true se declarado em ordem ascendented’ascending retorna true se ocorrer um eventod’event retorna limites do vetor (invertido)d’reverse_range retorna limites do vetord’range retorna comprimento do vetord’length retorna posição mais a direita do vetord’right retorna posição mais a esquerda do vetord’left retorna limite superiord’high retorna limite inferiord’low DescriçãoAtributo  Utilizados em conjunto com sinais
  • 82. 82 Fundamentos de VHDL em LP v1.0 Lab#06 – Contador Binário  Objetivo  Projetar um contador binário usando o Quartus II ou o ISE  Especificação  Descrever um contador de 30 bits que incremente a cada borda de subida de relógio  O contador deve voltar a zero após o estouro  Utilizar reset assíncrono  Usar um pino para controle do contador (habilitar/desabilitar função incrementar)  Sinais de reset e de incremento devem ser ativos em ‘0’  Ver cabeçalho do código VHDL localizado na pasta do laboratório para maiores detalhes
  • 83. 83 Fundamentos de VHDL em LP v1.1 Processos  Utilizado para descrever o comportamento de circuitos síncronos  Dois ou mais processos são executados concorrentemente  Não há limite de processos em um código  Podem ser utilizados para construir lógica combinacional  Utilizado na codificação de máquina de estados (FSM)  Pode utilizar variáveis  Escopo interno ao processo  Inicializável  Atualização imediata  Sinais são atualizados no final do processo  Diversas construções são permitidas internamente ao processo (if, wait, case e loop)
  • 84. 84 Fundamentos de VHDL em LP v1.1 Wait  Processo não pode conter lista de sensibilidade  Apresenta-se em 3 formas diferentes  wait until ➢ Aceita apenas um sinal ➢ Apropriado para descrição de circuitos síncronos ➢ Uso simular ao if process begin wait until (clk‘event and clk='1'); if (rst='1') then output <= "00000000"; elsif (clk‘event and clk='1') then output <= input; end if; end process;  wait on ➢ Aceita múltiplos sinais process begin wait on clk, rst; if (rst='1') then output <= "00000000"; elsif(clk‘event and clk='1') then output <= input; end if; end process;  wait for ➢ Utilizado em testbenches ➢ Não sintetizável process begin d_ff <= '0'; wait for 10 ns; d_ff <= '1'; wait for 10 ns; end process;
  • 85. 85 Fundamentos de VHDL em LP v1.1 Constantes  Devem ser declaradas dentro da arquitetura  Utilize letras maiúsculas para identificá-las (convenção)  Sintaxe constant name: type := value;  Exemplo architecture behavioral of example is -- declaração de constantes constant LOGIC_HIGH: std_logic := '1'; constant LOGIC_LOW : std_logic := ‘0'; begin -- ... end behavioral;
  • 86. 86 Fundamentos de VHDL em LP v1.1 Component 1/2  Permite criar níveis de hierarquia e reutilizar código  Modularização de projetos  Divider & Conquer  Utilizada para declarar qual módulo será utilizado  Sintaxe da declaração similar ao entity  Pode ter parâmetros genéricos  Componentes devem ser declarados entre architecture e begin library ieee; use ieee.std_logic_1164.all; entity top is generic( N: positive := 8; SYNC_DELAY : positive := 24); port( clk, rst: in std_logic; leds: out std_logic_vector(N-1 downto 0)); end top; architecture structural of top is component sync_counter is generic(N : positive := 24); port( clk, rst: in std_logic; sync: out std_logic); end component; component rotate_register is generic(N : positive := 8); port( clk, rst, rot: in std_logic; q: out std_logic_vector(N-1 downto 0)); end component; Declaração
  • 87. 87 Fundamentos de VHDL em LP v1.1 Component 2/2  Componentes devem ser instanciados entre begin e end  Não há limite para instâncias  São blocos de hardware  Port Map  Realiza as conexões entre os sinais de um componente e a arquitetura  Generic Map  Define os parâmetros da instância  Pode gerar instâncias diferentes  Arquivo topo de projetos normalmente descrito em nível estrutural begin -- instanciamento de componentes -- registrador de sincronismo sync_blk: sync_counter generic map(N => SYNC_DELAY) port map( clk => clk, rst => rst, sync=> sync_sig); -- registrador circular rot_blk: rotate_register generic map(N => N) port map( clk => clk, rst => rst, rot => sync_sig, q => leds); end structural; Instanciação
  • 88. 88 Fundamentos de VHDL em LP v1.1 Netlist Síntese VHDL Comportamental x Estrutural  VHDL comportamental  Utiliza construções da linguagem, tais como, process, signal conditional assignment, if/then/elsif/else, etc.  É o nível mais alto de codificação sync_blk clk rst sync rot_blk clk rst q rot top leds clk rst sync_sig  VHDL estrutural  Baseado em blocos de hardware já descritos  É a descrição mais próxima do hardware final  Netlist  Resultado da síntese  Contém todas as células do circuito (ASICs)
  • 89. 89 Fundamentos de VHDL em LP v1.0 Lab#07 – Registrador Circular  Objetivo  Aplicar os conceitos de hierarquia e instanciação de componentes  Especificação  Baseando-se no diagrama de blocos mostrado no slide anterior, desenvolver os blocos faltantes para o projeto ➢ sync_blk: deve emitir pulsos de sincronismo em períodos de tempo determinados pelo usuário (frequência do clock: 50MHz). ➢ rotate_register: deve rotacionar dados previamente inicializados em um registrador a cada borda de subida de relógio, apenas quando este estiver habilitado (rot = ‘1’, proveniente do sinal de sincronismo sync)  Utilize reset síncrono ativo em zero em ambos os blocos  Respeite a declaração dos blocos sync_counter e rotate_register conforme arquitetura topo (top.vhd)  Para maiores detalhes sobre os blocos a serem implementados, leia o cabeçalho dos arquivos sync_counter.vhd e rotate_register.vhd
  • 90. 90 Fundamentos de VHDL em LP v1.1 Case  Similar a construções case/switch em linguagens de programação  Testa múltiplas condições  when others ➢ utilizado para definir todos os outros possíveis estados ➢ algumas ferramentas de síntese exigem essa construção  null – operação nula  Utilizado na codificação de máquina de estados  Comando interno ao process library ieee; use ieee.std_logic_1164.all; entity sync_dff is port ( d, clk, rst: in std_logic; q: out std_logic); end sync_dff; architecture behavioral of sync_dff is begin process(clk) begin if (clk’event and clk='1') then case rst is when '1' => q <= '0'; when '0' => q <= d; when others => null; end case; end if; end process; end behavioral; recomendado, pois std_logic apresenta mais valores além de 0 e 1
  • 91. 91 Fundamentos de VHDL em LP v1.1 Loop  Similar a construções em linguagens de programação  Apresenta 2 formas  for .. loop (iterações fixas)  while .. loop (iterações variáveis)  Exit – sai do loop  Next – passa para a próxima iteração do loop bit_counter: process (clk) variable cnt_var: natural range 0 to N-1; begin if (clk'event and clk='1') then a_reg <= dat; cnt_var := 0; for i in 0 to N-1 loop case a_reg(i) is when '1' => cnt_var := cnt_var + 1; when others => null; end case; end loop; b_reg <= cnt_var; end if; end process bit_counter; variável signal ... 0 N-1 cnt_var = 0 1 0 1 1 0 1 1 0 1 ... b_reg a_reg
  • 92. 92 Fundamentos de VHDL em LP v1.1 Usando Variáveis  Escopo limitado ao processo onde foi declarada  Atribuição imediata  Utilizada na geração de circuitos combinacionais  Podem gerar caminhos combinacionais muito longos  O seu uso não correto pode gerar hardware desnecessário  Suportam os mesmos tipos que “signal” library ieee; use ieee.std_logic_1164.all; entity generic_adder is generic (N : positive := 8); port( a: in std_logic_vector(N-1 downto 0); b: in std_logic_vector(N-1 downto 0); cin: in std_logic; s: out std_logic_vector(N-1 downto 0); cout: out std_logic); end generic_adder; architecture behavioral of generic_adder is begin process(a, b, cin) variable carry: std_logic_vector(N downto 0); begin carry(0) := cin; for i in 0 to N-1 loop s(i) <= a(i) xor b(i) xor carry(i); carry(i+1) := (a(i) and b(i)) or (a(i) and carry(i)) or (b(i) and carry(i)); end loop; cout <= carry(N); end process; end behavioral; lógicacombinacional Você consegue desenhar a arquitetura da codificação ao lado?
  • 93. 93 Fundamentos de VHDL em LP v1.1 Variable x Signal  Signal  Apenas a última atribuição do processo é validada  Escopo limitado a arquitetura onde foi declarada  Utilizada na geração circuitos sequenciais e combinacionais  Variable  Atribuição imediata  Escopo limitado ao processo onde foi declarada  São construções auxiliares ao signal  Utilizada na geração circuitos combinacionais  Utilizada em funções, procedimentos e testbenches
  • 94. 94 Fundamentos de VHDL em LP v1.1 Lab#08 – Contador BCD up/down  Objetivo  Descrever lógica combinacional usando variáveis e processos  Especificação  Desenvolver um contador BCD que realiza a contagem de 0000 até 9999  Contador deve “virar” quando atingir 9999  Utilize variáveis para gerar o controle do contador BCD  Altere apenas o arquivo bcd_counter.vhd  Não altere a entidade  Reset assíncrono deve ser ativo em '0'  Sinal de incremento (up) e counter enable (ce) devem ser ativos em '1'  Trabalhe com “casas” para gerar o controle 0011 3 1001 9 0101 5 0001 1 unidade dezena centena milhar
  • 95. 95 Fundamentos de VHDL em LP v1.1 Lab#08 – Implementação Reuso de código!!! Xilinx Spartan 3 Altera Cyclone 2 Decodificador Display Contador BCD + Sincronizador
  • 96. 96 Fundamentos de VHDL em LP v1.1 Finalizando ...  Process  Construção básica para a geração de circuitos sequenciais  Variáveis  Atribuição imediata. Utilizada na geração de circuitos combinacionais  For .. loop/while  Utilizado em conjunto com variáveis para a geração de circuitos combinacionais  Exit/Next  Utilizados para sair ou pular de iterações em loops  VHDL Estrutural  Permite o desenvolvedor ter mais controle sobre a arquitetura desenvolvida  Saída das ferramentas de CAD, particularmente em projetos de ASICs  VHDL Comportamental  Permite a ferramenta de síntese inferir e ter mais controle sobre o hardware mais gerado
  • 97. Fundamentos de VHDL em LP v1.1 Descrição de Máquina de Estados em VHDL Descrição de Máquina de Estados em VHDL Módulo 5
  • 98. 98 Fundamentos de VHDL em LP v1.1 Neste módulo você vai ...  Entender as diferenças entre máquinas de Moore e Mealy  Identificar as vantagens e desvantagens de cada tipo de codificação de máquina de estados  Aprender a codificar circuitos digitais a partir de um diagrama de estados e operações RTL  Obter uma metodologia para a codificação de circuitos digitais
  • 99. 99 Fundamentos de VHDL em LP v1.1 Moore x Mealy  Moore  Saídas dependem do estado atual  Saídas síncronas  Requer mais estados  Mealy  Saídas dependem do estado atual + entradas  Saídas assíncronas  Requer menos estados
  • 100. 100 Fundamentos de VHDL em LP v1.1 Codificação de Estados  Registrador de estados pode apresentar diversas codificações para cada estado. Cada qual apresenta suas vantagens e desvantagens  One-Hot  Binary  Gray
  • 101. 101 Fundamentos de VHDL em LP v1.1 Binary  Estados representados na forma binária  Número reduzido de flip-flops (menos área)  Utilizado em arquiteturas onde não há exigência de performance  Lógica de decodificação e controle tende a ser maior em área  A mudança de estados normalmente exige um somador (carry chain) 000 001 011 100 010 arst = '0' btn = '0' btn = '1' btn = '0' btn = '1' btn = '0' btn = '1'
  • 102. 102 Fundamentos de VHDL em LP v1.1 One-Hot  Estados apresentam apenas 1 bit ativo (hot-bit)  Mudança entre estados ocasiona o chaveamento de 2 bits  Utilizado em arquiteturas onde um grande número de flip-flops estão disponíveis  Lógica de decodificação e controle tende a ser menor em área  Mudança de estados realizada através de deslocamento de bits 00001 00010 01000 10000 00100 arst = '0' btn = '0' btn = '1' btn = '0' btn = '1' btn = '0' btn = '1'
  • 103. 103 Fundamentos de VHDL em LP v1.1 Gray  Chaveamento entre estados altera apenas 1 bit  Reduz hazards e glitches  Alternativa para máquinas de Mealy  Indicado para arquiteturas low-power devido ao número reduzido de chaveamentos  Exige lógica especial para a troca de estados 000 001 010 110 011 arst = '0' btn = '0' btn = '1' btn = '0' btn = '1' btn = '0' btn = '1'
  • 104. 104 Fundamentos de VHDL em LP v1.1 FSMs em VHDL  Neste material, será abordado a descrição de FSMs do tipo Moore  Mais estados  Mais Estável (menos glitches)  Mais Simples  Metodologia de 2 processos  Processo RTL ➢ Descrição de operações ➢ Síncrono ➢ Representa o caminho de dados  Processo de decodificação de próximo estado ➢ Processo assíncrono ➢ Lógica combinacional  Facilita documentação ➢ Arquitetura pode ser documentada antes do código ➢ Evita “programação” ➢ Mais didática  Facilita portar arquitetura para VHDL e vice-versa
  • 105. 105 Fundamentos de VHDL em LP v1.1 FSMs em VHDL - Descrição  RTL  a_st ➢ a_cnt <= (others => '0');  b_st ➢ a_cnt <= a_cnt + 1;  c_st ➢ null;  d_st ➢ null;  FSM a_st b_st d_st c_st arst = '0' btn = '1' btn = '0' btn = '1' btn = '1' btn = '0' btn = '0'
  • 106. 106 Fundamentos de VHDL em LP v1.1 FSMs em VHDL - Processo RTL  RTL  a_st ➢ a_cnt <= (others => '0');  b_st ➢ a_cnt <= a_cnt + 1;  c_st ➢ null;  d_st ➢ null; rtl: process(clk) begin if(clk'event and clk='1')then case current_state is end case; current_state <= next_state; end if; end process rtl; Evita estados indesejáveis when a_st => a_cnt <= (others => '0'); when b_st => a_cnt <= a_cnt + 1; when c_st => null; when d_st => null; when others => null; Como o próximo estado é decodificado???
  • 107. 107 Fundamentos de VHDL em LP v1.1 FSMs em VHDL – Decodificação 1/3 fsm: process(current_state, arst, btn) begin  FSM a_st b_st d_st c_st arst = '0' btn = '1' btn = '0' btn = '1' btn = '1' btn = '0' btn = '0' if (arst = '0') then next_state <= a_st; else case current_state is when a_st => if (btn= '0') then next_state <= a_st; else next_state <= b_st; end if; when b_st => next_state <= c_st; Todos os sinais de entrada devem estar na lista de sensibilidade!!!
  • 108. 108 Fundamentos de VHDL em LP v1.1 FSMs em VHDL – Decodificação 2/3 when c_st => if (btn= '1') then next_state <= c_st; else next_state <= d_st; end if; when d_st => if (btn= '0') then next_state <= d_st; else next_state <= b_st; end if; when others => next_state <= a_st; end case; end if; end process fsm;  FSM a_st b_st d_st c_st arst = '0' btn = '1' btn = '0' btn = '1' btn = '1' btn = '0' btn = '0' Evita estados indesejáveis
  • 109. 109 Fundamentos de VHDL em LP v1.1 FSMs em VHDL – Decodificação 3/3 fsm: process(current_state, arst, btn) begin if (arst = '0') then next_state <= a_st; else case current_state is when a_st => if (btn= '0') then next_state <= a_st; else next_state <= b_st; end if; when b_st => next_state <= c_st; when c_st => if (btn= '1') then next_state <= c_st; else next_state <= d_st; end if; when d_st => if (btn= '0') then next_state <= d_st; else next_state <= b_st; end if; when others => next_state <= a_st; end case; end if; end process fsm;  FSM a_st b_st d_st c_st arst = '0' btn = '1' btn = '0' btn = '1' btn = '1' btn = '0' btn = '0' TODAS as condições devem estar definidas, caso contrário, elementos de memória serão inferidos (latches)!!!
  • 110. 110 Fundamentos de VHDL em LP v1.1 Arquitetura Resultante  Metodologia de 2 processos  Lógica de decodificação de próximo estado ➢ Processo assíncrono  Descrição de operações (RTL) ➢ Processo síncrono. Realiza operações entre registradores  Lógica de controle de operações  Inferida pela ferramenta de síntese  Pode ser realizado por um terceiro processo (maior controle sobre o hardware)
  • 111. 111 Fundamentos de VHDL em LP v1.0 Lab#09 – Contador Controlado 1/2  Objetivo  Usar a metodologia de 2 processos para descrever uma FSM  Especificação  Implementar um contador de 16 bits (0000 -> FFFF) que incremente a cada vez que um push button for pressionado por uma pessoa  O contador deve incrementar apenas uma vez. Desconsidere possíveis oscilações do push button. Inserir controle
  • 112. 112 Fundamentos de VHDL em LP v1.0 Lab#09 – Contador Controlado 2/2  Terminou???  Conecte o pino btn do arquivo topo diretamente em btn no bloco button_control, conforme mostrado na figura abaixo ➢ Quais as conseqüências práticas dessa ação? Porquê? ➢ Note que, as vezes, o contador é resetado. Porquê?  O que faz o arquivo digital_debouncer? Abra o código e analise. Desenhe.
  • 113. 113 Fundamentos de VHDL em LP v1.0 Lab#10 – Multiplicador 1/2  Objetivo  Descrever um multiplicador usando FSMs  Especificação  Descrever em VHDL um bloco que realize a multiplicação de dois números inteiros positivos  Os operandos devem ter 4 bits. Resultado em 8 bits  Verifique o cabeçalho do arquivo multiplier.vhd para obter maiores detalhes das funcionalidades dos pinos  Utilize a especificação mostrada na página a seguir
  • 114. 114 Fundamentos de VHDL em LP v1.0 Lab#10 – Multiplicador 2/2
  • 115. 115 Fundamentos de VHDL em LP v1.1 Finalizando ...  Variáveis  Em processos, utilize variáveis para gerar lógica combinacional. Caso contrário, use sinais.  Quando mal utilizadas em circuitos síncronos, longos caminhos combinacionais são inferidos  FSMs  Máquinas de Moore possuem mais estados, porém, são mais estáveis que as de Mealy  Evite estados indesejáveis com when others  Cubra todos os branches, caso contrário, latches serão inferidos  Jamais faça lógica com clock! Use clock enable controlado por sinais de sincronismo  Mantenha código comportamental (folhas) separado de código estrutural (topo)
  • 116. Fundamentos de VHDL em LP v1.1 AnexoAnexo
  • 117. 117 Fundamentos de VHDL em LP v1.1 Comentários e Editores  Comentários são essenciais para manter códigos reusáveis. Embora VHDL seja considerado por si mesmo documentado, procure comentar seu código  Inclua sempre cabeçalho no seu código, contendo informações sobre a arquitetura que você está descrevendo (autor, data de criação, revisões, propósito, interface do bloco, nome do arquivo, etc.)  Use um editor de textos que forneça edição de colunas e um estilo de indentação consistente (ver códigos exemplo). Como bons editores de texto freeware podemos citar  TextPad (http://www.textpad.com/)  Crimson Editor (http://www.crimsoneditor.com/)  jEdit (http://www.jedit.org/)  Procure evitar linhas maiores que 80 colunas. Isto prejudica a leitura do código quando impresso.
  • 118. 118 Fundamentos de VHDL em LP v1.1 Convenções para sinais  Use convenções para nomes de sinais  Sinais básicos ➢ clk – clock ➢ rst – reset síncrono ➢ arst – reset assíncrono ➢ ce – clock enable ➢ rdy –ready (handshake) ➢ dat – dados ➢ addr – address ➢ read – read memory ➢ write – write memory ➢ start – start (handshake)  Use sufixos  _reg – register  _cnt – counter  _ror – rotator  _sht – shifter  _sig – signal  _var - variable  _x2 – multiplied by 2  _div2 – divided by 2  _l – sinal ativo em ‘0’  _ff – flip-flop  Exemplos  dat_reg: reg. de dados  a_cnt: contador A  clk_x2: clock multiplicado por 2  ce_l: clock enable ativo em ‘0’

Notas do Editor

  1. Tabela de Revisões DataAutorVersão Descrição Nov/2009Alcides1.0Criação Jul/2013Alcides1.1Correção ortográfica e formatação Revisão e atualização de slides (47-61)
  2. * FSM: Finite State Machine (Máquina de Estados)
  3. Em meados de 2000, quando eu era um mero aluno de graduação de engenheira de computação da UFRGS, fiz um trabalho sobre o microcontrolador 8051. Este material, como parte de um programa que eu participava no momento, foi publicado na Internet através do servidor da universidade. Não fi Achei muito legal saber que meu material, mesmo hoje vendo que poderia ter sido muito melhor, deve ter ajudado muita gente por aí. Ainda hoje, quando busco pelo meu nome no Google, o mesmo material surge. Porque simplesmente escola técnica estou fazendo vi que meu algo totalmente inesperado. Agredeço a todos aqueles que viram algum valor no que eu fiz e replicaram por aí. é muito bom poder contribuir ser esperar Um livro fechado não tem valor algum até o momento que alguém abre para lê-lo. Bom curso!!! Alcides Silveira Costa Agosto de 2013
  4. O desenvolvimento da VHDL iniciou-se em 1981 pelo departamento de defesa dos Estados Unidos (DoD) para melhor gerenciar o ciclo de vida dos projetos de hardware, especificamente os projetos de circuitos integrados (CI). O custo de projetar uma nova versão de um CI estava tornando-se cada vez mais alto devido ao fato dos projetos estarem mal documentados. Para se ter uma ideia, cada componente do sistema era verificado utilizando ferramentas e linguagens de simulação incompatíveis. Era necessário uma linguagem que fosse capaz de ser utilizada em todos os projetos, independente de tecnologia ou metodologia utilizada. Referência Doulos, http://www.doulos.com/knowhow/vhdl_designers_guide/a_brief_history_of_vhdl/, Setembro de 2009.
  5. O Programa VHSIC teve participação da acadêmia e da indústria durante o seu processo de elaboração. O governo estadunidense atuou como um licitante do programa através de suas forças aéreas. Ao término do programa, os direitos da linguagem seriam de exclusividade do governo americano. Referências VHSIC Hardware Description (VHDL) Development Program, 20th DAC, 1983, Al Dewey, IEEE VHSIC Hardware Description (VHDL) Development Program, 21st DAC, 1984, Al Dewey, IEEE
  6. Referências VHSIC Hardware Description (VHDL) Development Program, 20th DAC, 1983, Al Dewey, IEEE Institute for Defense Analisys, http://www.ida.org/ TRW, http://en.wikipedia.org/wiki/TRW_Inc.
  7. Intermetrics, IBM e Texas Instruments vencem licitação do programa VHDL em Julho de 1983. O time recém formado apresentou uma solução eficaz envolvendo softwares e uma linguagem para a descrição de circuitos. Até a presente data, a IBM já havia desenvolvido diversas linguagens para a descrição de circuitos internamente a empresa. Porém, de acordo com o programa anunciado pelo DoD, o desenvolvimento da linguagem não poderia ser fechado e estava sujeito a revisões públicas. Em agosto de 1985, a versão final da linguagem, VHDL 7.2, foi lançada, sendo transferido os direitos da linguagem para a IEEE em fevereiro de 1986. Em março de 1988 a IEEE publica o primeiro manual de referência da linguagem. Feito isso, em 1988 o Departamento de Defesa dos EUA determina que todos os ASICs entregues devem ser descritos em VHDL. A melhor forma de fazer isso é utilizando a própria linguagem VHDL no processo de desenvolvimento do circuito, fato ocorrido no programa F-22 do DoD (proejto de um avião de combate). Para se ter uma ideia, naquela época, 50% dos dispositivos eletrônicos entregues ao DoD eram retrabalhados devido a problemas de interface com outros dispositivos. Referências A. Dewey, VHSIC Hardware Description (VHDL) Development Program, 21st Design Automation Conference, 1983; L. I. Maissel, H. Ofek, Hardware design and description languages in IBM, IBM Journal of Research and Development, pages 557-563, September 1984; Doulos, http://www.doulos.com/knowhow/vhdl_designers_guide/a_brief_history_of_vhdl/, Agosto de 2013; Rosenberg, Adam E; Harris, Tony; VHDL and it&amp;apos;s Application for Department of Defense Contracts,VIUF Proceedings, Spring 1993;
  8. Nas mãos da IEEE, a linguagem VHDL sofreu diversas revisões. Em 2011, a linguagem recebeu extensões para suportar construções analógicas e sinais mistos (1076.1.1-2011 - IEEE Standard for VHDL Analog and Mixed-Signal Extensions -- Packages for Multiple Energy Domain Support). No Brasil, VHDL é muito utilizado na academia e nas indústrias de desenvolvimento de equipamentos de telecomunicações. Já no mercado de semicondutores Brasileiro, Verilog é mais utilizado. Atualmente, ambas as linguagens são muito bem suportadas em diversas ferramentas de síntese* comerciais (Xilinx ISE, Altera Quartus II, Synopsys Synplify Pro, Cadence RTL Compiler, Microsemi Libero SoC, Synopsys Design Compiler). O fator determinante para a escolha de uma ou outra linguagem normalmente é definido pelo conhecimento já adquirido pela empresa em projetos anteriores.
  9. Um dos erros mais comuns ao começar a trabalhar com VHDL é supor que VHDL é uma linguagem de programação qualquer. Normalmente, as pessoas que pensam dessa forma acreditam que estão evoluindo rapidamente, até o momento que experimentam sair do simulador e sintetizar seu código em uma ferramenta comercial de síntese. O resultado é desastroso, para não dizer decepcionante. Eu passei por isso ... tive que reescrever todo o meu código novamente. Mas pelo menos aprendi a lição: não programamos circuitos, nós os descrevemos. Para isso, precisamos ter uma arquitetura em mente, rabiscar alguns esquemáticos em papel para, a partir daí, codificar em VHDL. É por isso que neste material todos os laboratórios irão sintetizar os circuitos desenvolvidos, para que você aprenda a descrever circuitos, e não a “programá-los”. Com tempo e prática não será mais necessário descrever o circuito “em papel” antes de codificá-lo. Você será capaz de codificá-lo diretamente e, acredite, inferir o circuito através de um código (ou seja, fazer o caminho inverso).
  10. Um somador pode ser descrito de várias formas. Podemos descrevê-lo através da representação de uma tabela verdade. Ou, também, podemos descrevê-lo através de um esquemático. A descrição é nada mais do que uma representação, uma codificação que utilizamos para representar algo. O mesmo somador pode ser descrito usando uma linguagem. Como descrevemos esse circuito em VHDL?
  11. O esquemático desse exemplo basicamente pode ser dividido em duas partes independentes: a saída “s” e a saída “cout”. Como VHDL não é uma linguagem de programação, não há uma ordem específica para descrever o circuito. Podemos descrever a lógica da saída “s” e depois a lógica da saída “cout”, e vice-versa. Ambas estão sendo “executadas em paralelo”. Após a descrição da arquitetura, devemos especificar o nome da arquitetura e indicar quais são as portas de entrada e de saída do circuito. Um dos erros mais comuns para os iniciantes é assumir que VHDL é uma linguagem de programação. É preciso enxergar a arquitetura no código, assim como enxergar o que deve ser codificado para criar uma arquitetura. Ter essa visão vai permitir depurar circuito de uma forma muito mais fácil, pois o desenvolvedor precisa entender qual hardware está descrito no código, e não simplesmente assumir que o código é uma linguagem de programação com instruções a serem executadas por cada linha.
  12. A entidade é a interface com o mundo externo. É nela que definimos a direção do sinal das portas. Em VHDL, cada porta pode assumir quatro modos, conforme mostrado a seguir: in: porta unidirecional. A arquitetura pode apenas ler os dados dessa porta. Utilizamos esse modo quando a arquitetura está sendo controlada por outro dispositivo (ex.: processador), ou quando a arquitetura está lendo dados de outro dispositivo (ex.:memória). out: porta unidirecional. O módulo pode apenas escrever dados nessa porta. Utilizamos esse modo quando a arquitetura que está controlando outros dispositivos (ex.: leds) ou quando a arquitetura está enviando dados para uma memória. inout: porta bidirecional. Utilizada em barramentos. Essa porta pode ser lida ou escrita pela arquitetura. buffer: porta bidirecional. A arquitetura pode escrever nessa porta e ler internamente. Porém, essa porta não pode ser escrita por outro dispositivo externo a arquitetura. Modo muito pouco utilizado.
  13. Projetos no Quartus II podem ser criados através do Project Wizard. Siga os passos a seguir: 1) Clique em “File &amp;gt; New Project Wizard”. Uma janela de introdução surgirá. Apenas clique em “Next”. 2) Digite o seguinte diretório de trabalho: C:\engineers\labs\01-full_adder\quartus. Todos os arquivos criados pelo Quartus II serão armazenados nesta pasta. Em seguida, digite o seguinte nome para o projeto e para a entidade topo: full_adder. Clique em “Next”. 3) Adicione o arquivo VHDL full_adder.vhd localizado em C:\engineers\labs\01-full_adder\vhdl. Clique em “Add...” para adicionar o arquivo ao seu projeto. Em seguida, clique em “Next”. 4) Informe o dispositivo EP2C20F484C7 para o seu projeto. Siga as informações mostrada na figura e clique em “Finish” quando concluir.
  14. Para sintetizar seu projeto para uma arquitetura-alvo (definido no slide anterior), siga os passos a seguir: 1) Em Project Navigator, clique na aba “Files”. Em seguida, clique com o botão direito do mouse sobre o arquivo full_adder.vhd. No menu que surgir, clique em “Open”. 2) Visualize a descrição do somador VHDL no editor de texto to Quartus II. Utilize a barra de ferramentas localizada no lado esquerdo do editor para se familiarizar-se com o ambiente de desenvolvimento. Clique no ícone “Analyze Current File”. A sintaxe do somador será analizado. Utilize sempre este comando para verificar se o seu código não possui nenhum erros de sintaxe antes de sintetizar ou simulador o código. 3) Clique no ícone “Templates”. Note que não há necessidade de decorar a sintaxe de nenhum comando VHDL, pois o Quartus II disponibiliza todos os gabaritos das construções da linguagem. Além disso, são oferecidos templates para outras linguagens (Verilog, SystemVerilog, TCL, etc). 4) Por fim, sintetize o somador clicando no menu “Processing &amp;gt; Start &amp;gt; Start Analyses &amp; Synthesis”. O mesmo comando pode ser executado clicando sobre o ícone “Start Analysis &amp; Synthesis” localizado na barra de tarefas. Esse comando, além de checar o código por erros de sintaxe, verifica se a semântica do código está correta. Verifique as mensagens localizadas no log de mensagens da ferramenta. Procure identificar quantos megabytes de memória foram utilizados para sintetizar este projeto. Sintaxe x Semântica Um código em VHDL pode não ter erros de sintaxe, mas possuir erros de semântica. Por exemplo, no código do somador, experimente trocar o atributo in na linha 42 por out. Em seguida, clique em “Analyze Current File” e em “Start Analysis &amp; Synthesis”. Note que tivemos um erro no segundo exemplo. Isso ocorre porque a sintaxe está correta, porém, quando a ferramenta analisa o código, ela verifica que não faz sentido as portas ”a”, “b” e “cin” serem saídas. Isso é um erro de semântica. É como dizer “O gelo está pegando fogo”. Sintaticamente, a frase está correta, mas não faz sentido.
  15. O Quartus II possui um simulador interno bem simples que pode ser utilizado para a verificação de pequenos módulos. Para isso, é necessário criar um arquivo de formas de onda (waveform). Siga os passos a seguir: 1) Clique no menu “File &amp;gt; New” 2) Em segida, selecione “Vector Waveform File” em “Verification/Debugging Files” e clique em “Ok”. Será criada uma nova aba no ambiente de desenvolvimento contendo o editor de formas de ondas do Quartus II. 3) Clique com o botão direito na região indicada na figura e selecione “Insert &amp;gt; Insert Node or Bus ...”. Uma nova janela irá se abrir. Clique em “Node Finder ...”. 4) Na janela que se abrir, selecione “Pins: all” na caixa “Filter”. Em seguida, clique no botão “List”. Todas as portas do somador serão listadas na caixa “Nodes Found”. 5) Selecione todos o nodos encontrados clicando no botão “&amp;gt;&amp;gt;” e clique em “Ok”. Você irá voltar para a janela anterior informando que vários nodos foram selecionados. Clique em “Ok” novamente. Os pinos selecionados “a”, “b”, “cin”, “s” e “cout” são mostrados na região a esquerda da janela Waveform1.vwf. Perceba que os valores de saídas “s” e “cout” não apresentam valores determinados. Isso ocorre porque a simulação não começou ainda, apenas o vetor de estímulos foi criado. Experimente criar estímulos de entradas clicando sobre os sinais de entrada “a”, “b”e “cin” utilizando os botões do lado esquerdo do editor. Utilize a ferramenta de zoom para aproximar e se afastar. Tente identificar as funcionalidades de cada ícone na barra de ferramentas.
  16. Para fazer uma verificação exaustiva no somador é necessário gerar todas as combinações possíveis entre as portas de entrada “a”, “b” e “cin”. Siga os passos a seguir: 1) Selecione a porta “a” e depois clique no botão “Count Value”. Será aberta uma nova janela. 2) Clique na aba “Timing” e insira o valor 1 na caixa “Multiply by” entre 1. Clique em “Ok”. 3) Em seguida, repita os mesmo passos para os sinais “b” e “cin”, trocando o valor na caixa “Multipy by” para 2 e 4, respectivamente. Dessa forma, você irá obter todas as combinações possíveis de entrada para verificar o somador. 4) Analisando o vetor de estímulos nota-se que apenas 80ns são necessários para verificar o somador. Troque o intervalo de simulação clicando no menu “Edit &amp;gt; End Time ...”. Em outros projetos pode ser necessário diminuir ou aumentar o intervalo de simulação. Por fim, salve o arquivo de estímulos clicando em “File &amp;gt; Save”. Utilze o nome sugerido pelo Quartus II. Não se esqueça de verificar se a opção “Add file to current project” está marcada antes de clicar em “Save”.
  17. O padrão do Quartus II é realizar simulações com atrasos, o que consome mais recursos de processamento. Como nesse treinamento estamos focados apenas na verificação funcional dos códigos em VHDL, precismos ajustar o Quartus II para realizar simulações sem atrasos, o qual também são mais rápidas. Siga os passos a seguir: 1) Clique “Assignments &amp;gt; Settings...”. Na janela que se abrirá em seguida, clique em “Simulator Settings”. Note que na caixa de seleção “Simulation Mode”, a opção “Timing” está selecionada. Troque para “Functional” e clique em “Ok”. Escolhendo essa opção, o Quartus II irá realizar uma simulação funcional de seu projeto, não levando em consideração atrasos referentes a propagação do sinal 2) Em seguida, clique em “Processing &amp;gt; Generate Functional Simulation Netlist”. Será gerado um netlist sem informações temporal para a simulação. Este será o netlist utilizado na simulação. 3) Por fim, clique em “Processing &amp;gt; Start Simulation”. Também é possível executar a simulação clicando sobre o botão “Start Simulation” localizado na barra de ferramentas. Analise o log da simulação e procure identificar quanto de memória foi utilizado. Em seguida, analise se os resultados do somador estão coerentes. Você pode analisar os resultados da saída do somador da seguinte forma: clique com o botão direito sobre o editor de ondas e selecione “Time Bar &amp;gt; Insert Time Bar ...”. Em seguida, marque a opção “Make master time bar” e clique em “Ok”. Percorra a time bar no editor de ondas e verifique o valor mostrado no lado esquerdo do gráfico, ao lado dos nomes das portas. Por fim, clique “Tools &amp;gt; Netlist Viwers &amp;gt; RTL Viewer”. Essa é a arquitetura inferida pelo Quartus II do somador.
  18. Verificado o somador, partimos para o processo mapear o somador para dentro da FPGA. Porém, antes de prosseguir, devemos indicar ao Quartus II onde as portas de entrada e saída do somador serão posicionadas. Siga os passos a seguir: 1) Clique em “Assignments &amp;gt; Pins” 2) O editor de pinos do Quartus II se abrirá (Pin Planner). Indique a localização de cada pino na parte inferior da ferramenta, conforme mostrado na figura. Entre com as seguintes localizações: a = PIN_L22 b = PIN_L21 cin = PIN_M22 cout = PIN_R19 s = PIN_R20 Note que a medida que os pinos vão sendo inseridos a posição dos mesmos são indicados na ferramenta. Feche o Pin Planner e volte para o Quartus II. 3) Clique em “Assignments &amp;gt; Device”. Em seguida, na janela que se abrir, selecione o menu “Device” clique no botão “Device and Pins Options...”. 4) Outra janela irá se abrir. Selecione a aba “Unused Pins”, escolha a opção “As input tri-stated” na caixa de seleção e clique em “Ok”. Você vai voltar para a janela anterior. Clique em “Ok” novamente. A escolha dessa opção informa ao Quartus II que todos os pinos não atribuídos serão definidos como pinos de entrada em alta-impedância (floating). Isso evita a FPGA danificar outros componentes na placa de desenvolvimento. Por fim, clique em “Processing &amp;gt; Start &amp;gt; Start Fitter”. O fitter vai mapear a lógica inferida pela síntese para a arquitetura interna do dispositivo lógico programável. Agora é necessário montar o arquivo contendo toda essa informação que será utilizado na programação da FPGA. Clique em “Processing &amp;gt; Start &amp;gt; Start Assembler”. Pronto!!! Agora é só programar o dispositivo e ver os resultados na prática.
  19. Siga os passos a seguir para programar a FPGA: 1) Clique no no menu “Tools &amp;gt; Programmer”. Ou diretamente no botão “Programmer” localizado na barra de ferramentas. 2) Na janela em que ser abrir, verifique se o arquivo full_adder.sof foi carregado (arquivo de configuração da FPGA). Caso contrário, clique no botão “Add File...” e carregue ele. Verifique também se o modo de programação está ajustado para JTAG. Clique no botão “Hardware Setup...”. 3) Em seguida, clique na aba “JTAG Settings”, clique depois em “Add Server...”. Neste treinamento, todos os exercícios serão programados através de uma placa de desenvolvimento conectada em um servidor remoto. É necessário o IP do servidor e o password para passar por essa etapa. Verifique com o seu instrutor. Após obter as informações para se conectar no servidor, clique em “Ok” e verifique se a conexão foi realizada com sucesso na tela anterior* (Connection Status Ok). 4) Clique na aba “Hardware Settings”, selecione “USB Blaster on ...” em “Currently Selected Hardware” e clique em “Close”. Agora, de volta a tela de programação da FPGA, marque a caixa “Program/Configure” e clique no botão “Start” para configurar o dispositivo**. Pronto!!! Verifique o funcionamento do full adder ligando e desligando as chaves seletoras SW0, SW1 e SW3 localizadas base do kit de desenvolvimento. Note que os leds vermelhos LEDR0 e LEDR1 serão ligados/desligados, confirmando o funcionamento do somador. Notas: * Firewall do servidor deve estar desativado ** O kit de desenvolvimento deve estar com a chave RUN/PROG posicionada em RUN para programar o dispositivo
  20. Fluxo de Projeto 1) Abra o Quartus II. Caso ele já esteja aberto, feche o projeto atual clicando em “File &amp;gt; Close Project”. 2) Em seguida, clique em “File &amp;gt; Open Project...” e selecione o arquivo decoder_2to4.qpf localizado em C:\engineers\labs\02-decoder_2to4\quartus. Abra o arquivo VHDL decoder_2to4.vhd localizado no Project Navigator com um duplo-clique. 3) O arquivo está vazio. Descreva a arquitetura conforme especificado. Para esse exercício, você irá precisar apenas dos operadores lógicos not e and. Você pode utilizar parenteses para definir precedências de operações. Utilize a estrutura do somador do exercício anterior como exemplo. 4) Verifique sua arquitetura através de simulação funcional. Não se esqueça de gerar o netlist. O arquivo de waveforms já está criado como todas as combinações de entrada possíveis. Não há necessidade de atribuir os pinos, pois estes já estão definidos. Concentre-se apenas na codificação e verificação da arquitetura. 5) Não execute todos os passos conforme mostrado no exercício anterior. Apenas clique em “Start &amp;gt; Start Compilation”. Todos os passos necessários até a geração do arquivo de configuração da FPGA (bitstream) serão executados. O Quartus II chama o conjunto desses passos de compilação. 6) Após compilar o projeto, programe a FPGA conectada ao servidor e verifique o resultado na placa de desenvolvimento. Os pinos do decodificador estão atribuídos conforme mostrado abaixo: en = SW9 a0 = SW0 a1 = SW1 r0 = LEDR0 r1 = LEDR1 r2 = LEDR2 r3 = LEDR3 Dica: você pode utilizar os templates disponibilizados pelo Quartus II. Para esse exercício, eles estão locallizados em “VHDL &amp;gt; Constructs &amp;gt; Expressions”.
  21. Entity &amp; Port entity entity_name is port ( port_name : signal_mode signal_type; port_name : signal_mode signal_type; … port_name : signal_mode signal_type); end entity_name; Onde, port_name: nome que define a porta do módulo signal_mode: pode ser in, out, inout (existe o tipo buffer, mas este é pouco utilizado na prática); signal_type: bit. Existem outros tipos que serão vistos em seguida. -------------------------------------------------------------------------------------------------------------------------------- Architecture architecture architecture_name of entity_name is Begin -- architecture description (this is a comment) end architecture_name; -------------------------------------------------------------------------------------------------------------------------------- Signal signal signal_name: type_name [:= initial_value]; Onde, initial_value: utilizado para definir um valor inicial (somente usando em simulação) type_name: bit_ bit_vetor, std_logic, integer, … mais tipos serão vistos em seguida.
  22. Referência: FPGA Fundamentals, http://www.pldesignline.com, Setembro de 2009.
  23. Referência: FPGA Fundamentals, http://www.pldesignline.com, Setembro de 2009.
  24. Referência: FPGA Fundamentals, http://www.pldesignline.com, Setembro de 2009.
  25. Referência: FPGA Fundamentals, http://www.pldesignline.com, Setembro de 2009.
  26. Referência: FPGA Fundamentals, http://www.pldesignline.com, Setembro de 2009.
  27. Referência: FPGA Fundamentals, http://www.pldesignline.com, Setembro de 2009.
  28. Referência: FPGA Fundamentals, http://www.pldesignline.com, Setembro de 2009.
  29. Referência: FPGA Fundamentals, http://www.pldesignline.com, Setembro de 2009.
  30. Referência: FPGA Fundamentals, http://www.pldesignline.com, Setembro de 2009.
  31. Referência: FPGA Fundamentals, http://www.pldesignline.com, Setembro de 2009.
  32. Referência: FPGA Fundamentals, http://www.pldesignline.com, Setembro de 2009.
  33. Referência: FPGA Fundamentals, http://www.pldesignline.com, Setembro de 2009.
  34. Referência: Cyclone II Device Handbook, Volume 1, Section I, Chapter II, Fevereiro de 2008.
  35. Referência: Cyclone II Device Handbook, Volume 1, Section I, Chapter II, Fevereiro de 2008.
  36. Referência: Cyclone II Device Handbook, Volume 1, Section I, Chapter II, Fevereiro de 2008.
  37. Referência: Spartan 3 FPGA Family Datasheet, DS099, 25 de Julho de 2008.
  38. Referência: Spartan 3 FPGA Family Datasheet, DS099, 25 de Julho de 2008.
  39. Referência: Spartan 3 FPGA Family Datasheet, DS099, 25 de Julho de 2008.
  40. Referência: CoolRunner II CPLD Family, DS090, 11 de setembro de 2008.
  41. Referência: Max II Handbook, Section I, Chapter II, Max II Architecture, Agosto de 2009.
  42. Conditional signal assignment descreve multiplexadores. A condição define a lógica que será utilizada na entrada do sinal de seleção do multiplexador. O resultado dessa condição tem que ser booleano. Todas as condições mostrada na tabela acima podem ser utilizadas no conditional signal assignment, resultado em um circuito multiplexador. Note que VHDL pode descrever várias arquitetura em um mesmo código. Porém, caso você faça isso, será necessário utilizar uma configuração no final do seu código para poder indicar as ferramentas qual arquitetura será utilizada. Por exemplo, para selecionar a arquitetura highlevel no exemplo acima, devemos utilizar o seguinte código ao final da descrição: configuration cfg of teste is for highlevel end for; end cfg; Pode haver casos em que você como projetista deseje criar uma nova arquitetura mais otimizada sem perder a descrição da arquitetura anterior. Nesse caso, uma solução seria adicionar a nova descrição no mesmo arquivo e utilizar uma configuração para selecionar a arquitetura deseja. Outro exemplo prático seria utilizar diferentes arquiteturas para diferentes tecnologias alvos. Por exemplo, você pode ter duas arquiteturas descritas, uma para ser utilizada em FPGAs da Xilinx e outra da Altera.
  43. Configuration define qual arquitetura será utilizada. Porém, as portas de entrada e saídas não podem ser alteradas (a interface de IO deve permanecer a mesma).
  44. A construção “generic” usualmente está associada com o tamanho dos vetores de dados nas arquiteturas. Isso permite realizar arquiteturas que podem ser utilizadas com diversos tamanho de barramentos, tornando-as mais genéricas. Como exemplo, podemos citar unidades lógicas e aritméticas que podem ser transformadas de 16 para 32 bits com apenas a alteração de um parâmetro genérico. Apesar de ser possível criar vetores com a construção “to”, sugere-se fortemente a construção “downto”. Usando “downto”, o bit mais significativo do vetor vai estar na esquerda e será ser interpretado corretamente por simuladores. Além disso, a adoção de um padrão para a criação de vetores evita o “crossover” de sinais entre vetores downto e to. erros de atribuição entre vetores. Note que as construções selected signal assignment e conditional signal assignment podem ter diversas condições, dependendo do tamanho vetor de comparação. Note também que vetores, quando explícitos, são representados por aspas duplas (“). Portanto, temos: Aspas simples: representam bits. Ex: &amp;apos;1&amp;apos; e &amp;apos;0&amp;apos; Aspas duplas: representam vetores de bits. Ex: “10101010” Vetores pode ser representados em binário, octal e decimal. Vamos utilizar o número 170 decimal para representá-lo em VHDL: Binário: B”10101010” ou “10101010” Hexadecimal : X”AA” Octal: O”252” Lembre-se de usar aspas simples (&amp;apos;) quando representar bits.
  45. Fluxo de Projeto 1) Abra o Quartus II. Caso ele já esteja aberto, feche o projeto atual clicando em “File &amp;gt; Close Project”. 2) Em seguida, clique em “File &amp;gt; Open Project...” e selecione o arquivo display_decoder.qpf localizado em C:\engineers\labs\03-display_decoder\quartus. Abra o arquivo VHDL display_decoder.vhd localizado no Project Navigator com um duplo-clique. 3) O arquivo está vazio. Descreva a arquitetura conforme especificado. Utilize os slides do treinamento como referência. 4) Verifique sua arquitetura através de simulação funcional. Não se esqueça de gerar o netlist. O arquivo de waveforms já está criado como todas as combinações de entrada possíveis. Não há necessidade de atribuir os pinos, pois estes já estão definidos. Concentre-se apenas na codificação e verificação da arquitetura. 5) Após simulação, clique em “Start &amp;gt; Start Compilation”. Todos os passos necessários até a geração do arquivo de configuração da FPGA (bitstream) serão executados. 6) Após compilar o projeto, programe a FPGA conectada ao servidor e verifique o resultado na placa de desenvolvimento. Os pinos do decodificador estão atribuídos conforme mostrado a seguir: en = SW9, bin(0) = SW0, bin(1) = SW1, bin(2) = SW2 e bin(3) = SW3. Lembre-se que o display de 7 segmentos usa lógica inversa (segmentos são ligados em zero). Dica: primeiramente, valide a arquitetura sem o pino de habilitar/desabilitar Terminou? Então tente novamente fazendo as seguintes alterações: 1) Quando a porta “en” estiver habilitada, ligue o led LEDR9 para indicar que o display está habilitado (PIN_R17) 2) Quando o display indicar uma letra (A, B, C, D, E ou F), habilite o led LEDG0 (PIN_U22)
  46. O tipo bit, por representar apenas sinais lógicos &amp;apos;1&amp;apos; e &amp;apos;0&amp;apos; possuía limitações para representar outros estados que ocorrem durante a simulação de circuitos digitais, como pequenos curtos no chaveamento de barramentos, sinais não inicializados, sinais conectados a resistores de pull-up/pull-down conectados a outros sinais, etc. Todas essas limitações levaram a IEEE revisar a linguagem e, em março de 1993, lançar uma extensão ao padrão IEEE Std 1076-1993: IEEE Standard Multivalue Logic System for VHDL Model Interoperability, também conhecido apenas por Std_logic_1164. Em suma, o padrão std_logic_1164 acrescenta lo tipo std_ulogic a linguagem VHDL contendo os seguintes estados: Uninitialized (&amp;apos;U&amp;apos;): sinais não inicializados em simulações Forcing Unknown (&amp;apos;X&amp;apos;): curtos em barramentos, valores não definidos, curtos em geral Forcing Zero (&amp;apos;0&amp;apos;): sinal conectado a gnd Forcing One (&amp;apos;1&amp;apos;): sinal conectado a vdd High Impedance (&amp;apos;Z&amp;apos;): sinal em alta impedência, barramentos flutuando, buffers tri-state Weak Unknown (&amp;apos;W&amp;apos;): terminação de barramentos Weak Zero (&amp;apos;L&amp;apos;): sinais conectados em resitores pull-down Weak One (&amp;apos;H&amp;apos;): sinais conectados em resitores pull-up Don’t Care (&amp;apos;-&amp;apos;): usado em síntese e simulação avançada É importante saliente que o std_ulogic possui um subtipo std_logic, o qual será analisado mais a frente. O tipo bit e bit_vector são utilizados apenas didaticamente. Em projetos reais, utilize sempre o tipo standard_logic.
  47. Para cada operador lógico (and, xor, nor not, etc) existe uma tabela verdade associada. Essa tabela verdade é percorrida pelo simulador para identificar a saída da operação lógica. A tabela acima, por exemplo, mostra a tabela verdade para o operador lógico AND. Segue alguns comentários abaixo: Sinais não inicializados (&amp;apos;U&amp;apos;) na entrada de uma porta AND são propagados, com exceção de zero (&amp;apos;0&amp;apos;) ou zero fraco (&amp;apos;L&amp;apos;). A propagação de sinais não inicializados permite ao desenvolvedor identificar, por exemplo, partes do circuito não resetadas corretamente; Sinais desconhecidos (&amp;apos;X&amp;apos;) na entrada de uma porta AND são propagados,com exceção de zero (&amp;apos;0&amp;apos;) ou zero fraco (&amp;apos;L&amp;apos;). Lembre-se que uma porta AND será zero na saída sempre que um sinal de entrada for zero, independente dos outros sinais de entrada. Caso tenha curiosidade de entender mais sobre o porquê disso, pesquise a arquitetura uma porta CMOS AND para maiores detalhes (ou fale com o instrutor). Para os sinais zero (&amp;apos;0&amp;apos;), zero fraco (&amp;apos;L&amp;apos;), um (&amp;apos;1&amp;apos;) e um fraco (&amp;apos;H&amp;apos;) a tabela verdade retorna o sinal esperado para o operador AND Ambos os tipos std_logic e std_ulogic utilizam a mesma a tabela verdade para resolução de sinais.
  48. Existe uma diferença muito importante entre os tipos std_logic e std_ulogic: o tipo std_ulogic não resolve conflitos de sinais. Por exemplo, caso o circuito digital tenha um curto, mesmo que por um pequeno instante de tempo como no chaveamento de barramentos, o tipo std_ulogic não consegue resolver e propagar esse sinal. Por isso o nome std_ulogic, onde o “u” significa unresolved. Na prática, quando utilizamos tipos std_ulogic, o simulador não consegue resolver o conflito e pára a execução, indicando o erro. Já para o tipo std_logic, a simulação continua, pois o tipo std_logic possui uma função que analisa a tabela acima para a resolução dos conflitos. Note que na maiorias dos casos, o sinal resultante é o tipo desconhecido (&amp;apos;X&amp;apos;). Pois então vem a pergunta, quando devemos utilizar std_logic e std_ulogic??? Depende. Em casos o onde o circuito não tenha curtos, o tipo std_ulogic pode ser utilizado. Porém, os tipos std_ulogic e std_logic são incompatíveis. Portanto, caso esse mesmo circuito se conecte com um módulo externo contendo sinais std_logic, será necessário alterar o tipo de todos os sinais para std_logic. Na prática, para melhorar o reuso de código em empresas, é adotado o padrão std_logic, pois este é mais abrangente que o std_ulogic. Neste treinamento, iremos utilizar apenas std_logic.
  49. A biblioteca ieee pode ser localizada nas ferramentas de projetos nos seguintes locais: Xilinx ISE - C:\Xilinx\11.1\ISE\vhdl\src\ieee Altera Quartus II - C:\altera\90sp2\quartus\libraries\vhdl\ieee Note que é apenas um diretório. Abra o arquivo std_logic_1164.vhd (Xilinx) ou std_1164.vhd (Altera) e analise os tipos std_logic e std_ulogic. Note que o tipo std_logic, na realidade, é um subtipo resolved do std_ulogic. Apesar de não ser mencionado anteriormente, os tipos bit e bit_vector estão definidos no pacote standard localizados em Xilinx ISE - C:\Xilinx\11.1\ISE\vhdl\src\std Altera Quartus II - C:\altera\90sp2\quartus\libraries\vhdl\std Estes são declarados implicitamente no seu código, sempre. Seria com ter a seguinte construção: library std; use std.standard.all; Abra o arquivo standard.vhd. Note que não apenas os tipos bit e bit_vector estão definidos, como também os tipos básicos da VHDL (boolean, bit, character, integer, real, time, ...). Há necessidade de decorar todos os tipos??? Claro que não!!! Verifique os tipos definidos nas bibliotecas e suas respectivas funções para poder utilizá-los. Saber encontrar a informação é muito mais importante do que saber a informação. Focalize em aprender onde está a informação nas ferramentas de projeto, e não em decorar tipos, comandos, funções, etc.
  50. Note que o tipo de dados std_logic_vector não possui operadores de deslocamento (shift/rotate). Nesse caso, é necessário utilizar o operador de concatenação.
  51. O ISE é o ambiente de desenvolvimento da Xilinx. Através dele é possível realizar todos os passos do fluxo de projetos de FPGAs (síntese, simulação, posicionamento, roteamento e programação). Primeiramente, será necessário criar um projeto. Para isso, siga os passos a seguir: 1) Clique em “File &amp;gt; New Project”. Na janela que vai se abrir, entre com as seguintes informações nos campos a seguir: Name: ise Location: C:\engineers\labs\04-generic_lu\ise Description: Unidade lógica genérica. Certifique se a caixa em “Top-lovel source type” esteja selecionada em “HDL”. Clique em “Next”. 2) Em “Device Properties”, é necessário configurar o tipo de FPGA que será utilizado neste laboratório. Entre com os seguintes dados: Product Category: General Purpose Family: Spartan3 Device: xc3s200 Package: ft256 Speed: -4 Synthesis Tool: XST (VHDL/Verilog) Simulator: ISim (VHDL/Verilog) Preferred Language: VHDL Deixe os outros campos inalterados e clique em “Next”. Clique em “Next” novamente na tela a seguir. 3) Adicione os arquivos do projeto. Clique no botão “Add source” e adicione o arquivo generic_lu.vhd e generic_lu_tb.vhd, localizado em C:\engineers\labs\04-generic_lu\vhdl. Desmarque a caixa “Copy to Project” e clique em “Next”. Confira os dados e clique em “Finish”. 4) Uma tela aparecerá informando que os arquivos foram adicionados. Note que um dos arquivos foi associado como um arquivo de simulação. Clique em “Ok”.
  52. O ambiente de desenvolvimento da Xilinx oferece diferentes ações dependendo do tipo de arquivo que é selecionado. Por exemplo, o arquivo generic_lu_tb.vhd é um arquivo de simulação (testbench) que contém estímulos de entrada para o arquivo de design. Por enquanto, entenda o arquivo de testbench como sendo uma representação textual em VHDL do arquivo waveform utilizado no Quartus II. Para simular a unidade lógica, siga os passos abaixo: 1) Em “Sources for:”, selecione “Behavioral Simulation”. Note que apenas os arquivos necessários para realizar uma simulação comportamental (simulação funcional) serão mostrado. 2) De um duplo clique sobre o arquivo generic_lu_tb (testbench) na janela “Hierachy”. O arquivo de testbench será aberto no ambiente de desenvolvimento. Apenas leia os comentários no cabeçalho e tente entender um pouco a estrutura co arquivo.  Caso o arquivo esteja desformatado, clique em “Edit &amp;gt; Preferences”. Em seguida, selecione a categoria “ISE Text Editor” e entre com o valor 4 no campo “Tab Width”. Todos os arquivos nesse curso foram formatados com espaçamento 4 e os editores devem ser configurados para isso. Clique em “Ok”. 3) Em “Processes”, clique em “Behavioral Check Sintax” e, em seguida, “Simulate Behavioral Model”. O simulador ISim será executado. Este irá compilar os códigos VHDL (projeto e testbench) e simular o projeto. 4) Utilize a barra de ferramentas ao lado dos estímulos para se familiarizar-se com o simulador. Dê um duplo clique sobre vetores. Clique com o botão direto sobre os sinais e veja as opções que você tem disponível. Note que simulação parou em 1us. Caso queira continuar a simulação por mais um 1us, clique em no botão indicado em vermelho na figura acima. Verifique o comportamento da unidade lógica na simulação tendo em mente as seguintes operações: Sel = &amp;quot;000&amp;quot; (and), sel = &amp;quot;001&amp;quot; (or), sel = &amp;quot;010&amp;quot; (xor), sel = &amp;quot;011&amp;quot; (pass), sel = &amp;quot;100&amp;quot; (nand), sel = &amp;quot;101&amp;quot; (nor), sel = &amp;quot;110&amp;quot; (xnor) e sel = “111” (not). Após análise, feche o simulador. Nota: As operações unárias pass e not são em relação ao operando A.
  53. Para sintetizar o projeto,O processo de s[intes 1) Clique em “Sources for:” e selecione “Implementation”. Note as opções que a janela “Processes” vai mudar suas opções. Abra o arquivo generic_lu.vhd dando um duplo clique generic_lu. Analise o código da unidade lógica. Note que ela é parametrizada para implementar operações entre dois operandos de qualquer de bits. 2) Em “Processes”, clique com o botão direito sobre “Synthesize – XST &amp;gt; Run”. Aguarde alguns instantes até o processo de síntese encerrar. Abra o menu “Synthesize – XST” e dê um duplo sobre “View RTL Schematic”. Selecione todos os sinais, adicione-os clicando em “Add -&amp;gt;” e crie o esquemátic clicando em “Create schematic”. 3) Analise o esquemático da unidade lógica. Note que o projeto não passa de portas lógicas conectadas a um multiplexador e o flag zero é apenas uma porta AND de todas as saídas. Volte ao código VHDL e procure identificar as construções da linguagem que geraram cada parte do esquemático. Feche o esquemático e clique na lampadinha localizada na barra de ferramentas. Note que, assim como o Quartus II, você tem acesso a todas construções da linguagem … não há necessidade de decorar.
  54. Para atribuir os pinos nesse projeto é necessário utilizar a ferramenta PlanAhead. Siga os passos abaixo: 1) Em “Processes”, abra o PlanAhead no menu “User Constraints”, clicando sobre “I/O Pin Planning (PlanAhead) - Post Synthesis”. A ferramenta irá informar que deverá criar e adicionar um arquivo UCF ao projeto (arquivo de constraints). Aguarde alguns instantes enquanto o PlanAhead é inicializado. 2) Calma, não se assuste!!! Em I/O Ports, clique no botão “Expand All”, conforme indicado na figura. A árvore de sinais de I/O será expandida. Em seguida, selecione a porta de saída s[0]. 3) Note que janela “I/O Port Properties” vai alterar. Clique na aba “General” e insira a localização do porta de s[0] no campo “site”. Em seguida, clique em “Apply”. Repita a operação para todas as outras portas, seguindo os passos 2 e 3, usando as informações abaixo: “s[0] = K12”, “s[1] = P14”, “s[2] = L12”, “s[3] = N14” “a[0] = F12”, “a[1] = G12”, “a[2] = H14”, “a[3] = H13” “b[0] = J14”, “b[1] = J13”, “b[2] =K14”, “b[3] = K13” “sel[0] = M13”, “sel[1] = M14”, “sel[2] = L13” “z = P11” Note que quando você seleciona uma porta, esta é mostrada no floorplan do encapsulamento. Clique em “File &amp;gt; Save Project” e feche o PlanAhead. Voltando ao ISE, o arquivo generic_lu.ucf estará junto com o arquivo de projeto. Clique sobre ele e, em seguida, clique em “Edit Constraints (Text)” na janela “Processes”. Analise a sintaxe do arquivo de constraints. Perceba que seria muito mais rápido adicionar a localização das portas textualmente do que pela interface gráfica. 4) Por fim, selecione novamente o arquivo generic_lu.vhd e clique em “Implement Design” localizado na janela “Processes”. O ISE irá executar o posicionamento dos elementos lógicos na FPGA (baseado no esquemático gerado na síntese) e roteá-los.
  55. Neste treinamento, o dispositivo lógico programável será programado através de um servidor remoto conectado a um kit de desenvolvimento. Siga os passos abaixo: 1) Em “Processes”, clique em “Generate Programming File &amp;gt; Process Properties”. 2) Na janela que se abrir, em “Configuration Options”, escolha a opção “Float” na caixa de seleção “Unused IOB Pins”. Em seguida, selecione “JTAG Clock” em “FPGA Start-Up Clock” no menu “Startup Options” e clique em “Ok”. De volta ao ambiente de desenvolvimento, dê um duplo clique sobre “Generate Programming File”. O arquivo de configuração da FPGA será gerado (generic_lu.bit). 3) Dê um duplo “Configure Target Device”. O ISE irá alertar que será necessário abrir o iMPACT, ferramenta para configuração da FPGA. Clique em “Ok”. Dentro do iMPACT, dê um duplo clique em “Boundary Scan”. Clique com o botão direito na janela a direita e selecione “Cable Setup ...”. 4) Na janela em que se abrir, entre com a seguintes informações: Communication Mode: Parallel Cable IV TCK Speed/Baud Rate: Default Speed Cable Location: Remote Port: LPT1 Host Name: 192.168.0.102 Clique em “Ok”. Você vai voltar para a tela do iMPACT. A seguinte* mensagem deve aparecer no log da ferramenta: Server Name = &amp;lt;ip do servidor&amp;gt;, Port = &amp;lt;porta do servidor&amp;gt; Notas: * Firewall do servidor deve estar desativado e software do servidor deve estar rodando (CableServer.exe localizado em C:\Xilinx\11.1\ISE\bin\nt)
  56. 5) Voltando para a tela anterior, clique com o botão direito sobre a janela da direta do iMPACT (em branco) e selecione “Initialize Chain”. Os dispositivos encontrados na cadeia de scan da placa de desenvolvimento serão reconhecidos. Clique em “Yes” para adicionar selecionar o arquivo de configuração da FPGA. 6) Na primeira janela, clique em generic_lu.bit e “Open”. Na segunda janela, apenas clique em “Bypass”. 7) Nessa janela, não altera nada. Apenas clique em “Ok”. 8) Por fim, clique com o botão direito sobre o dispositivo xc3s200 e selecione “Program”. Aguarde alguns instantes até a FPGA ser configurada*. Pronto!!! Verifique o funcionamento da unidade lógica na placa desenvolvimento. Operando A: SW3 .. SW0=a[3..0] Operando B: SW7 .. SW4=b[3..0] Seleção: BTN2 .. BNT0=sel[2..0] Saída: LD3 … LD0=s[3..0] Flag zero: LD7 Nota: * Os jumpers do kit de desenvolvimento devem estar na seguinte configuração: “JP1=on”, “M0=off”, “M1=on” e “M2=off”.
  57. Fluxo de Projeto 1) Abra o ISE. Caso ele já esteja aberto, feche o projeto atual clicando em “File &amp;gt; Close Project”. 2) Em seguida, clique em “File &amp;gt; Open Project...” e selecione o arquivo ise.xise localizado em C:\engineers\labs\05-generic_alu\ise. Abra o arquivo VHDL generic_alu.vhd no ambiente de projeto. Não altere a entidade. 3) O arquivo está vazio. Descreva a arquitetura conforme especificado. Utilize os slides do treinamento como referência. 4) Simule a ULA através do ISim. Mude a base das portas clicando com o botão direito sobre uma porta e selecionando “Radix &amp;gt; Unsinged Decimal”. O arquivo de testbench já está criado com todas as combinações de entrada possíveis. Não há necessidade de atribuir os pinos, pois estes já estão definidos no arquivo generic_alu.ucf. Concentre-se apenas na codificação e verificação da arquitetura. 5) Após simulação, realize todos os passos necessários para gerar o arquivo de configuração do dispositivo (arquivo bitstream). 6) Feito isso, programe a FPGA conectada ao servidor e verifique o resultado na placa de desenvolvimento. Os pinos foram atribuídos conforme mostrado a seguir: Operando A: SW3 .. SW0=a[3..0] Operando B: SW7 .. SW4=b[3..0] Seleção: BTN3 .. BNT0=sel[3..0] Saída: LD3 … LD0=s[3..0] Flag zero: LD7 Flag carry: LD6 Veja comentários no código VHDL para maiores informações. Dica: utilize o código da unidade lógica como base para este projeto.
  58. Library &amp; Use library &amp;lt;library_name&amp;gt;; use &amp;lt;library_name&amp;gt;.&amp;lt;package_name&amp;gt;.&amp;lt;package_parts&amp;gt;; Onde, library_name: nome da biblioteca, normalmente o nome de um diretório (ex: std, ieee) package_name: nome do pacote dentro da biblioteca, normalmente um arquivo dentro do diretório da biblioteca (ex: std_logic_1164)) package_parts: conteúdo dentro do pacote que será utilizado -------------------------------------------------------------------------------------------------------------------------------- Conditional Signal Assignment &amp;lt;target&amp;gt; &amp;lt;= &amp;lt;value&amp;gt; when &amp;lt;condition&amp;gt; else &amp;lt;value&amp;gt; when &amp;lt;condition&amp;gt; else … &amp;lt;value&amp;gt;; Onde, &amp;lt;target&amp;gt;: signal &amp;lt;value&amp;gt;: signal, literal, constante &amp;lt;condition&amp;gt;: condição expressa na forma de uma igualdade -------------------------------------------------------------------------------------------------------------------------------- Selected Signal Assignment with &amp;lt;expression&amp;gt; select &amp;lt;target&amp;gt; &amp;lt;= &amp;lt;value&amp;gt; when &amp;lt;choices&amp;gt; &amp;lt;value&amp;gt; when &amp;lt;choices&amp;gt; ... &amp;lt;value&amp;gt; when others; Lembre-se que você pode verificar a sintaxe de cada comando VHDL diretamente no ambiente de desenvolvimento.
  59. Processos são executados toda a vez que um sinal na lista de sensibilidade alterar o seu estado.
  60. É importante salientar que, apenar do código ser simulável, muitas vezes ele não é compilável. Por exemplo, no código acima, a descrição exige um flip-flop que seja sensível a borda de subida e descida. Como esse tipo de flip-flop não está presente em muitas arquiteturas de FPGA, o sintetizador irá sinalizar com um erro. Porém, um simulador não sinalizará nem um warning. Process [label:] process (sensitivity list) [variable name type [range] [:= initial_value;]] begin (sequential code) end process [label]; Onde, label: rótulo de identificação do processo sensitivy_list: processo é executado sempre que algum sinal desta lista mudar variable: variável restrita ao processo(será visto mais adiante) sequential code: seção de código seqüencial -------------------------------------------------------------------------------------------------------------------------------- if/then/elsif/else if conditions then assignments; elsif conditions then assignments; ... else assignments; Onde, conditions: retorna um resultado booleando (verdadeiro ou falso) assignments: atribuições de sinais
  61. Fluxo de Projeto Neste laboratório você terá a opção de escolher qual o ambiente de desenvolvimento. Siga os passos abaixo: 1) Escolha um ambiente de desenvolvimento (Quartus II ou ISE). Em seguida, abra o arquivo de projeto localizado em C:\engineers\labs\06-binary_counter\&amp;lt;environment&amp;gt;, onde environment é o nome da pasta do ambiente de desenvolvimento. Abra o arquivo VHDL binary_counter.vhd no ambiente de projeto. 2) O arquivo está vazio. Descreva a arquitetura conforme especificado. Utilize os slides do treinamento como referência. Veja comentários no código VHDL para maiores informações. 3) Verifique o seu contador. O arquivo de estímulos já está criado (testbench ou waveform). Não há necessidade de atribuir os pinos, pois estes já estão definidos. Concentre-se apenas na codificação e verificação da arquitetura. 4) Programe a FPGA conectada ao servidor e verifique o resultado na placa de desenvolvimento. Os pinos foram atribuídos conforme mostrado a seguir: Placa Spartan III Reset: SW7=arst_l Incremento: SW0=inc_l Saída: LD7 … LD0=cnt[29..22] Placa Cyclone II Reset: SW0=arst_l Incremento: SW9=inc_l Saída: LEDG7 … LEDG0=cnt[29..22] Note que apenas os 8 bits mais significativos foram mapeados para os leds da placa. Terminou? Experimente realizar o projeto no outro ambiente de desenvolvimento.Muito fácil? Adicione uma feature ao projeto para decrementar o contador. Não altere a entidade. Depois, compare o netlist RTL gerado por ambas as ferramentas.
  62. Wait Sintaxe: wait until signal_condition; wait on signal1 [, signal2, ... ]; wait for time;
  63. No exemplo acima, os componentes sync_counter e rotate_register são utilizados. ------------------------------------------------------------------------------------------------------------------------------------------ Component (declaração) component component_name is generic( generic_name : type := value; … ); port( port_name : signal_mode signal_type; … ); end component;
  64. Para usar componentes, você deve indicar ao ambiente de desenvolvimento o onde os arquivos se encontram. Caso contrário, os componentes não poderão ser utilizados. No exemplo acima, o sinal sync_sig deve ser criado. -------------------------------------------------------------------------------------------------------------------------------- Component (instanciação) instance_name: component_name generic map( generic_name =&amp;gt; value, … ) port map( port_name =&amp;gt; signal_name, … );
  65. Descrever o código em VHDL estrutural permite ter mais controle sobre o hardware gerado. Porém, exige muito mais trabalho. Em FPGAs, a descrição estrutural é utilizada na instanciação de componentes macros, tais como blocos de memória, PLLs, SERDES (SERializer-DESerializer), etc. Em projetos de ASICs a descrição estrutural é mais frequente devido a necessidade de ter mais controle sobre o hardware gerado. Atualmente, as ferramentas de EDA possuem bons algorítimos de inferência de hardware. Isso permite descrever o hardware em um nível mais alto (comportamental), abstraindo um pouco mais o hardware e focando na lógica do projeto.
  66. Fluxo de Projeto Apenas siga os passos abaixo: 1) Escolha um ambiente de desenvolvimento (Quartus II ou ISE). Em seguida, abra o arquivo de projeto localizado em C:\engineers\labs\07-led_rotator\&amp;lt;environment&amp;gt;, onde environment é o nome da pasta do ambiente de desenvolvimento. Abra o arquivo VHDL top.vhd no ambiente de projeto. 2) O arquivo top.vhd possui dois blocos instanciados (sync_counter e rotate_register). Abra os arquivos sync_counter.vhd e rotate_register.vhd. Note que eles estão vazios. Descreva a arquitetura conforme especificado. Utilize os slides do treinamento como referência. Veja os comentários no código VHDL para maiores informações. 3) Verifique o projeto do registrador circular. O arquivo de estímulos já está criado (testbench ou waveform). Não há necessidade de atribuir os pinos, pois estes já estão definidos. Concentre-se apenas na codificação e verificação da arquitetura. Lembre-se de alterar o parâmetro genérico SYNC_DELAY para um valor mais baixo, caso contrário a simulação irá tomar muito tempo (SYNC_DELAY = 2 para simulação). 4) Programe a FPGA conectada ao servidor e verifique o resultado na placa de desenvolvimento. Os pinos foram atribuídos conforme mostrado a seguir: Placa Spartan III Reset: SW7=rst Saída: LD7 … LD0=leds[7..0] Placa Cyclone II Reset: SW9=rst Saída: LEDG7 … LEDG0=leds[7..0] Terminou? Experimente realizar o projeto no outro ambiente de desenvolvimento. Muito fácil? Adicione uma feature ao projeto para inverter o sentido de rotação do registrador. Será necessário alterar a entidade. Depois, compare o netlist RTL gerado por ambas as ferramentas.
  67. Case case identifier is when value =&amp;gt; assignments; when value =&amp;gt; assignments; ... when others =&amp;gt; assignments; end case; A diretiva “when” pode apresentar 3 formas conforme mostrado abaixo when value: utilizado apenas quando o identificador possuir um valor exato when value1 to value2: utilizado quando a condição pode ser executada em uma determinada faixa do identificador when value1 | value2 |... : utilizado a condição pode ser executadas várias combinações do identificador
  68. For .. Loop Comando interno ao process. Repete número fixo de iterações. Sintaxe: [label:] for identifier in range loop (sequential statements) end loop [label]; -------------------------------------------------------------------------------------------------------------------------------- While .. Loop Comando interno ao process. Repete até determina condição ser alcançada. Sintaxe: [label:] while condition loop (sequential statements) end loop [label]; -------------------------------------------------------------------------------------------------------------------------------- Exit Comando interno ao loop. Interrompe execução. Sintaxe: [label:] exit [label] [when condition]; -------------------------------------------------------------------------------------------------------------------------------- Next Comando interno ao loop. Pula para próxima iteração. Sintaxe: [label:] next [loop_label] [when condition];
  69. Caso não consiga visualizar o circuito descrito acima, veja o slide da página 13.
  70. Fluxo de Projeto 1) Escolha um ambiente de desenvolvimento (Quartus II ou ISE). Em seguida, abra o arquivo de projeto localizado em C:\engineers\labs\08-bcd_counter\&amp;lt;environment&amp;gt;, onde environment é o nome da pasta do ambiente de desenvolvimento. Abra o arquivo VHDL top_&amp;lt;device&amp;gt;.vhd no ambiente de projeto, onde device é spartan3 ou cyclone2. Devido a diferença entre as placas de desenvolvimento, existem duas arquiteturas topos diferentes, uma para cada projeto. 2) O arquivo top_&amp;lt;device&amp;gt;.vhd contém vários blocos instanciados. Abra os arquivo bcd_counter.vhd. Note que ele está vazio. Descreva a arquitetura conforme especificado. Veja os comentários no código VHDL para maiores informações. 3) Verifique o projeto. O arquivo de estímulos já está criado (testbench ou waveform). Note que, para o Quartus II, a análise visual torna-se complicada, pois o simulador apenas permite visualizar a saída do decodificador. Já no caso do ISE, o testbench criado permite analisar os sinais diretamente na saída do bloco bcd_counter. Não há necessidade de atribuir os pinos, pois estes já estão definidos. Concentre-se apenas na codificação. 4) Programe a FPGA conectada ao servidor e verifique o resultado na placa de desenvolvimento. Os pinos foram atribuídos conforme mostrado a seguir: Placa Spartan III Reset: SW7=rst Incrementar/decrementar: SW0=up Saída: DISPLAY=leds[7..0] Placa Cyclone II Reset: SW9=arst Incrementar/decrementar: SW0=up Saída: DISPLAY=display[31..0] Terminou? Experimente realizar o projeto no outro ambiente de desenvolvimento. Muito fácil? Adicione uma feature para decrementar o contador. Depois, compare o netlist RTL gerado por ambas as ferramentas.
  71. Você também vai encontrar a expressão one-cold em ferramentas de síntese. Em poucas palavras, o raciocínio é o mesmo, porém, o bit ativo está em zero (cold-bit). Veja exemplo abaixo: Estado A: “1110” Estado B: “1101” Estado C: “1011” Estado D: “0111”
  72. Existem outras formas de codificar FSMs em VHDL, tais como 1 processo apenas, ou 3 processos. Não existe uma regra e não existe uma forma melhor do que outra. O que iremos apresentar aqui é apenas um metodologia.
  73. Fluxo de Projeto Nesse laboratório será utilizado apenas o ambiente ISE da Xilinx. 1) Abra o arquivo de projeto localizado em C:\engineers\labs\09-controlled_counter\ise\ise.xise. Abra o arquivo VHDL top.vhd no ambiente de projeto. Analise os componentes instanciados com o diagrama de blocos mostrado acima. 2) Em seguida, abra o arquivo button_control.vhd. Note que a arquitetura não foi codificada. Descreva a arquitetura conforme especificado. Veja os comentários no código VHDL para maiores informações. Utilize o código da máquina de estados vista anteriormente como exemplo. 3) Verifique o projeto. O arquivo de estímulos já está criado (testbench ou waveform). Não há necessidade de atribuir os pinos, pois estes já estão definidos. Concentre-se apenas na codificação. 4) Programe a FPGA conectada ao servidor e verifique o resultado na placa de desenvolvimento. Os pinos foram atribuídos conforme mostrado a seguir: Placa Spartan III Reset: SW7=arst Incrementar/decrementar: BTN0=btn Saída: DISPLAY=display[7..0]
  74. Fluxo de Projeto Nesse laboratório será utilizado apenas o ambiente Quartus II da Altera. 1) Abra o arquivo de projeto localizado em C:\engineers\labs\10-multiplier\quartus\multiplier.qpf. Abra o arquivo VHDL multiplier.vhd no ambiente de projeto. Note que a arquitetura não foi codificada. Descreva a arquitetura conforme especificado. Veja os comentários no código VHDL para maiores informações. 3) Verifique o projeto. Não há necessidade de atribuir os pinos, pois estes já estão definidos. Concentre-se apenas na codificação. 4) Programe a FPGA conectada ao servidor e verifique o resultado na placa de desenvolvimento. Os pinos foram atribuídos conforme mostrado a seguir: Placa Cyclone II Reset: SW9=rst_l Multiplicar: BTN0=btn_l Operando A: SW3 .. SW0=dip[3..0] Operando B: SW7 .. SW4=dip[7..4] Saída: DISPLAY=display[15..0] Dicas: Operações devem ser inseridas no processo síncrono Não esquecer de inserir sinais nos arcos na lista de sensibilidade do processo de decodificação do próximo estado
  75. Qual seria o desempenho (multiplicações/segundo) do multiplicador se este fosse de 32-bits a 50 MHz? Considere o sinal start_l fixo em ‘0’.