0% acharam este documento útil (0 voto)
5 visualizações32 páginas

VHDL4

Enviado por

Carlos Pereira
Direitos autorais
© © All Rights Reserved
Levamos muito a sério os direitos de conteúdo. Se você suspeita que este conteúdo é seu, reivindique-o aqui.
Formatos disponíveis
Baixe no formato PDF, TXT ou leia on-line no Scribd
0% acharam este documento útil (0 voto)
5 visualizações32 páginas

VHDL4

Enviado por

Carlos Pereira
Direitos autorais
© © All Rights Reserved
Levamos muito a sério os direitos de conteúdo. Se você suspeita que este conteúdo é seu, reivindique-o aqui.
Formatos disponíveis
Baixe no formato PDF, TXT ou leia on-line no Scribd
Você está na página 1/ 32

VHDL

□ Não é possível ler o valor de uma saída em


VHDL
■ Exemplo: considerando A como uma saída (out)
□ if A = “10” then …
□ B <= A;
□ case A is …
□ Erro: Can not read output A
□ Solução
■ Criar sinal e conecta-lo na saída que se deseja ler
■ Ao invés de tratar diretamente a saída, usar o sinal
■ Exemplo: considerando A como uma saída (out)
□ signal A_s: std_logic_vector(2 downto 0);
□ A <= A_s;
□ if A_s = “10” then …
□ B <= A_s;
□ case A_s is …

Março/2010 1
entity SharedULA is
port (
A, B, C, D, E : in std_logic_vector(7 downto 0);
Operation : in std_logic_vector(1 downto 0);

ULAOp1 : in std_logic;
ULAOp2 : in std_logic_vector(1 downto 0);
Result : out std_logic_vector(7 downto 0);
n, z, v, c : out std_logic;
Op1_maior, Op2_maior, iguais : out std_logic Desenhar o esquemático RTL
);
end SharedULA ;

architecture arch1 of SharedULA is


signal op1, op2: std_logic_vector(7 downto 0);
begin
ULA: entity work.ULA_nbits(arch1)
Comp: entity work.Comparador(arch1)
port map(
port map(
A => Op1,
A => op1,
B => Op2,
B => op2,
Operation => Operation,
A_maior => Op1_maior,
Result => Result,
B_maior => Op2_maior,
v => v,
iguais => iguais
z => z,
);
n => n,
c => c,
end arch1;
);

op1 <= A when ULAOp1 = '0' else B;

op2 <= B when ULAOp2 = "00" else


C when ULAOp2 = "01" else
D when ULAOp2 = "10" else
E;

Março/2010 2
VHDL
□ Comparilhamento de recursos
■ Na síntese da descrição VHDL comportamental,
tipicamente todos operadores relacionais e aritméticos
que aparecem no código são mapeados para o
hardware correspondente

■ Diferente de um código escrito em uma linguagem de


descrição de software (e.g. C, Python, Java), onde
todos operadores relacionais e aritméticos que
aparecem no código são executados pela ULA, pois as
operações são executadas uma após a outra

Março/2010 3
VHDL
□ Comparilhamento de recursos
■ Na síntese da descrição VHDL comportamental,
tipicamente todos operadores relacionais e aritméticos
que aparecem no código são mapeados para o
hardware correspondente
■ Exemplo

a
8 ctrl r
8
b 8 00 a+b
c
8 Circuito 1 r
8 01 a+c
d
10
d+1
2 11
ctrl

Março/2010 4
VHDL
□ Comparilhamento de recursos
■ Na síntese da descrição VHDL comportamental,
tipicamente todos operadores relacionais e aritméticos
que aparecem no código são mapeados para o
hardware correspondente
■ Exemplo

architecture waste of Circuto1 is


ctrl r
begin
00 a+b
r <= a + b when ctrl = "00" else
a + c when ctrl = "01" else
01 a+c
d + 1;
10
end waste; d+1
11

Março/2010 5
VHDL
□ Comparilhamento de recursos
■ Na síntese da descrição VHDL comportamental,
tipicamente todos operadores relacionais e aritméticos
que aparecem no código são mapeados para o
hardware correspondente
■ Exemplo

architecture waste of Circuto1 is


begin

r <= a + b when ctrl = "00" else


a + c when ctrl = "01" else
d + 1;

end waste;

Março/2010 6
VHDL
□ Comparilhamento de recursos
■ Na síntese da descrição VHDL comportamental,
tipicamente todos operadores relacionais e aritméticos
que aparecem no código são mapeados para o
hardware correspondente architecture waste of Circuto1 is
■ Exemplo begin

r <= a + b when ctrl = "00" else


a + c when ctrl = "01" else
d + 1;
end waste;

ctrl = “01” ctrl = “00” 7


