Neste material você irá:
* 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
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
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
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
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
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
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
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
d0
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
d0
01
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
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
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)
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
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)
* FSM: Finite State Machine (Máquina de Estados)
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
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.
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
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.
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&apos;s Application for Department of Defense Contracts,VIUF Proceedings, Spring 1993;
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.
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).
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?
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.
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.
Projetos no Quartus II podem ser criados através do Project Wizard. Siga os passos a seguir:
1) Clique em “File &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.
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 &gt; Start &gt; Start Analyses & Synthesis”. O mesmo comando pode ser executado clicando sobre o ícone “Start Analysis & 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 & 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.
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 &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 &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 “&gt;&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.
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 &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 &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”.
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 &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 &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 &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 &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 &gt; Netlist Viwers &gt; RTL Viewer”. Essa é a arquitetura inferida pelo Quartus II do somador.
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 &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 &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 &gt; Start &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 &gt; Start &gt; Start Assembler”.
Pronto!!! Agora é só programar o dispositivo e ver os resultados na prática.
Siga os passos a seguir para programar a FPGA:
1) Clique no no menu “Tools &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
Fluxo de Projeto
1) Abra o Quartus II. Caso ele já esteja aberto, feche o projeto atual clicando em “File &gt; Close Project”.
2) Em seguida, clique em “File &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 &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 &gt; Constructs &gt; Expressions”.
Entity & 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.
Referência: FPGA Fundamentals, http://www.pldesignline.com, Setembro de 2009.
Referência: FPGA Fundamentals, http://www.pldesignline.com, Setembro de 2009.
Referência: FPGA Fundamentals, http://www.pldesignline.com, Setembro de 2009.
Referência: FPGA Fundamentals, http://www.pldesignline.com, Setembro de 2009.
Referência: FPGA Fundamentals, http://www.pldesignline.com, Setembro de 2009.
Referência: FPGA Fundamentals, http://www.pldesignline.com, Setembro de 2009.
Referência: FPGA Fundamentals, http://www.pldesignline.com, Setembro de 2009.
Referência: FPGA Fundamentals, http://www.pldesignline.com, Setembro de 2009.
Referência: FPGA Fundamentals, http://www.pldesignline.com, Setembro de 2009.
Referência: FPGA Fundamentals, http://www.pldesignline.com, Setembro de 2009.
Referência: FPGA Fundamentals, http://www.pldesignline.com, Setembro de 2009.
Referência: FPGA Fundamentals, http://www.pldesignline.com, Setembro de 2009.
Referência: Cyclone II Device Handbook, Volume 1, Section I, Chapter II, Fevereiro de 2008.
Referência: Cyclone II Device Handbook, Volume 1, Section I, Chapter II, Fevereiro de 2008.
Referência: Cyclone II Device Handbook, Volume 1, Section I, Chapter II, Fevereiro de 2008.
Referência: Spartan 3 FPGA Family Datasheet, DS099, 25 de Julho de 2008.
Referência: Spartan 3 FPGA Family Datasheet, DS099, 25 de Julho de 2008.
Referência: Spartan 3 FPGA Family Datasheet, DS099, 25 de Julho de 2008.
Referência: CoolRunner II CPLD Family, DS090, 11 de setembro de 2008.
Referência: Max II Handbook, Section I, Chapter II, Max II Architecture, Agosto de 2009.
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.
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).
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: &apos;1&apos; e &apos;0&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 (&apos;) quando representar bits.
Fluxo de Projeto
1) Abra o Quartus II. Caso ele já esteja aberto, feche o projeto atual clicando em “File &gt; Close Project”.
2) Em seguida, clique em “File &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 &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)
O tipo bit, por representar apenas sinais lógicos &apos;1&apos; e &apos;0&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 (&apos;U&apos;): sinais não inicializados em simulações
Forcing Unknown (&apos;X&apos;): curtos em barramentos, valores não definidos, curtos em geral
Forcing Zero (&apos;0&apos;): sinal conectado a gnd
Forcing One (&apos;1&apos;): sinal conectado a vdd
High Impedance (&apos;Z&apos;): sinal em alta impedência, barramentos flutuando, buffers tri-state
Weak Unknown (&apos;W&apos;): terminação de barramentos
Weak Zero (&apos;L&apos;): sinais conectados em resitores pull-down
Weak One (&apos;H&apos;): sinais conectados em resitores pull-up
Don’t Care (&apos;-&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.
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 (&apos;U&apos;) na entrada de uma porta AND são propagados, com exceção de zero (&apos;0&apos;) ou zero fraco (&apos;L&apos;). A propagação de sinais não inicializados permite ao desenvolvedor identificar, por exemplo, partes do circuito não resetadas corretamente;
Sinais desconhecidos (&apos;X&apos;) na entrada de uma porta AND são propagados,com exceção de zero (&apos;0&apos;) ou zero fraco (&apos;L&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 (&apos;0&apos;), zero fraco (&apos;L&apos;), um (&apos;1&apos;) e um fraco (&apos;H&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.
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 (&apos;X&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.
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.
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.
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 &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”.
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 &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 = &quot;000&quot; (and), sel = &quot;001&quot; (or), sel = &quot;010&quot; (xor), sel = &quot;011&quot; (pass), sel = &quot;100&quot; (nand), sel = &quot;101&quot; (nor), sel = &quot;110&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.
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 &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 -&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.
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 &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.
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 &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 = &lt;ip do servidor&gt;, Port = &lt;porta do servidor&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)
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”.
Fluxo de Projeto
1) Abra o ISE. Caso ele já esteja aberto, feche o projeto atual clicando em “File &gt; Close Project”.
2) Em seguida, clique em “File &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 &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.
Library & Use
library &lt;library_name&gt;;
use &lt;library_name&gt;.&lt;package_name&gt;.&lt;package_parts&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
&lt;target&gt; &lt;= &lt;value&gt; when &lt;condition&gt; else
&lt;value&gt; when &lt;condition&gt; else
…
&lt;value&gt;;
Onde,
&lt;target&gt;: signal
&lt;value&gt;: signal, literal, constante
&lt;condition&gt;: condição expressa na forma de uma igualdade
--------------------------------------------------------------------------------------------------------------------------------
Selected Signal Assignment
with &lt;expression&gt; select
&lt;target&gt; &lt;= &lt;value&gt; when &lt;choices&gt;
&lt;value&gt; when &lt;choices&gt;
...
&lt;value&gt; when others;
Lembre-se que você pode verificar a sintaxe de cada comando VHDL diretamente no ambiente de desenvolvimento.
Processos são executados toda a vez que um sinal na lista de sensibilidade alterar o seu estado.
É 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
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\&lt;environment&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.
Wait
Sintaxe:
wait until signal_condition;
wait on signal1 [, signal2, ... ];
wait for time;
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;
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 =&gt; value,
…
)
port map(
port_name =&gt; signal_name,
…
);
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.
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\&lt;environment&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.
Case
case identifier is
when value =&gt; assignments;
when value =&gt; assignments;
...
when others =&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
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];
Caso não consiga visualizar o circuito descrito acima, veja o slide da página 13.
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\&lt;environment&gt;, onde environment é o nome da pasta do ambiente de desenvolvimento. Abra o arquivo VHDL top_&lt;device&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_&lt;device&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.
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”
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.
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]
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
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’.