==
VHDL ==
Vhsic Hardware Description Language
Versão 24/10/2003
Manuel Lois Anido - NCE/UFRJ
1
Bibliografia
 Disponível no Help On-line de um dos ambientes a ser usado
(Aldec, Xilinx, Altera, Modelsim, Warp, etc)
 Na página da Disciplina ( http://equipe.nce.ufrj.br/adriano/circlog)
 Cópia das Transparências do Professor (Formato Power Point)
 Resumo de Dicas VHDL em formato Word 97.
 Notas de aula sobre o uso das Ferramentas Warp e Active-HDL Sim
 Livros:
 “Digital Design and Modeling with VHDL and Synthesis”, K.C. Chang

IEEE Computer Society - Melhor Livro - Biblioteca NCE
 “The VHDL Cookbook” - Peter J. Ashenden

Disponível na Web: www.ecsi.org/EARNEST/digests/VHDL_cookbook
 “VHDL for Programmable Logic” - Kevin Skahill


Addison Wesley Publishers, 1996 - Biblioteca NCE
Vem com CD-ROM WARP da Cypress e Simulador Active-VHDL - Público
 Lista de Discussão da Disciplina: [email protected] (subscrever a lista)
2
VHDL
Introdução
3
VHDL- Introdução

VHDL :





Very high speed integrated circuit (Demanda Gov. USA, 1980,1983- Progr. VHSIC)
Hardware
Description
Language
Linguagem de alto nível conhecida por permitir:
 A modelagem de projetos eletrônicos complexos (especificações).
 A simulação dos modelos de componentes.
 A síntese lógica, ou seja, ferramentas pegam a descrição em VHDL e geram
uma lista otimizada de portas lógicas e registros que pode ser sintetizada.

Linguagem padronizada (IEEE Std 1076-1987 e 1076/93)

Para uma boa descrição (e futura síntese do circuito) em VHDL
recomenda-se ter em mente a implementação em Hardware.
4
VHDL - Introdução

Modelagem de circuitos eletrônicos complexos.
 Linguagem de alto nível facilitando a descrição do comportamento dos
modelos.
 Forte nível de abstração. A possibilidade de implementar fisicamente o
projeto não é necessariamente levada em conta neste nível
(comportamental).
 A partição em vários elementos permite dividir um modelo complexo em um
número de elementos mais simples de desenvolver separadamente.
5
VHDL - Introdução

Programação
 Programação em VHDL é semelhante à programação procedural usual, mas
com alguns conceitos novos.
CÓDIGO
FONTE
VHDL
COMPILADOR
VHDL
BIBLIOTECA
COMPONENT
SIMULADOR
VHDL
 A noção de atraso (delay) e ambiente de simulação são dois conceitos
novos em VHDL. VHDL também suporta concorrência e netlisting de
componentes, que não são comuns em linguagens de programação.
 VHDL suporta concorrência usando o conceito de sentenças concorrentes
rodando em tempo de simulação (este é o modo default da linguagem). Em
VHDL também existem sentenças sequenciais para descrever
comportamento algorítmico (especificadas dentro de um Process).
 Em VHDL, hierarquia de projeto é realizada compilando componentes
separadamente e instanciando-os num componente de mais alto nível.
6
VHDL - Introdução
 Simulação
(1):
 VHDL possui um conjunto de instruções particularmente potente para:
 Geração de estímulos
 Captura de resultados.
 Os modelos de comportamento (especificações) são simulados com a
finalidade de verificar sua coerência.
 O conjunto de modelos de comportamento + arquivos de simulação
constituem por sua vez uma especificação e um meio de verificação.
 O comportamento de um modelo e de sua realização física deveriam ser
idênticos.
7
VHDL - Introdução

Simulação (2):
 A descrição de um projeto ou modelo, escrito em VHDL, é normalmente
rodada num simulador VHDL para demonstrar o comportamento do sistema
modelado. O fato de se ter um simulador associado é uma característica
marcante de se trabalhar em VHDL.
 A linguagem VHDL suporta a descrição de vetores de teste (estímulos) para
executar a simulação e a captura dos resultados.
MAQ. ESTADOS
ARQUIVO
SAÍDA
ARQUIVO
ESTÍMULO
COMPILADOR
VHDL
SIMULADOR
VHDL
GRAFICADOR
CÓDIGO
FONTE
VHDL
BIBLIOTECA
COMPONENT
8
VHDL - Introdução
 Síntese
lógica:
 Converte uma descrição HDL de um bloco na descrição de um circuito
(estrutural - tal como esquemático) com portas lógicas e registros
interligados, fazendo o maior número de otimizações possível. Síntese
Lógica não é aplicável a blocos tais como RAMs, ROMs, PLAs e
“Datapaths”, por duas razões: velocidade e área.
 Usa somente uma parte reduzida do conjunto de instruções da linguagem
VHDL. Numerosas construções utilizáveis em modelos ou em simulação
geram uma sintetização muito ruim (consomem muitos gates) ou não são
diretamente sintetizáveis.
 As construções suportadas variam segundo as ferramentas.
 Síntese
de Alto Nível:
 Converte uma descrição funcional (tal como em “C” ou Pascal) numa
descrição com portas lógicas e registros (ou direto layout). É menos
eficiente que síntese lógica. Compiladores de Silício.
9
VHDL - Introdução
 Uso
de Bibliotecas:
 A linguagem VHDL consiste de diversas partes (assim como outras
linguagens), algumas embutidas e outras que são adicionadas usando
Packages. Estas partes são listadas abaixo:






Declarações adicionais de tipos de dados no Package STANDARD.
Algumas funções utilitárias de I/O no Package TEXTIO
Alguns tipos de dados para simulação no Package STD_LOGIC_1164.
Algumas bibliotecas e Packages de fornecedores.
Bibliotecas e Packages do usuário.
Exemplos:
 Biblioteca IEEE : Package STD_LOGIC_1164 e Package STD_LOGIC_ARITH
 Biblioteca STD : Package TEXTIO e Package STANDARD
10
VHDL - Introdução

Projeto Top-Down:
 Uma descrição VHDL pode ser escrita em vários níveis de abstração.
 Algorítmico (comportamental)
 Transferência de Registros
 Funcional a nível de portas lógicas com atraso unitário
 Nível de portas lógicas com atrasos detalhados
 Na metodologia Top-Down, o projetista começa com um nível de abstração
mais elevado e simula o sistema. Posteriormente, ele pode descrevê-lo em
maior detalhe e voltar a simulá-lo. Um exemplo é o uso do operador “+”.
 Na hora em que usamos um operador “+” (e.g. “b+c”), abstraimos-nos do
tipo de somador que é usado. Poderíamos definir um operador “plus16”
que definiria uma soma inteira em 16 bits (“plus16 (b,c)”).
11
VHDL
VHDL
Características Marcantes
12
VHDL - Características Marcantes

VHDL - Estrutura
 Entity - Representa algo físico (subsistema, placa, chip, etc) - Os sinais de interface
de um projeto são descritos na entidade.
 Architecture - Esta Unit descreve o comportamento do projeto.
 Package - Armazena certas especificações frequentemente usadas.
 Configuration - Permite selecionar uma variação de um projeto de uma biblioteca.
Projeto VHDL
Arquivos VHDL
Packages
Configurações
Declaram constantes, tipos de
dados, componentes, e
subprogramas usados por
diversos projetos e/ou entidades
Definem as configurações
específicas de componentes
Especificações de
Entidades
Arquiteturas
Definem as interfaces das
entidades
Definem as implementações das
entidades
13
VHDL - Características Marcantes

VHDL permite:
 Definir os “ports” de entrada/saída do
conjunto lógico descritivo (ENTITY).
Sinais simples ou na forma de “bus”.
 Definir um modelo de comportamento
(ARCHITECTURE) usando o conjunto
de instruções. Dependendo das
ferramentas de síntese e simulação,
podem ser usados os modelos
comportamental, estrutural e fluxo de
dados (data flow).
Entidade
Declaração da Entidade
Declaração da Interface
Corpo da Arquitetura
Definição Funcional
 Unir os diferentes módulos descritos
separadamente.
(Gerência de hierarquía, VHDL
estrutural).
14
VHDL - Características Marcantes

Entidade (1)
 Declaração
entity somador4 is port(
a [3:0]
a, b :
in std_logic_vector (3 downto 0);
vem1 : in std_logic;
soma: out std_logic_vector (3 downto 0);
vai1 :
out std_logic);
end somador4;
 Ports e Modos
vem1
soma [3:0]
b [3:0]
vai1
somador4
MODE
In
MODE
Out
 Cada sinal de I/O numa entidade é um PORT, que é
análogo a um pino num diagrama esquemático.
Buffer
 Modos
 In - Os dados fluem só p/dentro da entidade
 Out - Saída somente. Não há realimentação
 Buffer - Permite realimentação mas não há
dados bidirecionais.
 Inout - Para sinais bidirecionais
In
Inout
In
Out
15
VHDL - Características Marcantes

Entidade (2)
 Tipos de dados para Ports
Existem diversos tipos de dados, que estão disponíveis em diferentes “packages”.
Alguns tipos facilitam o trabalho de simulação mas não são aplicáveis à síntese.
Os tipos do padrão IEEE 1076/93, que são os mais úteis, bem suportados por
ferramentas e que são aplicáveis à síntese são:
boolean, bit, bit_vector e integer.
Os tipos mais úteis e mais bem suportados do “package” IEEE std_logic_1164 para
síntese são os tipos std_ulogic e std_logic e arrays destes tipos. Como os
nomes indicam, “standard logic” é direcionado a ser um tipo standard usado para
descrever circuitos para síntese e simulação.
Package
Tipos de Dados
STD_LOGIC_1164
STD_LOGIC_ARITH
TEXTIO
STANDARD
Std_logic, std_logic_vector, std_ulogic
Signed, unsigned
File, Line
Boolean, bit, character, time, string,
bit_vector, natural, positive
Integer, real
VHDL Language
16
VHDL - Características Marcantes

Arquitetura - Estrutura e Principais Características
 Toda Arquitetura está associada a uma Entidade (é uma parelha).
 Uma arquitetura descreve o funcionamento de uma entidade.
 VHDL permite descrever o funcionamento do sistema usando vários estilos de
arquitetura.
ARQUITETURA
Declarações
Declara sinais para comunicar entre sentenças concorrentes e entre sentenças concorrentes e
portas da interface. Nem todas as arquiteturas contém todas as construções mostradas.
Blocos
Sentenças concorrentes grupadas
Atribuições a Sinais
SENTENÇAS CONCORRENTES
Instanciação de Componentes
Criar uma instância de outra entidade
Computa valores e atribui-os a sinais
Processos
Procedure Calls
Definem um novo algoritmo
Invocam um algoritmo pré-definido
17
VHDL - Características Marcantes

Arquitetura - Descrição Comportamental
library ieee;
use ieee.std_logic_1164.all;
entity comparador4 is port (
a, b : in std_logic_vector (3 downto 0);
igual : out std_logic );
end comparador4;
architecture behavioral of comparador4 is
begin
comp: process (a, b)
begin
if a=b then
igual <= “1”;
else
igual <= “0”;
end if;
end process comp;
end behavioral;
( Descrição Algorítmica
ou High-Level )
COMPARADOR4
4
a
1
igual
4
b
18
VHDL - Características Marcantes

Arquitetura - Descrição Dataflow
library ieee;
use ieee.std_logic_1164.all;
entity comparador4 is port (
a, b : in std_logic_vector (3 downto 0);
igual : out std_logic );
end comparador4;
architecture dataflow of comparador4 is
begin
igual <= ‘1’ when (a = b) else ‘0’;
end dataflow;
COMPARADOR4
4
a
1
igual
4
b
A arquitetura é “dataflow” porque ela
especifica como os dados serão
transferidos de sinal para sinal e de
entrada para saída, sem o uso de
sentenças sequenciais (fora de process)
ESCREVENDO DE OUTRA FORMA :
library ieee;
use ieee.std_logic_1164.all;
entity comparador4 is port (
a, b : in std_logic_vector (3 downto 0);
igual : out std_logic );
end comparador4;
architecture dataflow of comparador4 is
begin
igual <=
not(a(0) xor b(0))
and
not(a(1) xor b(1))
and
not(a(2) xor b(2))
and
not(a(3) xor b(3));
end dataflow;
19
VHDL - Características Marcantes

Arquitetura - Descrição Estrutural
COMPARADOR4
4
library ieee;
use ieee.std_logic_1164.all;
entity comparador4 is port (
a, b : in std_logic_vector (3 downto 0);
igual : out std_logic );
end comparador4;
a
1
igual
4
b
a(3:0)
b(3:0)
use work.gatespkg.all;
architecture struct of comparador4 is
signal x : std_logic_vector (0 to 3);
begin
u0 : xnor2 port map (a(0), b(0), x(0));
u1 : xnor2 port map (a(1), b(1), x(1));
u2 : xnor2 port map (a(2), b(2), x(2));
u3 : xnor2 port map (a(3), b(3), x(3));
u4 : and4 port map (x(0), x(1), x(2), x(3),igual);
end struct;
COMPARADOR4
a0
b0
a1
b1
igual
a2
b2
a3
b3
20
VHDL - Características Marcantes

Modelando p/ Síntese x Modelando p/ Simulação
 A linguagem VHDL possui diversas construções que são mais
orientadas à simulação e à verificação do que à síntese.
 Entender como um simulador VHDL processa o código ajuda a clarificar
a semântica de algumas sentenças VHDL e assim permitir escrever
código mais adequado.
 Uma codificação não adequada ao objetivo final pode levar à frustração
com relação às ferramentas de síntese e de simulação.
 A princípio, o código VHDL usado para simulação e para síntese do
circuito deveria ser o mesmo. No entanto, pode ser desejável para uma
primeira simulação do sistema usar um código VHDL que não é
sintetizável, mas que permite uma rápida codificação e simulação.
21
VHDL - Características Marcantes

As noções de Atraso e Tempo de Simulação (1)
 Embora VHDL seja similar a uma linguagem de programação procedural, ela
possui diferenças marcantes. Entre estas diferenças estão a noção de
atraso e o tempo de simulação (do ambiente de simulação).
 Exemplo1:
processo_P1 : process (a, b, c)
begin
x <= a and b and c;
end process;
Este processo executará quando ocorrer uma mudança no valor dos sinais a, b
ou c. A sentença x <= a and b and c sendo avaliada no tempo de simulação
corrente Tc, é escalonada para atribuição a x, um atraso delta () no tempo de
simulação Tc+ . O atraso  é infinitesimal e implica um (1) ciclo do simulador.
 Exemplo2:
processo_P2 : process (a, b, c)
begin
x <= a and b and c after 5 ns;
end process;
No exemplo 2 x é escalonado para mudar, 5ns após mudança em a, b ou c.
O exemplo 1 é sintetizável e o exemplo 2 não é (usado para simulação).
22
VHDL - Características Marcantes

As noções de Atraso e Tempo
de Simulação (2)
Processo P1 está escalonado para executar
em Tc= 5ns
Lista de Sensibilidades
a
Processo_P1 : process (a, b, c)
begin
x <= ‘0’;
if (a = b or c = ‘1’ ) then
x <= ‘1’;
end if;
end process Processo_P1;
b
c

x
5ns
x
Tc=5ns
NOTA: No gráfico da forma de onda, só a
transição em ‘a’ dispara o processo. x<= ‘0’
Embora em T=10ns, ‘c’ esteja em ‘1’, ele
não dispara o processo P1 pois não
transiciona. Em T=15ns c dispara mas
avalia falso o if.
10ns
15ns
(‘0’,5ns (‘1’, 5ns +  )
Tc=5ns + 
x <= ‘1’
23
VHDL - Características Marcantes

O Modelo de Tempo com
INICIALIZAÇÃO
Eventos Discretos
•Inicializar Sinais,
•Tempo de Simulação=0
•Executa cada módulo
•Se resultam transições, elas são escalonadas
Não Ocorreram
Eventos em Sinais
1o ESTÁGIO DE UM CICLO DE SIMULAÇÃO
• Avança Tempo de Simulação para o primeiro tempo (mais
cedo) em que haja transição escalonada.
•Executa Todas as transições escalonadas para aquele
tempo. Isto pode causar eventos ocorrerem -> 2o estágio
Executou Todos os
módulos e há mais
Transições Escalonadas
Ocorreram Eventos em Sinais
2o ESTÁGIO DE UM CICLO DE SIMULAÇÃO
Ainda não Executou
Todos os Módulos e há
Transições Escalonadas
• Todos os módulos que reagem a eventos do 1o estágio são
executados.
•Tais módulos normalmente escalonarão mais transições
em seus sinais de saída.
Não há mais Transições Escalonadas
FIM
24
VHDL - Características Marcantes

A Noção de Sentenças Concorrentes
Quando estão fora de um process, a
atualização dos sinais de uma arquitetura
funciona de modo concorrente. A ordem de
aparecimento e execução das sentenças não
é importante.
Para mostrar que a ordem não importa,
será executado do último para o primeiro
entity Test_sinais is port (
a, b, c, d:
in bit;
u, v, w, x, y, z: buffer bit);
end Test_sinais;
u
(‘0’, 0ns)
v
(‘0’, 0ns)
w
(‘0’, 0ns)
x
(‘0’, 0ns)
y
(‘0’, 0ns)
z
(‘0’, 0ns)
(‘1’, 0ns+)
INICIALIZAÇÃO
Ciclo
Sim
1
architecture Arquitet_1 of
Test_sinais is
2
3
begin
z <= not y;
y <= w or x;
x <= u or v;
w <= u and v;
v <= c or d;
u <= a and b;
end Arquitet_1;
4
5
ns

a
b
c
d
u
v
w
x
y
z
000
000
100
200
200
200
200
200
300
300
300
300
300
400
+0
+1
+0
+0
+1
+2
+3
+4
+0
+1
+2
+3
+4
+0
0
0
1
1
1
1
1
1
0
0
0
0
0
0
0
0
0
1
1
1
1
1
1
1
1
1
1
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
1
1
1
1
1
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
1
1
1
1
1
0
0
0
0
0
0
0
0
0
0
1
1
1
1
1
0
0
0
0
1
1
1
1
1
1
0
0
0
0
0
1
1
25
VHDL - Características Marcantes

Concorrência entre Processos e
Sequenciamento dentro de Processos
ARQUITETURA
Sentença_1
Sentença_2
Processo_A
execução
sequencial
Processo_B
execução
sequencial
Processo_C
execução
sequencial
Dentro da Arquitetura as sentenças
são concorrentes.
Os processos são concorrentes entre
si e com as sentenças.
Dentro dos processos as sentenças
executam sequencialmente.
NOTAS:
1 - Fora do processo os sinais mudam de
estado na hora da atribuição (só esperam os
delta infinitesimais da resolução das
dependências para mudar de estado)
2 - Dentro do processo os sinais só mudam de
estado ao final do processo e não na hora da
atribuição.
26
VHDL - Características Marcantes

Drivers Múlltiplos e Funções de Resolução
ÚTIL PARA SIMULAR
BARRAMENTOS
 VHDL não permite um sinal ter mais de um driver, a
menos que tenha uma função de resolução associada.
architecture ComErro of proj1 is
begin
y <= a and b;
y <= a or b;
end ComErro;
a
b
Função de Resolução (Resolve o Conflito):
function calcula_valor (a, b : X01) return X01 is
begin
if a /= b
then return ( ‘X’); - - se há conflito, sai ‘X’
else return (a); - - ou return(b)
end
a
0
0
1
1
b
0
1
0
1
a AND b
0
0
0
1
y
a OR b
0
1
1
1
y
0
X
X
1
SE FOSSE UM PROCESS, SERIA POSSÍVEL TER
AS DUAS ATRIBUIÇÕES:
processo_teste: process (a, b)
begin
y <= a and b;
y <= a or b;
end process;
-- este processo sequencial é sintetizável pois o
-- sintetizador não gerará circuitos AND e OR como acima.
-- No instante corrente é atribuído ao sinal “y” o AND lógico de a e b.
-- No instante corrente + delta é atribuído ao sinal “y” o OR de a e b.
-- a atribuição AND não importa pois o último valor que fica é o OR.
27
VHDL - Características Marcantes

Hierarquía
 Um projeto VHDL consiste de uma hierarquía de
componentes conectados, compilados de
arquiteturas comportamentais, dataflow ou
estruturais.
COMPARE
 É sempre muito útil esquematizar o sistema como
sendo um conjunto de componentes (arquiteturas
e/ou processos) que se comunicam através de
sinais.
architecture S of COMPARE is
signal I: bit;
component XR2 port (X, Y : in bit; Z : out bit);
end component;
component INV port (X : in bit; Z: out bit);
end component;
begin
U0 : XR2 port map (A, B, I);
U1 : INV port map (I, C);
end S;
A
U0
B
XR2
U1
I
INV
C
Na arquitetura “T” abaixo, as
declarações dos componentes
estão num “package” chamado
“xyz_gates” da biblioteca “work”.
Use work.xyz_gates.all;
architecture T of COMPARE is
signal I : bit;
begin
U0 : XR2 port map (A, B, I);
U1 : INV port map (I, C);
end T;
28
VHDL - Características Marcantes

Packages - Exemplo: Package STANDARD
 Contém Declarações de Tipos Compartilhados que foi compilada separado
-- tipos enumerados pré-definidos
type Boolean is (FALSE, TRUE); type BIT is (‘0’, ‘1’);
type CHARACTER is ( NUL, SOH, ….., ‘A’, ‘B’, ‘C’, …,’0’, ‘1’, ‘2’, ‘3’, ...., ‘}’, DEL);
-- tipos numéricos pré-definidos
type INTEGER {REAL} is range implementation_defined;
-- tipo TIME pré-definido
type TIME is range implementation_defined
units
fs; -- femtosecond
ps=1000fs; -- picosecond
ns=1000ps; -- nanosecond
- - - - - - - -end units;
-- subtipos numéricos pré-definidos
subtype NATURAL is INTEGER range 0 to INTEGER’HIGH;
subtype POSITIVE is INTEGER range 1 to INTEGER’HIGH;
-- tipos array pré-definidos
type STRING is array (POSITIVE range <>) of CHARACTER;
type BIT_VECTOR is array (NATURAL range <>) of BIT;
29
VHDL - Características Marcantes

Packages - Exemplo: Package TEXTIO
-- Definições de Tipos para TEXTIO
type LINE is access STRING;
type TEXT is file of STRING;
type SIDE is (RIGHT, LEFT);
……………..
-- um LINE é um ponteiro para uma string
-- um arquivo de registros ASCII de tamanho variavel
-- para justificar dados de saída em campos
-- Arquivos Texto Standard
file INPUT: TEXT is in “STD_INPUT”;
file OUTPUT: TEXT is out “STD_OUTPUT”;
-- Rotinas de Entrada para Tipos Standard
procedure READLINE (F: in TEXT; L: out LINE);
procedure READ (L:inout LINE; VALUE: out BIT_VECTOR);
-- Rotinas de Saída para Tipos Standard
procedure WRITELINE (F: out TEXT; L: in LINE);
procedure WRITE (L: inout LINE; VALUE: in BIT; JUSTIFIED: in SIDE:=RIGHT;
FIELD: in WIDTH :=0);
…………………
-- Predicados de Posição de Arquivo
function ENDLINE (L: in LINE) return Boolean;
function ENDFILE (F: in TEXT) return Boolean;
30
VHDL - Características Marcantes

Sentenças Concorrentes:
Executam ao mesmo tempo. Elas são:




Sentença Process
Sentença de Instanciação de Componente
Sentença de Atribuição a Sinal Concorrente
Relação: Exemplo: v <= (a and b and c) or d;
 Atribuição Condicional a Sinal Usando: WHEN … ELSE
 Exemplo: Y <= j when state = idle else
k when state = first_state else
l when others;
 Atribuição Condicional a Sinal Usando: WITH…SELECT….WHEN
 Exemplo: with state select
X <= “0000” when st0 or st1; - - st0 “or” st1
“0010” when st2 and st3;
Y
when st4;
Z
when others;
 Procedure Call Concorrente
 Sentença Gerar (Generate) para Instanciação de Componentes ou Equações:
 Exemplo: G1: for I in 0 to 7 generate
reg1: register8 port map (clock, reset, enable, data_in(I), data_out(I));
end generate G1;
 Sentença Block
 Sentença de Declarar / Reportar Concorrente (Assert / Report).
31
VHDL - Características Marcantes

Sentenças Sequenciais
Definem algoritmos para a execução de um subprograma ou processo.
 Sentença If – then - else
if (count = “00”) then
a <=b;
elsif (count = “10”) then
a <=c;
else
a <=d;
end if;
 Sentença Case - when
case count is
when “00” => a <= b;
when “10” => a <= c;
when others => a <= d;
end case;
 Sentença Exit
 Sentenças: For –Loop e While-Loop
 Sentença Next
 Sentença Null
 Sentença Procedure Call
 Sentença Return
 Sentença Wait
 Sentença de Atribuição a Sinal
 Sentença de Atribuição a Variável
 Sentença de Declarar / Reportar (Assert / Report)
32
Elementos Primitivos de VHDL
Tipos Escalares e Arrays
Nomes e Objetos
Expressões
Atributos
33
VHDL

Apresentação Geral:

Informações prévias sobre a sintaxe (cont):
 Separadores: os separadores utilizados são:
“ ; “ (ponto e vírgula, entre duas declarações ou ao fim de uma instrução).
“ , “ (vírgula, entre dois nomes de sinal dentro de uma mesma declaração).
“ : “ (dentro de uma declaração entre o nome de um objeto e seu tipo).
“ “ (espaço).
 Espaços: o número de espaços entre duas palavras é indiferente, sempre
que o mínimo seja respeitado.
 Retorno carro : Uma mesma instrução ou declaração pode ser escrita em
várias linhas consecutivas.
Os comentários podem ser inseridos ao final das linhas sem afetar a
integridade do código.
34
VHDL

Objetos que se podem manipular em VHDL e seus tipos:

3 classes principais de objetos:
 SINAIS : similares aos sinais encontrados nos esquemas
Os “ports” declarados dentro de uma entidade são sinais. Podem ser declarados
como “bus”. São definidos e utilizados dentro da arquitetura, mas dentro de um
processo não podem ser definidos nem usados do lado direito de uma expressão.
Só podem ser usados do lado esquerdo da expressão ( exemplo: sinal_a <= (X or Y)
and Z;
 CONSTANTES : permitem definir valores permanentes.
 VARIAVEIS : utilizadas somente dentro dos “PROCESS” (instruções sequenciais).
Não podem ser definidas nem utilizadas na arquitetura fora de um processo.

Uma declaração de objeto compreende:




CLASSE: sinal, constante ou variável.
NOME : à escolha do criador (exceto palavras reservadas).
MODO : (somente sinais) : in, out, inout, buffer.
TIPO : bit, bit_vector, boolean, integer ...
35
VHDL


Tipos de objetos que se podem manipular em VHDL:
Tipos pré-definidos principais:
 BIT : pode tomar o valor ‘0’ ou ‘1’. (difere de Boolean pois não se
pode tomar uma decisão(true/false) baseado num tipo bit).
 BIT VECTOR : grupo de bits (bus).
O valor binário de um bit_vector é definido entre aspas duplas.
EXEMPLO:
signal A : bit_vector (7 downto 0);
- - o bit de maior peso (MSB) esstá à esquerda (bit 7 no exemplo)
begin
A <= “01011010”; - - equivalente a: A <= X”5A”;
- - X “valor” indica um valor hexadecimal.
36
VHDL


Tipos de objetos que se podem manipular em VHDL:
Tipos pré-definidos principais (cont):
 BOOLEAN:
Pode tomar os valores TRUE ou FALSE.
 INTEGER : Valor inteiro codificado em 32 bits.
(de -2.147.483.648 a + 2.147.483.647)
Um inteiro pode estar limitado em sua declaração, a fim de evitar sua codificação
em 32 bits. São subtipos de integer os tipos positive (1,2,3,…) e natural (0,1,2,…)
EXEMPLO:
signal VALOR_A : integer range 0 to 255;
begin
VALOR_A <= 143 when INIT = ‘1’ else 33;
37
VHDL


Tipos de dados que se podem manipular em VHDL:
STD_LOGIC e STD_ULOGIC: Extensões do tipo BIT,
Podem assumir 9 valores diferentes:
type STD_ULOGIC is (
‘U’, -- Uninitialized
‘X’, -- Forcing Unknown
‘0’, -- Forcing 0
‘1’, -- Forcing 1
‘Z’, -- High impedance
‘W’, -- Weak unknown
‘L’, -- Weak 0
‘H’, -- Weak 1
‘-’); -- Don’t care
(Extraído do código fonte do package “STD_LOGIC_1164”.)
 O tipo STD_LOGIC dá uma maior potência operacional que o tipo BIT, tanto
para a simulação como para a síntese.
(particularmente os valores ‘z’ e ‘-’ para a síntese).
38
VHDL

Tipos de objetos que se podem manipular em
VHDL:

Tipo STD_LOGIC_VECTOR
 Grupo de objetos similar a BIT_VECTOR, mas com os 9 estados
possíveis do STD_LOGIC para cada um dos 9 bits.
 Para utilizar estes tipos de dados (STD_LOGIC_VECTOR e
STD_LOGIC), devemos declarar a utilização da biblioteca IEEE que
contém o package particular (STD_LOGIC_1164), no cabeçalho do
arquivo .vhd.
Library IEEE;
use IEEE.STD_LOGIC_VECTOR_1164.all;
39
VHDL


Tipos de objetos que se podem manipular em VHDL:
EXEMPLO de declaração da biblioteca IEEE, e do package
STD_LOGIC_1164:
library IEEE;
use IEEE.STD_LOGIC_164.all;
entitiy EXEMPLO is
port (
A,B : in STD_LOGIC_VECTOR(7 downto 0);
SEL : in STD_LOGIC;
MUX_OR : out STD_LOGIC);
end EXEMPLO;
architecture ARCHI of EXEMPLO is . . . . .
40
VHDL

Tipos de objetos que se podem manipular em VHDL:

Tipos enumerados:
 Principalmente utilizados em síntese para definir os estados das
máquinas de estado.
architecture ARCHI of MACHINE is . . . . .
- - parte declaratória da arquitetura
type ESTADOS is (REPOUSO, LEITURA, ESCRITA);
Enumeração
de tipo !!
signal ESTADO_ATUAL, ESTADO_SEGUINTE : ESTADOS;
- - os sinais ESTADO_ATUAL e ESTADO_SEGUINTE, poderão
- - tomar os valores “REPOUSO”, “LEITURA” ou “ESCRITA”.
begin
- - atribuições
41
VHDL

Tipos de objetos que se podem manipular em VHDL:

Sub-tipos:
 subconjunto de um tipo predefinido ou declarado anteriormente
 Exemplo:
Byte não é palavra reservada !
subtype BYTE is STD_LOGIC_VECTOR (7 downto 0);
signal A_BUS, B_BUS, SAIDA_A, SAIDA_B, SAIDA_C : BYTE;
signal ENTRADA : STD_LOGIC_VECTOR (7 downto 0);
constant K :
begin
SAIDA_A <=
SAIDA_B <=
SAIDA_C <=
BYTE := X”C8”;
A_BUS or K;
B_BUS and X”9C”;
ENTRADA;
42
VHDL

Regras de atribuição dos vetores de dados:
 A ordem na qual se utiliza o vetor (bus) deve ser a mesma que na
declaração do vetor.
(valores crescentes ou decrescentes dos índices)
 Não é necessário utilizar o vetor inteiro. (utilização de uma parte dos
sinais em um bus).
 A largura do bus (tamanho do vetor) deve corresponder para a
maioria das operações.
(exceto para comparação).
43
VHDL

Regras de atribuição dos vetores de dados:
architecture ARCHI of VECTOR is
-- parte declaratória da arquitetura
signal D_IN, MASCARA, D_OUT : std_logic_vector (7 downto 0);
signal Q_OUT : std_logic_vector (7 downto 0);
constant FIXA : std_logic_vector (2 downto 0) := “010”;
-- a atribuição de um valor a uma constante ou variável
-- se realiza pelo símbolo “ :=“
-- de forma diferente da atribuição de sinais.
Begin
D_OUT <= D_IN and not (MASCARA); --Todas as operações são de 8 bits
Q_OUT <= (D_IN(6 downto 2) and not (MASCARA (7 downto 3))) & FIXA;
- - O sinal “&” é um operador chamado de concatenação
end [ARCHI];
44
VHDL

Atribuição de valores a um objeto segundo seu tipo:

Inteiros:
signal A, S, T, U, V : integer range 0 to 255;
- - Base default : decimal
s <= A + 83;
- - sem aspas
Especificação da base:
T <= 16#B3#;
-- Base Hexadecimal
U <= 10#145#;
V <= A - 2#010010110#
-- Base Decimal
-- Base Binaria
- - equivalente a:
-- V <= A - 2#0100_1010#;
-- Com separadores p/ ficar + claro
45
VHDL

Atributos Simbólicos (1):
 Um atributo provê informação sobre itens tais como entidades, arquiteturas, tipos e
sinais.
 Há diversos tipos pré-definidos de valor, sinal e range.
 Tipos escalares tem atributos de valor, que são: ‘left, ‘right, ‘high, ‘low, e ‘length
(pronuncia-se as aspas simples como “tick”). Exemplo:
type count is integer range(0 to 127);
type states is (idle, decision, read, write);
Entao tem-se que: count’left = 0 ; states’high = write ; states’left = idle
 Um atributo importante de sinal, muito útil em simulação e síntese, é: ‘event. Ele
retorna um valor booleano de “true” se um evento acabou de acontecer (transição). É
utilizado principalmente para determinar se um clock transicionou. Exemplo:
if CK’event and CK=“1”
-- transicionou de ‘0’ para ‘1’
 Um atributo útil de range é: ‘range. Ele retorna o range de um objeto
que possui limites. Exemplo:
signal word: std_logic_vector (15 downto 0);
word’range = 15 downto 0
46
VHDL

Atributos Simbólicos(2):
 Atributos de Sinais
 ck’event - sinal ck - Um valor booleano que indica se um evento ocorreu em ck
 saida’stable(T) - sinal saída e parâmetro T - Um sinal BOOLEANO que é verdade
quando o sinal de referência não tem tido eventos por um temo T.
 outros atributos (ver livros) .....
 Atributos Relacionados a Arrays




VetA’low - retorna limite inferior da faixa de índice (se faixa 0 a 511, retorna 0)
VetA’high - retorna limite superior da fiaxa de índice.
VetA’range - retorna o range de um tipo particular.
Outros atributos (ver livros) ....
 Atributos Relacionados a Tipos




NomeTipo’succ(v) - retorna o próximo valor no tipo após v.
NomeTipo’pred(v) - retorna o valor anterior no tipo antes de v.
NomeTipo’leftof(v) - retorna o valor imediatamente à esquerda de v.
outros atributos (ver livros) ....
47
VHDL
Os operadores
48
VHDL

Operadores frequentemente utilizados em síntese:

Operadores lógicos pré-definidos
 and, or, nand, nor, xor e not
 (NOTA: não há operadores “|”, “&” como em C
 Operam sobre todos os objetos de todas as classes (sinais, constantes,
variáveis) e de tipo:





bit
bit_vector
std_logic, std_ulogic
std_logic_vector, std_ulogic_vector
boolean
 Os operandos devem ser do mesmo tipo e conter o mesmo número de bits.
49
VHDL

Operadores frequentemente utilizados em síntese:

Operadores lógicos pré-definidos
 Exemplo de utilização (1):
entity OPE is
port (A, B, C : in bit;
S :
out bit);
end OPE;
architecture ARCHI of OPE is
begin
S <= (A and B) and not (C);
end ARCHI;
50
VHDL

Operadores correntemente utilizados em síntese:

Operadores relacionais:
 = (igual )
 < (menor )
 > (maior )
/= (diferente)
<= (menor ou igual )
>= (maior ou igual )
 Operam sobre objetos do tipo:





bit, bit_vector
std_logic, std_logic_vector
std_ulogic, std_ulogic_vector
integer
boolean
 Os operandos devem ser do mesmo tipo, mas o número de bits
comparados pode ser diferente !
51
VHDL

Operadores correntemente utilizados em síntese:

Operadores relacionais: Comparação de vetores:
 A comparação se faz comparando bit a bit os dois vetores començando
pelo MSB.
Os resultados podem surpreender se os vetores não são do mesmo número
de bits.
Exemplo:
signal REG : std_logic_vector (4 downto 0);
signal CNT : std_logic_vector (3 downto 0);
begin
-- temos o direito de escrever :
-REG
CNT
-- “01111” >
“0100”
-- resultado nada surpreendente
-- “01111” <
“1000”
-- resultado surpreendente !!
-- O MSB de CNT(bit3) é superior ao MSB de REG (bit 4),
-- o vetor CNT é considerado como superior.
52
VHDL

Operadores correntemente utilizados em síntese:

Operadores aritméticos:
+ (soma)
* (multiplicação)
** (potência)
mod
- (subtração)
/ (divisão)
rem
abs
 Operam sobre objetos do tipo INTEGER (sem precisar declarar biblioteca
aritmética especial), mas recomendamos transformar sempre os inteiros em
vetores (std_logic_vector) e não usar multiplicação, nem divisão nem potência. O
motivo é a baixa eficiência na implementação – gera um circuito muito grande.
 Podem igualmente operar sobre STD_LOGIC_VECTOR utilizando os pacotes
STD_LOGIC_UNSIGNED e STD_LOGIC_ARITH do Synopsys.
 CUIDADO !!: Se declarar um vetor contador como std_logic_vector e fizer:
“contador = contador + 1”, nao esquecer de declarar no início a biblioteca
aritmética utilizada (use std_logic_arith.all por exemplo).
 Restrições: A maioria das ferramentas de síntese só autoriza as operações de
multiplicação e divisão entre CONSTANTES, ou uma CONSTANTE potência de 2
e um SINAL.
53
VHDL

File:
Altera provides several packages for use with MAX+PLUS II. All packages are located in subdirectories of the
\maxplus2\vhdlnn directory, where nn is "87" or "93". These directories are created automatically during MAX+PLUS II
installation. See the following table:
Package:
Library:
Contents:
maxplus2.vhd maxplus2
altera
megacore.vhd megacore
std1164.vhd
std_logic_1164
std1164b.vhd
altera
ieee
lpm_pack.vhd lpm_components
arith.vhd
std_logic_arith
arithb.vhd
lpm
ieee
signed.vhd
std_logic_signed
signedb.vhd
unsigned.vhd std_logic_unsigned
unsignedb.vhd
ieee
MAX+PLUS II primitives, macrofunctions, and selected megafunctions
supported by VHDL.
Pre-tested megafunctions consisting of several different design files.
Standard for describing interconnection data types for VHDL
modeling, and the STD_LOGIC and STD_LOGIC_VECTOR types.
MAX+PLUS II does not support the to_x01(), is_x(), to_x01z(), or to_ux01()
functions in the std_logic_1164 package.
LPM megafunctions supported by VHDL.
SIGNED and UNSIGNED types, arithmetic and comparison
functions for use with SIGNED and UNSIGNED types, and the conversion
functions CONV_INTEGER, CONV_SIGNED, and CONV_UNSIGNED.
MAX+PLUS II does not support the shl(), shr(), ext(), or sxt() functions in
the std_logic_arith package.
Functions that allow MAX+PLUS II to use STD_LOGIC_VECTOR types
as if they are SIGNED types.
Functions that allow MAX+PLUS II to use STD_LOGIC_VECTOR
types as if they are UNSIGNED types.
ieee
NOTE: If you use more than one of these packages in a single VHDL Design File, you must use them in the order in which
they are listed in this table.
54
VHDL
A Parelha
Entidade - Arquitetura
55
VHDL

A parelha entidade / arquitetura :

Entidade : Porção do código que permite definir em particular as
Entradas e Saídas.
 Exemplo:
Equivalência Esquemática
entitiy EXEMPLO is
port (
A,B : in bit_vector(7 downto 0);
SEL : in bit;
MUX_OR : out bit
);
end EXEMPLO;
SÍMBOLO EXEMPLO
A[7:0]
MUX_OR
B[7:0]
SEL
OBS: Dar preferencialmente o mesmo nome à entidade e ao arquivo VHDL
(neste caso EXEMPLO.VHD).
56
VHDL

A parelha entidade / arquitetura :
Declaração da Entidade

Arquitetura : Porção de descrição do
Declaração da Interface
comportamento do dispositivo a sintetizar.
 Está associada a uma entidade
Corpo da Arquitetura
Definição Funcional
architecture ARQUI of EXEMPLO is
- - parte declaratória
signal MUX_OUT : bit_vector (7 downto 0); - - sinal interno
- - - - - - - - - - - - - - - - - - - - - - - - - - - - parte operatória
begin
- - Sentenças concorrentes e/ou Sequencias (processos)
- - o sinal “<=“ é o símbolo de atribuição de um valor a um sinal
MUX_OUT <= A when SEL = ‘0’else B;
MUX_OR <= ‘1’ when MUX_OUT /= “00000000” else ‘0’;
end [ARQUI];
 NOTA: As atribuiçõs a MUX_OUT e MUX_OR ocorrem concorrentemente !!
57
VHDL

A parelha entidade / arquitetura :

Arquitetura : Informações complementares (1)
A parte declaratória pode conter:
 Declarações de sinais internos.
(que nao sejam I/Os)
 Declarações de componentes.
(gerência da hierarquía, VHDL estrutural).
 Declarações de constantes.
 Declarações de tipos de objetos.
(utilizados em particular para as máquinas de estado).
 Declarações de sub-programas.
(funções e procedimentos).
58
VHDL

A parelha entidade / arquitetura :
 Arquitetura
: Informações complementares (2)
 O código operatório pode conter:
 Atribuições concorrentes de sinais.
(os resultados de síntese e de simulação são independentes da ordem de
escrita das instruções).
CÓDIGO
RTL
 Atribuições sequenciais:
Processos e/ou sub programas
Na simulação a execução de instruções ocorre na ordem de escrita do
código (sequencialmente).
Na síntese lógica, ou seja, na implementação, o mesmo comportamento é
reproduzido.
 Instanciação de “caixas pretas”. (componentes).
O módulo sendo desenvolvido pode chamar a outros sub-módulos (gerência
CÓDIGO
de hierarquía, VHDL estrutural).
ESTRUTURAL
59
VHDL
A parelha entidade / arquitetura :
 Solução Completa : Arquivo “EXEMPLO.vhd”

entitiy EXEMPLO is
port (
A,B : in bit_vector(7 downto 0);
SEL : in bit;
- - O símbolo “;” se utiliza como separador entre
MUX_OR : out bit
- - duas declarações de sinais e não deve
);
- - aparecer depois do último símbolo declarado
end [EXEMPLO];
architecture ARQUI of EXEMPLO is
- - parte delaratória
signal MUX_OUT : bit_vector (7 downto 0); - - sinal interno
- - parte operativa
begin
MUX_OUT <= A when SEL= ‘0’ else B;
MUX_OR <= ‘1’ when MUX_OUT /= “00000000” else ‘0’;
end [ARQUI];
60
VHDL - COMPONENT

O Componente é uma Estrutura que Referencia
Diretamente uma Entidade e Possibilita a
Instanciação e Replicação da Mesma sem a
Necessidade de Descrevê-la Novamente.
ENTITY inv IS PORT (
e : IN bit;
s: OUT bit);
END inv;
ARCHITECTURE inversor OF inv IS
BEGIN
s<= NOT e;
END inversor;
ENTITY yyy is PORT (
------)
END yyy;
ARQUITECTURE xxx of yyy IS
signal T : -----------COMPONENT inv IS
port (e: IN bit; s:OUT bit);
END COMPONENT;
BEGIN
--U1: inv PORT MAP (e=>a , s=> s1);
U2: inv PORT MAP (e=> b, s=> s2);
END ARCHITECTURE xxx;
61
VHDL – PACKAGE

Coleção de Tipos, Constantes, Subprogramas,
agrupando Elementos Relacionados. Dividemse em:
 Declaração
 Corpo
 Corpo Pode Conter Definição de Procedimentos e
Funções

Declaração:
PACKAGE cpu IS
SUBTYPE byte IS bit_vector (7 DOWNTO 0);
FUNCTION inc (valor: integer) RETURN integer;
END cpu;
PACKAGE BODY cpu IS
FUNCTION inc (valor:integer) RETURN integer
IS
VARIABLE result : integer;
BEGIN
result := valor + 1;
RETURN result;
END inc;
END cpu;
USO:
LIBRARY ieee;
USE ieee.std_logic_1164.all;
USE work.cpu.ALL;

ENTITY xxx IS
--------END xxx;
ARCHITECTURE yyy OF xxx IS
BEGIN
--------PROCESS
--------VARIABLE reg: byte;
pc <= inc (pc);
--------END PROCESS
END ARCHITECTURE;
NOTA: Se não declarar o package no
início, aponta-se o caminho:
VARIABLE reg : work.cpu.byte;
pc <= work.cpu.inc (pc);
62
VHDL – Exemplo: PACKAGE e COMPONENT
ARQUIVO: meu_package.vhd
library ieee;
use ieee.std_logic_1164.all;
package meu_package is
component nor2 port(
a, b: in bit;
sai: buffer bit);
end component;
end meu_package;
library ieee;
use ieee.std_logic_1164.all;
entity nor2 is port (
a,b: in bit;
sai: buffer bit);
end nor2;
architecture meu_nor2 of nor2 is
begin
sai <= a nor b;
end meu_nor2;
ARQUIVO: Tst_ff_SR.vhd
library ieee;
use ieee.std_logic_1164.all;
use work.meu_package.all;
entity meu_ff_SR is port (
set, reset :
in bit;
Q, NQ :
buffer bit);
end meu_ff_SR;
architecture Tst_FF_SR of meu_ff_SR is
begin
CI1: nor2 port map (reset, NQ, Q);
CI2: nor2 port map (Q, set, NQ);
end Tst_FF_SR;
NOTA: OBSERVAR QUE AO DECLARAR O
COMPONENTE NOR2 (esquerda)
TIVEMOS QUE DECLARAR
NOVAMENTE AS BIBLIOTECAS
UTILIZADAS – FAZE-LO PARA TODOS
OS COMPONENTES !!!!!
63
SUBPROGRAMA: FUNÇÕES
Funções São Usadas para Computar
Valores e não Para Mudar o Valor de
Objetos Associados c/Parâmetros (não
mudam sinais). Parâmetros devem ser do
modo IN e da classe SIGNAL ou
CONSTANT.
LIBRARY ieee;
USE ieee.std_logic_1164.all;
ENTITY mult4bits is port (
a, b: IN std_logic_vector (3 downto 0);
s: OUT std_logic_vector (3 downto 0);
END mult4bits;
ARCHITECTURE arch_mult4bits of mult4bits IS
FUNCTION deslocador (x:std_logic_vector (3
downto 0))
RETURN std_logic_vector IS
VARIABLE y : std_logic_vector (3 downto 0);
BEGIN
for i in 3 downto 1 loop
y(i) := x(i-1);
end loop;
y(0) := ´0´;
return y;
END;
FUNCTION somador4bits(
a:std_logic_vector (3 downto 0);
b:std_logic_vector (3 downto 0))
RETURN std_logic_vector IS
VARIABLE vaium: std_logic;
VARIABLE soma: std_logic_vector(3 downto 0);
BEGIN
vaium := ´0´;
FOR i IN 0 TO 3 LOOP
soma(i) := a(i) xor b(i) xor vaium;
vaium := (a(i) and b(i) ) or (b(i) and
vaium) or (vaium and a(i));
END LOOP;
RETURN soma;
END;
BEGIN
-- BEGIN da ARQUITETURA
PROCESS (a, b)
VARIABLE ---BEGIN
-----------aux1 := deslocador (aux1);
-----------aux2 := somador4bits (aux1, b);
-----------END PROCESS;
END arch_mult4bits;
64
SUBPROGRAMA: PROCEDURES
Procedures Podem Trocar os Valores de
Objetos Associados c/Parâmetros Formais
(podem trocar sinais de valor). Parâmetros
Podem ser do modo IN, OUT e INOUT.
-----------------O SOMADOR4BITS é semelhante ao caso de
Funcao
------------------
LIBRARY ieee;
USE ieee.std_logic_1164.all;
ENTITY mult4bits is port (
a, b: IN std_logic_vector (3 downto 0);
s: OUT std_logic_vector (3 downto 0);
END mult4bits;
ARCHITECTURE arch_mult4bits of mult4bits IS
PROCEDURE deslocador (
SIGNAL x: IN std_logic_vector (3 downto 0);
SIGNAL y: OUT std_logic_vector (3 dwonto 0)
IS
BEGIN
for i in 3 downto 1 loop
y(i) <= x(i-1);
end loop;
y(0) <= ´0´;
END;
BEGIN
-- BEGIN da ARQUITETURA
-----------deslocador (ent1(3 downto 0), sai1 (3 downto 0);
-----------somador4bits (A (3 downto 0), B (3 downto 0),
SOMA (3 downto 0));
-----------END arch_mult4bits;
65
VHDL
Instruções, Sentenças e Procedures
Concorrentes
 Instrução When ….Else
 Instrução With ….. Select
 Instrução For i in ….. Generate
 Sentença Process
 Sentença de Instanciação de Componente
 Procedure Call Concorrente
 Sentença de Atribuição a Sinal Concorrente
 Sentença Block
 Sentença de Declarar / Reportar Concorrente (Assert / Report).
66
VHDL

Instruções concorrentes:
As operações se efetúam ao mesmo tempo (em paralelo).
 A ordem de escrita do código VHDL não afeta o resultado da síntese ou da
simulação
 O estilo de escrita é comparável às linguagens de programação de PALs ou
Linguagens Declarativas (equações lógicas).
 Exemplo de atribuições simples: (equações)
entity CONCURRENT is
port (A, B, C : in bit;
Não precisava
S, T : out bit); end CONCURRENT;
ter este nome
architecture ARCHI of CONCURRENT is
begin
S <= (A and B) and not (C);
T <= B xor C;
-- a ordem da atribuição de S e de T é indiferente.
end ARCHI;
67
VHDL

Instruções concorrentes:
 Atribuição de sinais por condição: WHEN ... ELSE
 Sintaxe:
signal_x <= valor_x when signal_y = valor_y else valor_z;
 Notar que valor_z é indicado diretamente depois de “else”. (O símbolo de
atribuição “<=“ é aqui implícito).
 Exemplo:
entity LOGICA1 is
port (A, B, C : in bit;
S, T : out bit);
end LOGICA1;
architecture ARCHI of LOGICA1 is begin
S<= A when C=‘1’ else B;
-- SINTETIZA COM MUX 2:1 !!
T <= not B;
end ARCHI;
As duas instruções são
concorrentes e geram =>
A
1M
B
0X
U
S
B
T
C
68
VHDL

Instruções concorrentes:
 Atribuição de sinais por condição: WHEN ... ELSE
entity BUFFER_BUS_TRISTATE is
port (A, B : in std_logic_vector (15 downto 0);
C : in std_logic;
S : out std_logic_vector (15 downto 0));
end BUFFER_BUS_TRISTATE;
architecture ARCHI of BUFFER_BUS_TRISTATE is
begin
S <= A when C = ‘1’else “ZZZZZZZZZZZZZZZZ”; -- SINTETIZA COM
S <= B when C = ‘0’else “ZZZZZZZZZZZZZZZZ”; -- BUFFER 3-STATE
end ARCHI;
As duas instruções são
concorrentes e geram =>
B[15:0]
S[15:0]
C
A[15:0]
69
VHDL

Instruções concorrentes:
 Atribuição de sinais por seleção: WITH ... SELECT
 Exemplo:
architecture ARCHI of SELETOR_SINAIS is
begin
with SEL select
S <=
A when “00”, -- SINTETIZA COM CIRCUITO MUX N:1
B when “01”, -- OU TAMBÉM CHAMADO SELETOR
C when “10”,
D when others;
T <=
not B;
end ARCHI;
A
00
B
01
S
C
10
D
Outros casos
B
T
SEL [1:0]
70
VHDL

Instruções Concorrentes:
 Instrução de Loop: FOR i IN ... GENERATE :
Sintaxe:
LABEL : for I in inteiro_a to inteiro_b generate
- - instruções concorrentes
end generate;
A utilização de um LABEL é obrigatória.
LABEL1 : for I in 0 to 15 generate
S(I) <= A(I) when C = ‘0’ else ‘Z’;
S(I) <= B(I) when C = ‘1’ else ‘Z’;
end generate;
LABEL1 : for I in S’range generate
S(I) <= A(I) when C = ‘0’else ‘Z’;
S(I) <= B(I) when C = ‘1’else ‘Z’;
end generate;
RANGE é um atributo pré-definido
em VHDL. Código genérico,
independente da largura do bus.
Portabilidade, re-uso, evolução
B[15:0]
S[15:0]
C
A[15:0]
71
VHDL

Exercício:
BUS_A[3:0]
Comparador (when ... Else)
a
A_MIN
A
A<B
BUS_B[3:0]
f
(Declarado em modo OUT)
e
B
1
0
1
0
SEL_MIN
Mux Lógicos
MUX
2:1
VAL[3:0]
b
c
d
Multiplexor tri-state
(for I in ... Generate)
MIN[3:0]
g
D
E
C
O
D
E
R
(sinal interno)
DISPLAY[6:0]
MAX[3:0]
MUX
2:1
6
A
5
B
4
C
3
D
2
E
Decodificador
1
7 segmentos
0
F
G
(with ... Select)
(when ... Else)
72
VHDL

Exercício:
library ieee;
use ieee.std_logic.1164.all;
entity COMPARADOR_DISPLAY is
port (
-----;
end COMPARADOR_DISPLAY;
architecture AQUITETURA of .... Is
signal .....
Signal .....
--------VALOR1 : for I in .... generate
-------end generate;
with VAL select
DISPLAY <= “0000001” when x”0”,
------“0000000” when others;
A <= ......;
------------;
end ARCHI;
73
VHDL
Instruções Sequenciais
Algumas Características de Processos
74
VHDL

Instruções Sequenciais: noção de PROCESSO

Um PROCESSO é uma parte do código onde as
instruções executam em sequencia (na ordem em
que são escritas), mas uma variável ou sinal só
armazenará o último valor atribuído.

Uma mesma arquitetura pode conter diversos
PROCESSOS.

Todos os processos executam em paralelo. (um
PROCESSO é equivalente a uma instrução
concorrente complexa).

O conjunto de instruções utilizáveis dentro de um
processo é diferente do conjunto de instruções
concorrentes.

A ordem de escrita das instruções afeta os
resultados da simulação e da síntese.
75
VHDL

Instruções sequenciais:
As operações se efetuam em sequência.
 A ordem afeta os resultados de simulação e de síntese.
 Estilo de escrita parecido às linguagens de alto nível de informática.
 As instruções sequenciais se utilizam em partes específicas do código:
PROCESS ou subprogramas.
 Exemplo:
architecture ARCHI of SEQUENCIA is
begin
process begin
wait until CK’event and CK=‘1’;
if ENA = ‘1’ then COUNT <= COUNT +1;
end if;
end process;
end ARCHI;
76
VHDL

Instruções sequenciais: noção de PROCESS

Implementação de:
 Lógica combinatória (processo combinatório).
 Lógica síncrona (processo síncrono).
 Lógica síncrona com inicialização assíncrona.


Em simulação, um process diz-se dormindo até que os sinais suscetíveis de
ativá-lo troquem de estado.
Estrutura geral de um process:
Label opcional
Lista dos sinais
podendo provocar uma
reavaliação do valor
dos sinais atribuídos
no Process
[Label:] process (lista_de_sensibilidades)
-- parte declaratória
-- declaração eventual de variáveis
begin -- parte operatória
-- instruções sequenciais (if, case, loop ...)
end process;
77
VHDL

Metodologia de uso dos PROCESS em síntese:
A
A
S
D
B
C
U
D
S
D
D
Q
T
C
begin
if (A=‘1’ and B=‘0’)
then ....
S
C
D
D
Q
T
C R
CK
Reset
Process (CK)
- - process sincrono
- - process combinatório
DS Q
C
C
CK
Process (A, B, C, D)
A
B
C
B
T
Q
Process (CK, Reset)
- - process sincrono
- - com iniciação
begin
- - assíncrona
if CK’event and CK=‘1’
begin
then
if Reset =‘1’then
if (A=‘1’and B=‘0’
S <= ‘1’; T <= ‘0’;
then ...
elsif CK’event and CK=‘1’
then
if (A=‘1’ and B=‘0’)
then ...
78
VHDL

Incoerências de projeto de hardware
A
(suportadas pela linguagem VHDL)
B
A
D
B
Q
S
D
D
D
Q
T
C
S
C
C
C
C
DSQ
Não podem
estar na lista de
sensibilidade !!
CK
CK
D
Q
T
CR
INIT
Process (CK,INIT,A,B,C,D)
Process (CK,A,B,C,D)
- - process sincrono
- - com iniciação
-- processo sincrono
- - assíncrona
begin
begin
if CK’event and CK=‘1’
if INIT =‘1’then
S <= ‘1’; T <= ‘0’;
then
elseif CK’event and CK=‘1’
if (A=‘1’ and B=‘0’
then ...
then
if (A=‘1’ and B=‘0’)
then ...
79
VHDL

Instruções Sequenciais : Noção de PROCESS.

Processos combinatórios :
 Exemplo:
MUX : process (A, B, SEL) -- lista de sensibilidades
-- parte declaratória não usada neste exemplo
begin
if SEL = ‘0’
then SAIDA <= A;
else SAIDA <= B;
end if;
end process;
Os sinais tratados dentro deste tipo de process são puramente
combinatórios (não se faz nenhuma referência à detecção do flanco de
troca (subida ou descida) do relógio.
A lista de sensibilidades contem todos os sinais que podem causar uma
atividade no processo. A parte declaratória pode conter variáveis e só
será visível dentro do process em que está declarada.
80
VHDL

Instruções Sequenciais : Noção de PROCESS.

Processo síncrono simples : (sem iniciação assíncrona)
 Exemplo:
process -- sem lista de sensibilidades neste caso !!!
begin
wait until (CK’event and CK=‘1’);
COUNT <= COUNT + 1; -- isto só é legal se a biblioteca
-- std_logic_unsigned for declarada
end process;
 O sinal COUNT (std_logic_vector) será construído por flip-flops.
 Nenhum sinal tratado neste process pode ser combinatório pois estará
sempre sendo analisado na subida do clock.
 Não há lista de sensibilidades (Usa-se Wait ) - a única condição que
provocará uma troca de estado será o flanco de subida do relógio (CK).
81
VHDL

Instruções Sequenciais : Noção de PROCESS.

Processos síncronos com iniciação assíncrona
 Exemplo:
[LABEL]: process(CK, RST)
-- lista de sinsibilidades
begin
if RST = ‘1’then
COUNT <= “0000”;
-- ação assíncrona ao CK
elsif (CK’event and CK=‘1’)then
COUNT <= COUNT + 1;
-- ação síncrona com CK
end if;
end process [LABEL];
 A lista de sensibilidades contém o sinal de relógio e sua iniciação
assíncrona. Neste caso, a condição assíncrona tem prioridade (IF
RST=‘1’) e o flanco do relógio não se leva em conta se a condição de
iniciação é verdadeira.
82
VHDL

PROCESS e conjunto de instruções sequenciais

Variáveis e sinais: Exemplo sobre os sinais:
entity SIG is
A
D Q
port (A, B, C, CK: in std_logic;
C
C
S, T: out std_logic);
end SIG;
D Q
architecture ARCHI of SIG is
C
CK
signal TMP : std_logic; begin
D Q
process
C
begin
wait until CK’event and CK=‘1’;
TMP <= A or B;
-- esta linha será ignorada
S <= TMP;
TMP <= A and C; -- anula a atribuição precedente
T <= TMP;
-- ao sinal TMP.
end process;
end ARCHI;
TMP
T
S
83
VHDL

PROCESS e conjunto de instruções sequenciais

Variáveis e sinais: Exemplo utilizando uma variável:
entity VARI is
A
port (A, B, C, CK: in std_logic;
D Q
B
S, T: out std_logic);
C
end VARI;
A
D Q
architecture ARCHI of VARI is
C
C
begin
CK
process
variable TMP : std_logic;
begin
wait until CK’event and CK=‘1’;
TMP <= A or B;
-- esta linha será efetiva
S <= TMP;
-- para a atribuição do sinal S
TMP <= A and C; -- esta o será
T <= TMP;
-- para a atribuição do sinal T
end process;
end ARCHI;
S
T
84
VHDL
Instruções Sequenciais
 Sentença If
 Sentença Case
 Sentença For-Loop
 Sentença While-Loop
 Sentença Next
 Sentença Null
 Sentença Procedure Call
 Sentença Return
 Sentença Wait
 Sentença de Atribuição a Sinal
 Sentença de Atribuição a Variável
 Sentença de Declarar / Reportar (Assert / Report)
85
VHDL
PROCESS e conjunto de instruções sequenciais

Instruções sequenciais frequentemente utlizadas
 IF … THEN … ; [ELSIF … THEN … ]; [ ELSE …];
END IF;
Similar à atribuição de sinais por condição.
 CASE … END CASE;
Similar à atribuição de sinais por seleção.
 FOR … LOOP END LOOP;
Similar à instrução FOR … GENERATE.
86
VHDL

IF … THEN … ; [ELSIF … THEN … ]; [ ELSE …]; END IF;

Exemplo:
signal A, B, C, D : std_logic_vector (7 downto 0);
signal SEL : std_logic_vector (1 downto 0);
signal MUX : std_logic_vector (7 downto 0);
BLABLA : process (A, B, C, D, SEL) -- rótulo BLABLA
-- parte declaratória não utilizada neste exemplo
begin
if
SEL = “00” then MUX <= A;
elsif SEL = “01” then MUX <= B;
elsif SEL = “10” then MUX <= C;
else
MUX <= D;
end if;
end process;
87
VHDL

IF … THEN … ; [ELSIF … THEN … ]; [ ELSE …]; END IF;

Mais Exemplos:
process (A, B, C, D, SEL) begin
if SEL=“00” then MUX <= A;
else if SEL = “01” then MUX <= B;
else if SEL = “10” then MUX <= C;
else MUX <= D;
end if;
end if;
end if;
end process;
process (A, B, C, D, SEL)
begin
if
SEL = “00” then
MUX
elsif
SEL = “01” then
MUX
elsif
SEL = “10” then
MUX
else
MUX
end if;
-- Um só “end
end process;
<= A;
<= B;
<= C;
<= D;
if” !!!
88
VHDL

IF … THEN … ; [ELSIF … THEN … ]; [ ELSE …]; END IF;

Mais Exemplos:
process (A, B, C, D, SEL) begin
if SEL=“00” then MUX <= A;
else if SEL = “01” then MUX <= B;
else if SEL = “10” then MUX <= C;
else MUX <= D;
end if;
end if;
end if;
end process;
process (A, B, C, D, SEL)
begin
if
SEL = “00” then
MUX
elsif
SEL = “01” then
MUX
elsif
SEL = “10” then
MUX
else
MUX
end if;
-- Um só “end
end process;
<= A;
<= B;
<= C;
<= D;
if” !!!
89
VHDL

IF … THEN … ; [ELSIF … THEN … ]; [ ELSE …]; END IF;
 Resultados de síntese:
D
0
0
C
0
1
“10”
CMP
SEL[1:0]
=
B
MUX
1
“01”
CMP
SEL[1:0]
=
A
1
“00”
CMP
SEL[1:0]
=
90
VHDL

IF … THEN … ; [ELSIF … THEN … ]; [ ELSE …]; END IF;
 Exemplo 3 : Utilização do Clock_Enable dedicado (com wait until):
architecture ARCHI of SEQUENCE is
begin
process begin
wait until CK’event and CK = ‘1’;
if ENA = ‘1’ then COUNT <= COUNT + 1;
end if;
Utilização do Clock Enable
end process;
end ARCHI;
dedicado dos FF Xilinx
--------
se ENA /= ‘1’, o processo pode ser ativado pelo flanco
do relógio, mas se a condição if ENA = ‘1’não é verdadeira
o último valor de COUNT será conservado.
Este estilo de escrita garante o uso do Clock_Enable
dos flip-flops FPGAs Xilinx, e permite por isso uma
economia substancial de elementos de lógica combinatória,
e de aumento da frequência de funcionamento.
91
VHDL

IF … THEN … ; [ELSIF … THEN … ]; [ ELSE …]; END IF;
 Exemplo 3b : Utilização do Clock_Enable dedicado (if CK’event ...):
architecture ARCHI of SEQUENCE is
begin
process (CK) begin
if CK’event and CK = ‘1’ then
if ENABLE = ‘1’ then COUNT <= COUNT + 1;
end if;
end if;
end process;
Utilização do Clock Enable
end ARCHI;
dedicado dos FF Xilinx
92
VHDL

IF … THEN … ; [ELSIF … THEN … ]; [ ELSE …]; END IF;
 Cuidado com os riscos de inserção de lógica
combinatória nos caminhos do relógio !
D
EC
D
Q
Q
C
CK
Process (CK, EC)
begin
if (CK’event and CK = ‘1’
Q <= D;
end if;
end process;
and EC = ‘1’) then
93
VHDL

CASE ... END CASE:
Instruções que permitem revisar todos os valores possíveis de um sinal.
Exemplo:
Process (A, B,
case SEL is
when
when
when
when
end case;
end process;
C, D, SEL) begin
“00”
“01”
“10”
others
=>
=>
=>
=>
MUX
MUX
MUX
MUX
<=
<=
<=
<=
A;
B;
C;
D;
“00”, ”01”, ”10”
SEL [1:0]
D
others
C
“10”
B
“01”
A
“00”
MUX
Decodificação
de valores
-- When others permite citar no final todos os outros
-- casos possíveis que não foram citados anteriormente
-- O símbolo “=>”’é interpretado como “portanto”.
94
VHDL

IF ... END IF e CASE ... END CASE:
Mistura de IF e de CASE.
Exemplo:
Process (FASE, AÇÃO) begin
case FASE is
when “00”=> if
AÇÃO = “00” then
elseif
AÇÃO = “10” then
else
end if;
when “01” => if
AÇÃO = “00” then
else
end if;
when others => SAIDA <= “000”;
end case;
end process;
SAIDA
STATUS
SAIDA
STATUS
SAIDA
STATUS
<=
<=
<=
<=
<=
<=
“010”;
“01”;
“011”;
“01”;
“000”;
“00”;
SAIDA
STATUS
SAIDA
STATUS
<=
<=
<=
<=
“100”;
“10”;
“101”;
“00”;
STATUS <= “00”;
95
VHDL

FOR …. LOOP:
Exemplo:
Meu_For_Loop:
for i in 3 downto 0 loop
if reset(i) = ‘1’then
data_out(i) := ‘0’;
end if;
end loop Meu_For_Loop;
96
VHDL

WHILE ….. LOOP:
Exemplo:
count:= 16;
Meu_While_Loop:
While (count > 0) loop
count := count -1;
result <= result + data_in;
end loop Meu_While_Loop;
97
VHDL
Os Sub-programas
Funções e Procedimentos
98
VHDL

Funções:
 Sub-programa podendo ser chamado uma ou varias vezes pelo
programa principal. Permite organizar o código separando as partes
repetidas.
 Uma função deve ser declarada antes de ser utilizada.
 Necessita um ou mais parâmetros de entrada e regressa um valor.
 Exemplo:
function BOOL_TO_BIT ( A: in boolean) return STD_LOGIC is
begin
if A then return ‘1’;
else return ‘0’;
end if;
end BOOL_TO_BIT;
PALAVRA RESERVADA !!
99
VHDL

Funções:
 As funções usam o conjunto das instruções sequenciais.
 Os parâmetros (entradas) da função são inteiramente genéricos. Ex:
function COISA ( ABUS: in std_logic_vector) return boolean is ...
 Variáveis locais podem ser declaradas
 As variáveis declaradas dentro de uma função são reinicializadas a cada
chamada.
 As funções podem ser declaradas dentro da parte declaratória da
arquitetura ou dentro de um package.
 Utilizadas para efetuar as conversões de dados (e.g.: std_logic_vector para
inteiro), ou operações lógicas e aritméticas diversas.
 Os operadores “+”, “-”, “=“, … são definidos por funções
 As funções podem ser redefinidas (sobrecarregadas) com o fim de, por
exemplo, serem aplicáveis a tipos de dados não previstos inicialmente. Por
exemplo:
O package STD_LOGIC_UNSIGNED redefine os operadores aritméticos e
relacionais para serem aplicáveis ao tipo STD_LOGIC_VECTOR.
100
VHDL

Funções: Exemplo de sobrecarga de funções
(operador “+” para somas entre STD_LOGIC_VECTOR e inteiros)
function “+” (A : std_logic_vector; B : integer)
return std_logic_vector is
variable INT_A : integer range 0 to ((2**(A’high+1))-1);
variable STD_OUT : std_logic_vector (A’range);
begin
INT_A := 0;
for I in A’range loop
if A(I) = ‘1’ then INT_A:=INT_A + 2**I; else INT_A:=INT_A;
end if;
-- este loop converte o vetor para inteiro
end loop;
INT_A := INT_A + B; -- soma de 2 inteiros
for J in A’reverse_range loop
if INT_A rem 2 = 1 then STD_OUT(J):=‘1’; else STD_OUT(J):=‘0’;
end if;
INT_A := INT_A / 2;
end loop;
-- conversão do int. INT_A em std_logic_vector
return STD_OUT; -- o valor retornado é um std_logic_vector
end;
101
VHDL

Procedimentos:
 Sub-programa que pode ser chamado uma ou varias vezes desde o
programa principal.
 Um procedimento pode ter como parâmetros objetocs em modo in,
out ou inout.
(como um “component”, mas o tamanho dos parâmetros sempre é
genérico).
 Os procedimentos usam o conjunto de instruções sequenciais.
 Variáveis locais podem ser declaradas e estarão reiniciadas a cada
chamada do procedimento.
102
VHDL

Procedimentos: Exemplo 1:
library IEEE;
use IEEE.STD_LOGIC_1164.all;
entity PROCED is
port (A, B : in STD_LOGIC_VECTOR (9 downto 0);
SAIDA : out STD_LOGIC_VECTOR (9 downto 0));
end PROCED;
architecture ARCHI of PROCEDU is
procedure MIN (signal L, M : in STD_LOGIC_VECTOR;
signal S : out STD_LOGIC_VECTOR) is
begin
if L < M then S<=L; else S<=M; end if;
end MIN;
Especifícação da classe de objeto
begin
MIN (A, B, SAIDA);
(Sinais e constantes)
end ARCHI;
Chamada
Declaração de Procedimento
103
Download

END IF