Março/2010
VHDL
□ Comparilhamento de recursos
■ Na síntese da descrição VHDL comportamental,
tipicamente todos operadores relacionais e aritméticos
que aparecem no código são mapeados para o
hardware correspondente
■ Exemplo Comando with select

architecture waste2 of Circuto1 is


begin

with ctrl select


r <= a + b when "00“,
a + c when "01“,
d + 1 when others;

end waste2;

Março/2010 8
VHDL
□ Comparilhamento de recursos
■ Pode-se reduzir a área do circuito gerado, identificando
recursos que podem ser compartilhados
■ Ao compartilhar recursos, é comum aumentar o atraso visto
que multiplexadores são inseridos nas entradas dos recursos
a serem compartilhados
■ Exemplo

a ctrl r
b 00 a+b
c Circuito 1 r
01 a+c
d
10
d+1
2 11
ctrl
Saída r só pode apresentar um resultado de soma por
vez (operações mutuamente exclusivas), portanto um
único somador pode ser compartilhado

Março/2010 9
VHDL
□ Comparilhamento de recursos
■ Pode-se reduzir a área do circuito gerado, identificando
recursos que podem ser compartilhados
■ Ao compartilhar recursos, é comum aumentar o atraso visto
que multiplexadores são inseridos nas entradas dos recursos
a serem compartilhados
■ Exemplo

ctrl r
00 a+b
01 a+c
10
d+1
11

Saída r só pode apresentar um resultado de soma por


vez (operações mutuamente exclusivas), portanto um
único somador pode ser compartilhado

Março/2010 10
VHDL
□ Comparilhamento de recursos
■ Pode-se reduzir a área do circuito gerado, identificando
recursos que podem ser compartilhados
■ Ao compartilhar recursos, é comum aumentar o atraso visto
que multiplexadores são inseridos nas entradas dos recursos
a serem compartilhados
■ Exemplo

architecture one_adder of Circuto1 is


signal adderOp1, adderOp2: std_logic_vector(7 downto 0);
adderOp1 begin

adderOp1 <= a when ctrl = "00" or ctrl = "01" else


d;

adderOp2 <= b when ctrl = "00" else


c when ctrl = "01" else
adderOp2 x"01";

r <= adderOp1 + adderOp2;

end one_adder;

Março/2010 11
VHDL
□ Comparilhamento de recursos
■ Pode-se reduzir a área do circuito gerado, identificando
recursos que podem ser compartilhados
■ Ao compartilhar recursos, é comum aumentar o atraso visto
que multiplexadores são inseridos nas entradas dos recursos
a serem compartilhados
■ Exemplo

architecture one_adder of Circuto1

Março/2010 12
VHDL
□ Comparilhamento de recursos
■ RTL Hardware Design Using VHDL – Pong Chu
□ Capítulo 7 - COMBINATIONAL CIRCUIT DESIGN: PRACTICE
■ Ferramentas de síntese típicamente tem a opção
resource sharing

Março/2010 13
VHDL
□ Comparilhamento de recursos
■ Reescrever de maneira a utilizar
um único somador

architecture behavioral1 of ULA is


signal temp: std_logic_vector(15 downto 0);
signal sum: std_logic_vector(16 downto 0);
begin
Result <= temp;

temp <= A and B when Operation = "000" else


A or B when Operation = "001" else
A xor B when Operation = "010" else
A when Operation = "011" else
not A when Operation = "100" else
(not A) + 1 when Operation = "101" else
A - B when Operation = "110" else
sum(15 downto 0); -- Add is the default operation

sum <= ('0' & A) + ('0' & B);


N <= temp(15);
Z <= '1' when temp = 0 else '0';
V <= '1' when A(15) = B(15) and A(15) /= temp(15) else '0';
C <= sum(16) when Operation = "111" else '0';
end behavioral1;

Março/2010 14
VHDL
□ Comparilhamento de recursos
■ A <= B + C + D, supondo A, B e C com 8 bits, por
exemplo
□ Se D tiver mais de 1 bit de largura, resultará em dois somadores
□ Se D tiver largura de 1 bit, resultará em um único somador

D
B
C B
A
A C
D

D com mais de 1 bit de largura D com 1 bit de largura

Março/2010 15
VHDL
□ Process
■ Construção da linguagem que torna a descrição
comportamental ainda mais parecia com um
algoritmo
■ Permite a utilização de comandos condicionais como
if/else e case além de laços de repetição como for e
while
□ Comandos permitidos apenas dentro de process
□ Atribuição condicional utilizando when é permitida apenas
fora de process (região de código concorrente)
■ Utilizada principalmente para descrever circuitos
sequenciais
■ Pode ser usada também para descrever circuitos
combinacionais

