Escolar Documentos
Profissional Documentos
Cultura Documentos
Dicas VHDL
Dicas VHDL
2 No se pode declarar um sinal dentro de um Process (apenas variveis), mas pode-se atribuir o
valor de uma varivel a um sinal, ou realizar operaes entre sinais e variveis.
3 Sinais podem ser usados dentro de um Process, mas atribuies a sinais dentro de processo
podem causar resultados inesperados porque a atribuio do valor retardada at que um
comando WAIT seja executado. O mesmo ocorre se o processo for disparado por alguma mudana
em um ou mais elementos da lista de sensibilidades, que equivalente a executar um WAIT no final do
processo.
4 Sinais so usados para fazer comunicao entre processos e tambm so usados para interligar
(wire) projetos estruturais (projetos que explicitam a interligao fsica dos mdulos, sem detalhar o
comportamento de cada mdulo).
5 Dentro de um processo, atribuies a sinais podem enviar dados para outros processos (disparando-
os).
6 Dentro de um processo, valores de sinais podem ser usados do lado direito de expresses para
atribuir valores a variveis.
9 ATRASO DE SINAIS Quando uma atribuio de sinal simulada, a mudana de sinal ocorre num
instante preciso de tempo simulado (isto j no se pode precisar na sntese do circuito). Tais atribuies
de atraso nos sinais servem para simulao, mas no servem para sntese. Quando ser for sintetizar o
1
circuito devem-se usar clocks e contadores para gerar os atrasos necessrios. Veja-se um exemplo
abaixo, que para simulao est OK, mas para sintetizar no serve:
signal x : integer;
process ---
begin
---- -
x <= x + 1 after 10 ns; -- para sintetizar precisa usar registro c/ clock para
--- - -- construir um contador e garantir esse tempo.
end;
10 ATRASO ZERO Atribuies de sinais podem especificar atraso ZERO, bastando no indicar a
clusula de atraso AFTER; Ex: x <= x+1;
entity VAR is
port (A : in BIT_VECTOR (0 to 7);
INDEX : in INTEGER range 0 to 7;
OUTPUT : out BIT);
End VAR;
Architecture VHDL_1 of VAR is
Begin
Process
Begin
OUTPUT <= A (INDEX); --- schedulado em 0 ns; (0ns aps o que for especificado
WAIT -- -- pelo WAIT)
---- -
end VHDL_1;
---- MESMO COM ZERO DELAY precisa ter o comando WAIT !
Ex1: V := 1;
S <= V;
A := S; -- A recebe o valor velho de S e no V (ou 1);
WAIT ---;
Ex2: X <= 1;
X <= 2;
WAIT for 0 ns; -- Aps o wait ser executado, x recebe valor 2.
12 FORMAS DE WAIT:
2
WAIT; -- suspende exec. Do processo para sempre usado em processos de inicializao. Nao h
modo de matar um processo em VHDL.
13 Ao invs de ter um ou mais comandos WAIT dentro de um processo, pode-se usar uma lista de
sensibilidade. equivalente a ter um WAIT no fim do processo. NO SE PODE TER LISTA DE
SENSIBILIDADES E WAIT AO MESMO TEMPO NUM PROCESSO.
14 O LOOP FOR:
15 Restrio de RANGE uma restrio de range usa valores que deveriam ser compatveis com o
tipo que esto relacionadas, e estar numa direo compatvel com a declarao original do tipo. O valor
inicial default o extremo inferior do range.
Ex:
Integer range 1 to 10 == NAO == integer range 10 to 1
Integer range 10 downto 1 == NO == integer range 1 downto 10
16 Declarao de Sinais
Sinais podem ser declarados em diversos lugares: entidade, arquitetura ou num package.
3
Sinais podem ser abstraes de fios fsicos, de barramentos, ou usados para documentar fios num
circuito real. Um sinal deve ser declarado com um tipo, antes de ser usado. A sintaxe :
Declarao de sinal:
Escalar : signal name(s) : type [range_constraint][:=expression];
Array: signal name(s) : array_type[index_constraint][:=expression];
Entity: port (name(s): direction type [range_constraint][:=expression];
Caso contrrio, o valor default inicial o valor mais baixo daquele tipo.
17 EXPRESSES:
Alm dos tipos padro (standard), algumas empresas fornecem tipos de dados estendidos e operadores
sobrecarregados (funes), tal como declarado num package. Algumas empresas podem fornecer
operadores com converso automtica de tipos, mas o Package STANDARD no fornece tais
operadores.
Ex:
Geralmente operandos tem que ser do mesmo tipo. No h converso automtica de tipos.
Exemplo NO SE PODE ESPECIFICAR:
1 + 1.0
4
Operador de
Concatenao & Concatenao
Operadores + Adio Mesmo tipo
Aritmticos - Subtrao Mesmo tipo
19 OPERADORES
Operadores Lgicos trabalham com tipos BIT, BOOLEAN, STD_LOGIC, vetores de tamanho igual
e NO EM INTEIROS.
Operadores Relacionais trabalham com qualquer tipo de escalar ou tipo array UNI-DIMENSIONAL
cujo tipo de elemento um tipo discreto (enumerao ou inteiro).
Em alguns casos operadores so especificaes para um bloco de hardware para ser construdo usando
ferramentas de sntese lgica. A adio inteira (+) poderia produzir um somador de 32 bits, a menos
que o usurio especifique um tipo explcito (comprimento do somador). O exemplo abaixo representa
um somador de 8 bits (ao invs de 32), com fios a, b, e x. Por exemplo:
Normalmente VHDL requer que a soma seja do mesmo comprimento das parcelas. Para dar conta do
vai um do bit mais significativo da soma, faz-se:
5
Variable x : STD_LOGIC_VECTOR (9 downto 1);
x := 0&a + 0&b;
Use IEEE.std_logic_signed.all;
Use IEEE.std_logic_unsigned.all;
Ao usar expresses aritmticas literais, o nome dos subtipos signed e unsigned podem ser usados para
indicar o tipo nico de operador desejado. Por exemplo:
6
Package STD_LOGIC_1164 Std_logic
Std_logic_vector
BIT o valor de um sinal num sistema digital. Um literal bit representa dois valores discretos atravs
do uso os literais caracteres 0 ou 1, bit(1). O standard IEEE 1164 define nove foras (U, X,
0, 1, Z, L, H, etc) de sinal num package VHDL para o tipo STD_LOGIC. Estes nove valores so
mais teis para simulao e sntese do que o tipo BIT puro. (Devido a isto, os tipos BIT e BOOLEAN
(true, false) so diferentes ).
BOOLEAN Um literal Booleano representa dois valores discretos somente: TRUE ou FALSE. Um
literal booleano no um um literal BIT, nem tem relao com ele !!. Um BOOLEANO pode ser
testado numa sentena IF. O valor default falso para valores no incializados.
Operadores relacionais, como =, <=, >=, /=, etc produzem um resultado BOOLEANO.
Um sinal booleano comumente usado para expressar o estado de um sinal eletrnico ou Bus, sem
escolher o valor real de voltagem eltrica (ou uma das foras tipo BIT). Portanto, um Boolean uma
representao abstrata. O package STANDARD no predefine um array de valores booleanos.
7
1) A := B xor C and D; Invlida precisa parnteses pois os 2 operadores lgicos tem o
mesmo nvel e se trocar a ordem troca o resultado. Alm disso
o tipo no BOOLEAN e deveria ser.
28 Funes e Procedimentos podem ser declarados numa entidade, arquitetura ou package, mas
so instanciados dentro de processos e portanto so sequenciais. H uma exceo para procedure
call concorrente que pode ser usada dentro da arquitetura ver item 43.
Procedimento como uma funo, mas podem ser retornados mais de um valor, usando parmetros. Os
parmetros so do tipo IN, OUT e INOUT. Os parmetros podem ser variveis ou sinais.
Procedimentos usam a sentena RETURN sem valor.
Procedimento PODE conter sentena WAIT e parmetros tipo sinal podem passar sinais para
serem esperados na sentena WAIT.
O procedimento tem que ser declarado num package, no cabealho de um processo ou na declarao de
uma arquitetura antes de ser chamado.
begin process
variable a, b, data : integer;
variable instruct : instruction;
begin
....
case instruct is
when lda => a := data; -- load a accumulator
when ldb => b := data; -- load b accumulator
when add => a:= a + b; -- add two acuumulators
end case;
wait on data;
end process;
end behave;
Note-se que durante a sntese lgica ser realizada uma codificao numrica para o CASE, que poder
introduzir estados invlidos, ou seja, associando 00 a lda, 01 a ldb e 10 a add, o que seria associado
quando um valor numrico 11 fosse gerado ?? Seria prudente associar um valor (e.g. invalido) ao valor
11 e tomar alguma atitude caso ele acontecesse, ao invs de deixar indefinido.
8
30 Expresses Qualificadas
difcil distinguir entre o caracter 1, o bit 1 ou std_logic 1. difcil saber com segurana o tipo
de literal que ele , pois precisa-se saber o contexto. Precisa-se typecasting ser explcito no tipo de um
valor. Isto pode ser feito usando uma expresso qualificada. Exemplo:
Bit(1)
Outro exemplo :
June de tipo ambguo (April tambm) em alguns contextos. Voc pode qualificar June e explicar
exatamente o que June representa em VHDL com a expresso qualificada:
Months(June)
Name(June).
Quando um tipo tem valores compartilhados com outros tipos, pode ser necessrio tornar claro isso,
fazendo um casting de um literal para um tipo particular. A sintaxe :
expresso_qualificada
type(literal ou expresso).
No confundir uma expresso qualificada com uma funo que realiza converso.
a integer (3.0) um call legal para uma funo de converso de real para inteiro.
b integer(3.0) uma expresso invlida pois no se pode fazer cast do tipo real para o
tipo inteiro.
31 - Subtipos escalares
type instr is (add, sub, mul, div, sta, stb, outa, xfr);
subtype arith is instr range add to div; -- subconjunto de instr.
subtype pos is integer range 1 to 2147483647; -- subconjunto de inteiros
subtype nano is time range 0 ns to 1 us; -- subconjunto de tempo
32 Atribuio de ARRAYS
33 AGREGADOS
9
Um array literal pode conter uma lista de elementos tanto com notao posicional como com notao
nomeada, formando um tipo agregado. A sintaxe :
Ex:
Variable X : BIT_VECTOR (1 to 4);
Variable A, B: BIT;
X(1) recebe 1
X(2) recebe (A nand B)
X(3) recebe 1
X(4) recebe (A or B)
Exemplo de array sem limites: type BIT_VECTOR is array (natural range <>) of BIT;
ARRAYS MULTIDIMENSIONAIS
Type memory is array (0 to 7, 0 to 3) of bit;
Constant ROM : memory := ( (0,0,0,0),
(0,0,0,1),
========
(0,1,1,1));
Exemplo de referncia:
Data_bit := ROM (5,3);
ARRAY de ARRAYS
35 SUBTIPOS DE ARRAY
10
Pode ser conveniente declarar um novo tipo (subtipo) de um tipo de array. Isto feito atribuindo limites
ao tipo de array ilimitado. Por exemplo:
36 PROCEDURE- Parametros de
O modo dos parmetros IN, OUT e INOUT. Os parmetros podem ser sinais ou variveis. Se no
declarados como sinais, o default serem variveis.
Exemplo:
37 Subtipos Escalares
type instr is (add, sub, mul, div, sta, stb, outa, xfr);
subtype arith is instr range add to div; -- sbuset of instr
11
Type two_digit is
RECORD sign : bit;
Msd : integer range 0 to 9;
Lsd : integer range 0 to 9;
END RECORD;
PROCESS
VARIABLE ACNTR, BCNTR : two_digit;
BEGIN
ACNTR.sign := 1;
ACNTR.msd := 1;
ACNTR.lsd := ACNTR.msd;
BCNTR := two_digit(0,3,6);
END PROCESS;
Usados para operaes de Entrada e Sada durante simulao. Estes tipos so usados numa declarao file com
funes read, write e end-of-file. Arquivos do tipo texto so tratados como grupos de linhas.
Na biblioteca STD, existe um conjunto de funes e tipos no Package TEXTIO que so predefinidos. Os
procedimentos de entrada no package TEXTIO so readline e read. Os procedimentos de sada no package
TEXTIO so writeline e write. Por exemplo:
Read (L: Inout Line; ITEM : integer); -- L um item da linha L na varivel ITEM.
a : process ...
file testvectors : TEXT is in test.vec;
variable L : Line;
variable av, bv : bit_vector (3 downto 0);
begin
readline (testvectors, L);
read (L, av);
bv := av;
- - - - - - - - - -
Continuando ..
preciso criar uma referncia para o package desta biblioteca antes de fazer I/O de texto:
Use STD.TEXTIO.ALL;
Alm disso, h duas funes que retornam valores Booleanos que indicam condies EOF ou EOL.
ENFILE (filename)
ENDLINE(filename)
Exemplo completo:
USE STD.TEXTIO.ALL;
ENTITY copy4 IS
END copy4;
ARCHITECTURE first OF copy4 IS
BEGIN
PROCESS (go)
FILE instuff : TEXT IS IN /path/test.data;
FILE outfile: TEXT IS OUT /path/new.data;
VARIABLE L1, L2 : LINE;
VARIABLE av: bit_vector (3 downto 0);
BEGIN
WHILE NOT (ENDFILE(instuff)) LOOP
12
READLINE (instuff, L1); -- l uma linha do arquivo de entrada
READ (L1, av); -- L um valor da linha
WRITE (L2, av);
WRITELINE (outfile, L2);
END LOOP;
END PROCESS;
END first;
0011
00_11
1100
16#F#
1010 1011
Underscores so permitidos e ignorados. Smbolos # indicam um nmero numa base diferente (por
exemplo, base 16). Dados do tipo bit e bit_vector no tem aspas. Tipos enumerados, que utilizam
identificadores no podem ser lidos ou escritos com TEXTIO.
40 Tipos ACCESS
Tipos Access no so suportados por ferramentas de sntese, mas podem ser usados durante simulao.
Tipos Access so semelhantes a ponteiros em linguagens de programao. Eles auxiliam a construir
estruturas na memria do simulador, que podem ser de tamanhos variados. Eles permitem ao usurio
declarar dinamicamente quando memria necessria para um item e para alocar memria do simulador
quando necessria para guardar novos itens criados. Variveis do tipo access so ponteiros que podem
ser manipulados. Um uso tpico de tipos de acesso para criar uma estrutura de lista linkada.
O operador NEW faz com que o sistema do simulador aloque armazenamento para um item
(tipicamente um record) e ele retorne o endereo de onde o novo item armazenado na memria do
simulador. Uma outra operao DEALLOCATE, que deleta um item da memria. Vejam-se os
exemplos abaixo:
Para acessar elementos no record, use o nome do campo selecionado com o ponteiro. Por exemplo:
Xptr.msd := 1001;
41 CICLO DE SIMULAO
Os simuladores de primeira gerao usavam uma tcnica que os desenvolvedores de sistemas CAD chamam
algoritmo de uma lista, que relativamente rpido mas que no consegue lidar com eventos paralelos de
atraso zero, tais como trocar os valores de A e B. O significado e os problemas que esto associados com esta
atribuio de sinais com atraso zero pode ser ilustrado por um exemplo simples:
13
-- valor velho de B.
Este exemplo no trocaria os valores de A e B, mas daria a A e a B o valor velho de B, usando o algoritmo de uma
lista.
Simuladores VHDL modernos usam um algoritmos de duas listas que verificam os valores anteriores e os
novos dos sinais. Neste mtodo, as expresses so primeiro avaliadas e depois os sinais so atribudos novos
valores. Em VHDL, o cdigo exemplo acima realiza uma troca de dados entre os dois sinais A e B, em algum
ponto do tempo de simulao (algum instante). Em operao, os valores velhos de B e A so buscados e
schedulados para atribuio, para atraso zero, aps uma sentena WAIT subsequente ser executada.
Este comportamento de duas fases do ciclo de simulao VHDL natural para projetistas de hardware que esto
acostumados com flip-flops clockados Master/Slave.
A ordem dos eventos de atraso zero tratada com uma unidade de tempo fictcia chamada delta time. Delta
time representa a execuo de um ciclo de simulao, sem avanar o tempo de simulao.
14
O ciclo de simulao VHDL mostrado abaixo:
A execuo de uma sentena WAIT ou uma mudana de um parmetro numa lista de sensibilidades
disparam a entrada num ciclo de simulao. O ciclo de simulao comea no tempo de entrada.
Os simuladores VHDL fazem todas as atribuies de sinais com valores previamente computados
e schedulados. Como alguns valores de sinais mudam, alguns processos podem ser ativados.
Ento, o ciclo de simulao vai atravs do tempo do meio e processos ativos so executados.
Sentenas de atribuio a variveis so executadas; expresses do lado direito das atribuies de
sinais so avaliadas.
Elementos que precisam ser schedulados so avaliados para se obterem os valores apropriados.
Pode ser necessrio voltar ao comeo sem na verdade avanar o tempo simulado. Este ciclo chamado
um passo delta time. Delta time a iterao sem o avano do tempo de simulao. Um simulador
poderia dar diversas voltas neste loop fazendo avaliaes a atribuies, sem avanar o tempo simulado.
Quando no forem disparados mais processos , o ciclo de simulao vai para o tempo Sai, e o tempo de
simulao ento avanado.
Notem-se 3 processos concorrentes na figura abaixo, que so disparados de acordo com suas listas de
sensibilidade. O processo A iniciado com a mudana do sinal CK e produz uma mudana no estado do
sinal Sa. O processo B disparado quando o sinal Sa muda de estado e este por sua vez faz com que o
sinal Sc mude e o Processo C seja ativado. Note-se tambm que as execues dos processos esto
acontecendo sem que o tempo de simulao seja avanado pois ainda no se estabilizaram as
mudanas. O processo C ao ser ativado faz com que o sinal Sd mude de estado. Isto faz com que o
processo A seja NOVAMENTE ativado (completou-se um loop). O procedimento transcorre at que
todos os sinais tenham estabilizado. A ento o tempo de simulao avanado.
Sa Sf
Ck PROCESSO A (ck,Sd) PROCESSO B (Sa, SeSg)
Se
Sb Sg
Sd
42 Atribuies Concorrentes a Sinais
PROCESSO C (Sc, Sb)
Sc
Alm de poder atribuir valores a sinais dentro de processos concorrentes, o que torna os sinais
concorrentes, possvel fazer atribuioes a sinais fora dos processos, o seja, dentro da arquitetura. Isto
15
similar a escrever um processo o qual s faz atribuir um valor a um sinal. Desta forma, as atribuies
a sinais dentro da arquitetura so concorrentes.
Note-se que na forma concorrente acima, qualquer sinal usado no lado direito da atribuio est (por
default) na lista de sensibilidades. A qualquer hora que o sinal mudar, a atribuio concorrente
avaliada e um valor atribudo ao sinal.
Exemplo:
Z <= A when (x>3) else
B when (x<3) else
C;
Este tipo de atribuio usado fora de um processo. Como uma atribuio concorrente, roda quando
ocorrer qualquer mudana no sinal selecionado, no exemplo o sinal MEUSINAL. Esta uma forma
reduzida de escrever um processo com uma sentena CASE.
Outra forma de sentena concorrente uma procedure call concorrente. Uma procedure call concorrente
uma procedure call que executada fora de um processo.
16
Procedure Call Concorrente: => Equivale a: Procedure Call dentro de um Processo:
Architecture Architecture
Begin Begin
Vector_to_int (bitstuff, flag, number); Process
End; Begin
Vector_to_int (bitstuff, flag, number);
Wait on bitstuff, number;
End process;
End;
Ela disparada nos dois casos quando algum dos seus parametros de entrada mudar.
44 Sentenas Block:
Uma sentena Block contm um conjunto de sentenas concorrentes e especialmente til para
organizar um projeto. Pode-se usar Block para particionar uma netlist estrutural. A sintaxe :
Block_statement
{label:} block [(expresso booleana)]
{declaraes}
begin
stentenas_concorrentes
end block [label];
Declaraes declaram objetos locais ao bloco e podem ser qualquer uma das seguintes;
USE --clausula
Subprograma -- declarao e corpo
Tipo, constantes, sinais -- declaraes
Componente declarao
A ordem das sentenas concorrentes num bloco no importante pois todas as sentenas esto sempre
executando. Os blocos podem ser aninhados no cdigo fonte para organizar e criar a hierarquia. Objetos
declarados dentro de um BLOCK so visveis dentro daquele bloco e todos os seus sub-blocos
(aninhados a ele). Se um bloco filho (dentro de um bloco pai) declara um objeto com o mesmo nome
do bloco pai, tal declarao redefine a declarao do bloco pai (overwrite).
B1 : block
Signal S: BIT; -- Declarao de S no bloco B1
Begin
S <= A and B; -- S de B1
B2 : block
Signal S: BIT; -- Declarao de S, bloco B2
Begin
S <= C and D; -- S de B2
B3: block
Begin
Z <= S; -- S de B2
End block;
End block;
Y <= S;
End block;
45 VHDL ESTRUTURAL
17
18