Março/2010 16
VHDL
□ Process
■ Trecho de código ativado pela mudança de valor em
algum sinal/entrada do circuito
■ Sinais/entradas que ativam o process são especificados
em uma lista de sensitividade
■ Sintaxe

Label é opcional
Lista de sensitividade

[label:] process (sinais/entradas)


begin
<código>
end process [label];

Março/2010 17
VHDL
□ Process (fundamental)
■ A lista de sensitividade deve conter todos os
sinais/entradas utilizados pelo process para gerar um
resultado (sinais/entradas à direitas das atribuições)
■ Exemplo Process gera as saídas S e Co, as quais
dependem das entradas A, B e Ci. Portanto, estas
architecture arch3 of FullAdder is entradas devem estar na lista de sensitividade
begin

-- Process sensível às entradas A, B e Ci


process(A, B, Ci)
begin Síntese lógica
-- Generate sum (S)
S <= (A xor B) xor Ci;

-- Generate carry out (Co)


Co <= (A and B) or ((A xor B) and Ci)

end process; Comportamento da simulação: ao final da execução, o process fica


suspenso até a ocorrência de uma nova alteração em algum sinal da
end arch3;
lista de sensitividade. O hardware, obviamente não fica “suspenso”
Março/2010 18
VHDL
□ Process
architecture arch3 of FullAdder is Ci ausente na lista de
begin sensitividade
-- Process sensível às entradas A e B
process(A, B)
begin

-- Generate sum (S)


S <= (A xor B) xor Ci;
Ci muda de valor, mas não dispara o
-- Generate carry out (Co) process. Consequentemente, as
Co <= (A and B) or ((A xor B) and Ci) saídas não são atualizas.

end process;

end arch3;

O que está
errado ?

Março/2010 19
VHDL
□ Process
■ Atribuições dentro de um process não são contínuas,
como no caso das atribuições fora de um process
(região de código concorrente)
■ Ocorrem apenas uma vez, sempre que o process for
ativado (comportamento na simulação)
architecture arch3 of FullAdder is
begin

-- Process sensível às entradas A, B e Ci


process(A, B, Ci)
begin

Atribuições ocorrem ao -- Generate sum (S)


S <= (A xor B) xor Ci;
quando há alteração de valor
em A, B ou Ci -- Generate carry out (Co)
Co <= (A and B) or ((A xor B) and Ci)

end process;

end arch3;

Março/2010 20
VHDL
□ Process
■ Uma architecture pode conter vários process, os
quais podem ser ativados simultaneamente

architecture arch4 of FullAdder is


begin

-- Gera a soma (S) Ativados sempre


Sum: process (A, B, Ci)
begin simultaneamente,
visto que a lista
S <= (A xor B) xor Ci; de sensitividade é
end process; igual

-- Gera carry out (Co)


CarryOut: process (A, B, Ci)
begin

Co <= (A and B) or ((A xor B) and Ci);

end process;
end arch4;

Março/2010 21
VHDL
□ Process (fundamental)
■ Sinais/saídas podem ser atribuídos várias vezes
dentro do mesmo process
■ Sinais/saídas não mudam de valor até o final do
process (atualizados somente ao final do process)
■ Somente a última atribuição será considerada
architecture teste of teste is
signal temp: std_logic : = ‘0’;
begin

-- Process sensível à entrada a


process(a)
begin

temp <= ‘1’; temp nunca


temp <= ‘0’; chega a ser 1
temp <= ‘1’;
temp <= ‘0’; -- temp = ‘0’ após o final do process
O que se vê na waveform
end process;
são os valores atualizados
end teste; Equivalente a temp <= ‘0’; após o final do process

Março/2010 22
VHDL
Alerta na simulção
□ Process (fundamental)
■ Um valor indefinido (‘X’) pode ser gerado em
decorrência de múltiplas atribuições para um mesmo
sinal/saída: (i) fora de process; (ii) dentro e fora de
process; (iii) em process diferentes
Curto
■ Exemplo: (i) fora de process circuito
architecture teste of FullAdder is
0
begin

S <= A and B; Atribuições concorrentes 1


S <= B or Ci; (especificam conexões)
end teste;

O tipo bit da library std não fornece esse alerta


porque só suporta os valores ‘0’ e ‘1’. Por isso o
tipo std_logic é amplamente utilizado, pois suporta
outros valores muito úteis durante a simulação

Erro de síntese: multiple driver (X)

Março/2010 23
VHDL
Alerta na simulção
□ Process (fundamental)
■ Um valor indefinido (‘X’) pode ser gerado em
decorrência de múltiplas atribuições para um mesmo
sinal/saída: (i) fora de process; (ii) dentro e fora de
process; (iii) em process diferentes
Curto
■ Exemplo: (ii) dentro e fora de process circuito
architecture teste of FullAdder is
0
begin

S <= A and B;
1
process(B, Ci)
begin

S <= B or Ci;

end process;
end teste;

Erro de síntese: multiple driver (X)

Março/2010 24
VHDL
Alerta na simulção
□ Process (fundamental)
■ Um valor indefinido (‘X’) pode ser gerado em
decorrência de múltiplas atribuições para um mesmo
sinal/saída: (i) fora de process; (ii) dentro e fora de
process; (iii) em process diferentes
Curto
■ Exemplo: (iii) process diferentes circuito
architecture teste of FullAdder is
0
begin

process(A, B)
1
begin
S <= A and B;
end process;

process(B, Ci)
begin
S <= B or Ci;
end process;

end teste;

Erro de síntese: multiple driver (X)

Março/2010 25
VHDL
□ Process (fundamental)
■ Sinais/saídas podem ser atribuidos várias vezes
dentro do mesmo process
□ A última atribuição será considerada
■ Sinal/saída não muda de valor até o final do process

architecture teste of FullAdder is


begin

process(A, B, Ci)
begin

S <= B or Ci; -- Ignorada


S <= A and B;

end process;
end teste;

Março/2010 26
VHDL
□ Process
■ Condição: if, elsif e else
<expressão> é tipicamente uma
if <expressão> then comparação. Pode envolver operadores
<código> lógicos como and, or, e not.

elsif <expressão> then


<código>

elsif <expressão> then


<código>

if <expressão> then if aninhado


<código>
end if;

...

else
<código>

end if; Finaliza o if

Março/2010 27
VHDL
□ Process
■ Condição: if, elsif e else

architecture arch3 of Mux8x8 is


begin
process (i0,i1,i2,i3,i4,i5,i6,i7,sel)
begin 0
if sel = "000" then 1
s <= i0; 2 8 s
elsif sel = "001" then 3
4
s <= i1;
5
elsif sel = "010" then 6
s <= i2; 7
elsif sel = "011" then 3
s <= i3;
elsif sel = "100" then
sel
s <= i4;
elsif sel = "101" then
s <= i5;
elsif sel = "110" then
s <= i6; Sempre que um sinal/entrada da lista de sensitividade
else é alterado, o process é disparado e a saída s é
s <= i7; atualizada (comportamento da simulação)
end if;
end arch3;

Março/2010 28
VHDL
□ Process
■ Seleção: case

Sinal ou entrada que deve ser comparado


case <sinal/entrada> is
com um valor listado abaixo
when valor_1 =>
<código>

when valor_2 => Lista dos possíveis valores de


<código>
<sinal/entrada>
when valor_3 | valor_4 =>
<código> Diferentes valores podem ser agrupados
utilizando | (ou)
...

when valor_n =>


<código>
Valores não listados, “caem” na opção
when others =>
<código>
others (idêntico à cláusula default em C)

end case;

Março/2010 29
VHDL
□ Seleção: case
architecture arch2 of Mux8x8 is
begin
Todas entradas presentes na
process (i0,i1,i2,i3,i4,i5,i6,i7,sel)
begin lista de sensitividade
case sel is
when "000" =>
s <= i0; 0
1
when "001" => 2 8 s
s <= i1; 3
when "010" => 4
s <= i2; 5
when "011" => 6
7
s <= i3; 3
when "100" =>
s <= i4; sel
when "101" =>
s <= i5;
when "110" =>
s <= i6;
Modelsim error: Case statement covers only
when “111” =>
s <= i7; 8 out of 729 cases
end case; sel tem 729 (93) possíveis combinações de
end process; valores devido aos 9 diferentes valores do
end arch2;
tipo std_logic (0, 1, Z, U, X , L, H, W, -)

Março/2010 30
VHDL
□ Seleção: case
architecture arch2 of Mux8x8 is
begin
Todas entradas presentes na
process (i0,i1,i2,i3,i4,i5,i6,i7,sel)
begin lista de sensitividade
case sel is
when "000" =>
s <= i0; 0
1
when "001" => 2 8 s
s <= i1; 3
when "010" => 4
s <= i2; 5
when "011" => 6
7
s <= i3; 3
when "100" =>
s <= i4; sel
when "101" =>
s <= i5;
when "110" =>
s <= i6; Todos os valores não listados “caem” em
when others =>
s <= i7;
others
end case;
end process;
end arch2;

Março/2010 31
VHDL
□ Criar duas novas architectures para a ULA de
16 bits, Circuito 1, Circuito 2 e diferença entre
dois números unsigned utilizando a estrutura
process
■ Uma utilizando if/else
■ Outra utilizando case Testar as descrições
no simulador

Março/2010 32

Você também pode gostar