1
VHDL
Introdução
Paulo C. Centoducatte
[email protected]
fevereiro de 2005
VHDL - Introdução
http://www.lsc.ic.unicamp.br
VHDL - Comandos seqüenciais
•
•
•
•
•
•
•
•
•
Chamada de procedimentos (também concorrente)
Assertion (também concorrente)
Assinalamento de sinal (também concorrente)
Assinalamento de variáveis
WAIT
IF, CASE
NEXT
EXIT, RETURN, LOOP
NULL
VHDL - Introdução
http://www.lsc.ic.unicamp.br
2
VHDL - Atribuição Condicional
• Cláusula IF
• Cláusula WHEN
• Cláusula CASE
VHDL - Introdução
http://www.lsc.ic.unicamp.br
3
VHDL - Cláusula IF
IF (condição 1) THEN
Cláusula acertiva 1;
ELSEIF (condição 2) THEN
Cláusula acertiva 2;
ELSE
Cláusula acertiva 3;
END IF;
VHDL - Introdução
http://www.lsc.ic.unicamp.br
4
VHDL - Cláusula IF
Process (acao, cor)
IF cor = verde THEN
acao <= va_em_frente;
ELSEIF cor = amarelo THEN
acao <= atencao;
ELSE
acao <= pare;
END IF;
VHDL - Introdução
http://www.lsc.ic.unicamp.br
5
VHDL - Cláusula IF
latchD: process (dado,enable)
begin
IF enable = ‘1’ THEN
Q <= dado;
notQ <= not dado
END IF;
end process latchD;
VHDL - Introdução
http://www.lsc.ic.unicamp.br
6
VHDL - Cláusula IF
Architecture rtl of sps is
signal prec : std_ulogic;
signal Xsp : std_logic_vector(7 downto 0) := “00000000”;
begin
-- Conversor paralelo/serie
process(clk)
begin
if (clk´event and clk´last_value = ‘0’ and clk = ‘1’) then
if en_sr = ‘0’ then
-- shift right
ultimo_bit <= Xsp(7);
Xsp(7 downto 1) <= Xsp(6 downto 0);
Xsp(0) <= IO;
-- carga paralela
elseif em_load = ‘1’ then
Xsp <= bus_data;
end if; end if;
end process;
end rtl;
VHDL - Introdução
http://www.lsc.ic.unicamp.br
7
VHDL - Escrever o processo de um contador de 4 bits
Architecture rtl of contador is
signal cont : unsigned(3 downto 0) := “0000”;
begin
process(reset,clk)
begin
if reset = ‘1’ then
cont <= “0000”;
elseif (clk´event and clk = ‘1’) then
if enable = ‘1’ then
if incr = ‘1’ then cont <= cont + “0001”;
else cont <= cont - “0001”;
end if;
end if;
end if; end process; end rtl;
VHDL - Introdução
http://www.lsc.ic.unicamp.br
8
VHDL - Cláusula When (concorrente)
Atribuição WHEN condição
sinal <= atribuição WHEN valor_expressão
Exemplo:
acao <= prosseguir WHEN sinal_verde;
VHDL - Introdução
http://www.lsc.ic.unicamp.br
9
VHDL - Seletor
out <= in1 WHEN sel
else in0;
if sel = ‘1’ then
out <= in1;
else
out <= in0;
out <= in0 WHEN sel0 else
in1 WHEN sel1 else
in2 WHEN sel2 else
in3 WHEN sel3 else
inx;
VHDL - Introdução
http://www.lsc.ic.unicamp.br
10
VHDL- Cláusula With (concorrente)
• WITH expressão SELECT
signal <= atribuição WHEN valor_expressão
Exemplo:
WITH cor SELECT
acao <= prosseguir WHEN “verde”,
parar
WHEN “vermelho”,
alerta
WHEN OTHERS;
VHDL - Introdução
http://www.lsc.ic.unicamp.br
11
VHDL- Cláusula With
with regsel select
z <= A after Tprop when “00’,
B after Tprop when “01”,
C after Tprop when “10”,
D after Tprop when “11”,
“X” after Tprop when others;
VHDL - Introdução
http://www.lsc.ic.unicamp.br
12
VHDL- Cláusula With
signal Y : std_logic_vector(0 to3);
signal opcode : std_logic_vector(0 to 1);
with opcode select
Y <= “0001” when “00”,
“0010” when “01”,
“0100” when “10”,
“1000” when “11”;
VHDL - Introdução
http://www.lsc.ic.unicamp.br
13
VHDL- Exercícios
• Escrever o modelo vhdl de um multiplexador 2x1
com 8 bits de dados
– usando WHEN
– usando IF
– usando somente comando de atribuição simples
Signal temp : std_logic_vector(7 downto 0);
Begin
temp <= (s,s,s, others => s); -- s é o sinal de seleção
y <= (temp and IN1) or (not temp and IN0);
VHDL - Introdução
http://www.lsc.ic.unicamp.br
14
VHDL- Cláusula Case
CASE sinal IS
WHEN “condição 1” => dado <= dado1;
WHEN “condição 2” => dado <= dado2;
WHEN others => dado <= dado3;
END CASE;
VHDL - Introdução
http://www.lsc.ic.unicamp.br
15
VHDL- Cláusula Case
signal p : integer range 0 to 3;
signal y : std_logic_vector(0 to 1);
CASE p IS
WHEN 0 => y <= “10”;
WHEN 1 => y <= A;
WHEN 2 => y <= B
WHEN 3 => y <= “01”;
END CASE;
VHDL - Introdução
http://www.lsc.ic.unicamp.br
16
VHDL - Comando NULL
• Utilizado no caso de não ser necessário nenhuma
ação em uma alternativa que precisa ser coberta
• Exemplo:
case opcode is
when add => Acc := Acc + operando;
when sub => Acc := Acc - operando;
when nop => NULL;
end case;
VHDL - Introdução
http://www.lsc.ic.unicamp.br
17
VHDL - Exercício
• Utilizado o comando case escreva um conversor do
código binário para o código Gray
VHDL - Introdução
http://www.lsc.ic.unicamp.br
18
VHDL - Loop
loop
comando_1
comando_2;
end loop;
Exemplo:
begin
count <= count_value;
loop
wait until clk = '1';
count_value := (count_value + 1) mod 16;
count <= count_value;
end loop;
VHDL - Introdução
http://www.lsc.ic.unicamp.br
19
VHDL - Next e Exit
loop
comando_1
next when condição;
comando_2;
end loop;
begin
count <= count_value;
loop
loop
wait until clk = '1' or reset = '1';
exit when reset = '1';
count_value := (count_value + 1) mod 16;
count <= count_value;
end loop;
count_value := 0; -- at this point, reset = '1’
count <= count_value;
wait until reset = '0';
end loop;
VHDL - Introdução
http://www.lsc.ic.unicamp.br
20
VHDL - While loops
entity cos is
port ( theta : in real; result : out real );
end entity cos;
…..
sum := 1.0;
term := 1.0;
n := 0;
while abs(term) > abs (sum / 1.0E6) loop
n := n + 2;
term := (-term) * theta**2 / real(((n-1) * n));
sum := sum + term;
end loop;
result <= sum;
…
VHDL - Introdução
http://www.lsc.ic.unicamp.br
21
VHDL – For Loops
entity cos is
port ( theta : in real; result : out real );
end entity cos;
…..
sum := 1.0;
term := 1.0;
for n in 1 to 9 loop
term := (-term) * theta**2 / real(((2*n-1) * 2*n));
sum := sum + term;
end loop;
result <= sum;
VHDL - Introdução
http://www.lsc.ic.unicamp.br
22
VHDL – For Loops
variable a, b : integer;
begin
a := 10;
for a in 0 to 7 loop
b := a;
end loop;
-- a = 10, and b = 7
wait;
VHDL - Introdução
http://www.lsc.ic.unicamp.br
23
VHDL - Assertion
[Label:] assert exp_booleana
[report expressão [severity expressão];
Type severity_level is (note, warning, error, failure)
assert valor <= max_valor;
-“Assertion violation”
assert valor <= max_valor
-Severity = erro
report “valor maior que o permitido";
assert valor <= max_valor
report “valor maior que o permitido“
severity note;
VHDL - Introdução
http://www.lsc.ic.unicamp.br
24
VHDL - Assertion
entity SR_flipflop is
port ( S, R : in bit; Q : out bit );
end entity SR_flipflop;
architecture checking of SR_flipflop is
begin
set_reset : process (S, R) is
begin
assert S = '1' nand R = '1';
if S = '1' then
Q <= '1';
end if;
if R = '1' then
Q <= '0';
end if;
end process set_reset;
end architecture checking;
VHDL - Introdução
http://www.lsc.ic.unicamp.br
25
VHDL – Atributos de tipos escalar
• Atributos comuns a todos os tipos escalares:
T’left
primeiro (mais a esquerda) valor em T
T’right último (mais a direita) valor em T
T’low
menor valor em T
T’high maior valor em T
T’ascending TRUE se T o range de T é crescente
T’image(x) string representando o valor de x
T’value(s) o valor em T que é representado por s
VHDL - Introdução
http://www.lsc.ic.unicamp.br
26
VHDL - Atributos de tipos escalar
27
type resistance is range 0 to 1E9
units
ohm;
kohm = 1000 ohm;
Mohm = 1000 kohm;
end units resistance;
type set_index_range is range 21 downto 11;
type logic_level is (unknown, low, undriven, high);
set_index_range'left = 21;
set_index_range'right = 11;
set_index_range'low = 11;
set_index_range'high = 21;
set_index_range'ascending = false;
set_index_range'image(14) = "14";
set_index_range'value("20") = 20;
resistance'left = 0 ohm;
resistance'right = 1E9 ohm;
resistance'low = 0 ohm;
resistance'high = 1E9 ohm;
resistance'ascending = true;
resistance'image(2 kohm) = "2000 ohm";
resistance'value("5 Mohm") = 5_000_000 ohm;
VHDL - Introdução
http://www.lsc.ic.unicamp.br
VHDL - Atributos de tipos escalar
• Atributos relativos aos tipos escalares discreto e
físico:
T’pos(x)
número da posição de x em T
T’val(n)
valor em T na posição n
T’succ(x)
valor em T na posição maior que x
T’pred(x)
valor em T na posição menor que x
T’leftof(x)
valor em T na posição a esquerda de x
T’rightof(x) valor em T na posição a direita de x
VHDL - Introdução
http://www.lsc.ic.unicamp.br
28
VHDL - Atributos de tipos escalar
29
type resistance is range 0 to 1E9
units
ohm;
kohm = 1000 ohm;
Mohm = 1000 kohm;
end units resistance;
type set_index_range is range 21 downto 11;
type logic_level is (unknown, low, undriven, high);
logic_level'left = unknown;
logic_level'right = high;
logic_level'low = unknown;
logic_level'high = high;
logic_level'ascending = true;
logic_level'image(undriven) = "undriven";
logic_level'value("Low") = low;
logic_level'pos(unknown) = 0;
logic_level'val(3) = high;
logic_level'succ(unknown) = low;
logic_level'pred(undriven) = low;
VHDL - Introdução
http://www.lsc.ic.unicamp.br
VHDL - Atributos de tipos array
• Atributos
–
–
–
–
–
–
–
–
A’left(N)
A’right(N)
A’low(N)
A’high(N)
A’range(N)
A’reverse_range(N)
A’length(N)
A’ascending(N)
• Exemplo
type A is array ( 1 to 4 , 31 downto 0) of
boolean;
– A’left(1) = 1
– A’right(2) = 0
– A’low(1) = 1
– A’high(2) = 31
– A’range(1) is 1 to 4
– A’reverse_range(2) is 0 to 31
– A’length(2) = 32
– A’ascending(1) = true
– A’ascending(2) = false
VHDL - Introdução
http://www.lsc.ic.unicamp.br
30
VHDL – Atributos de Sinais
S´delayed(T)
S´stable(T)
S´quit(T)
S´transaction
S´event
S´active
S´last_event
S´last_active
S´last_value
- mesmo valor que S porém atrasado de T
- booleano: true se não houve evento em S
- booleano: true se não houve transação em S
- bit: alterna entre ´0´ e ´1´ a cada transação em S
- booleano: true se houve um evento em S
- booleano: true se houve uma transação em S
- intervalo de tempo desde o último evento em S
- intervalo de tempo desde a última transação em S
- valor de S antes do último evento
VHDL - Introdução
http://www.lsc.ic.unicamp.br
31
VHDL – Uso de Atributos
• Detecção de borda de relógio
clk’EVENT and clk = ‘1’
• Determinação de largura de pulso
Sinal’LAST_EVENT >= 5 ns
• Teste de Hold e Setup
clk’LAST_VALUE = ‘0’ AND clk = ‘1’ AND
dado’STABLE(min_setup_time)
VHDL - Introdução
http://www.lsc.ic.unicamp.br
32
VHDL - Componente
• Declaração
• Instanciação
• Instanciação condicional
• Modelamento Estrutural
VHDL - Introdução
http://www.lsc.ic.unicamp.br
33
VHDL - Componente
• Declaração de um componente
component identifier [is]
[generic (generic_interface_list);]
[port (port_interface_list);]
end component [identifier];
OBS.: Similar a ENTIDADE
VHDL - Introdução
http://www.lsc.ic.unicamp.br
34
VHDL - Componente
• Exemplo
component flip-flop is
generic (Tprop, Tsetup, Thold : delay);
port (clk: in bit; clr : in bit; d : in bit; q : out bit);
end component flip_flop;
VHDL - Introdução
http://www.lsc.ic.unicamp.br
35
VHDL - Componente
• Instanciação
– Declaração de componente define o tipo do
módulo
– Instaciação de componenente define seu uso em
um projeto
instatiation_label:
[component ] componente_name
[generic map (generic_association_list) ]
[port map (port_association_list) ];
VHDL - Introdução
http://www.lsc.ic.unicamp.br
36
VHDL – Componente (exemplo)
• Exemplo:
entity reg4 is
port ( clk, clr : in bit; d : in bit_vector(0 to 3);
q : out bit_vector(0 to 3) );
end entity reg4;
--------------------------------------------------------------------------architecture struct of reg4 is
component flipflop is
generic ( Tprop, Tsetup, Thold : delay_length );
port ( clk : in bit; clr : in bit; d : in bit;
q : out bit );
end component flipflop;
VHDL - Introdução
http://www.lsc.ic.unicamp.br
37
VHDL – Componente (exemplo)
begin
bit0 : component flipflop
generic map ( Tprop => 2 ns, Tsetup => 2 ns, Thold => 1 ns )
port map ( clk => clk, clr => clr, d => d(0), q => q(0) );
bit1 : component flipflop
generic map ( Tprop => 2 ns, Tsetup => 2 ns, Thold => 1 ns )
port map ( clk => clk, clr => clr, d => d(1), q => q(1) );
bit2 : component flipflop
generic map ( Tprop => 2 ns, Tsetup => 2 ns, Thold => 1 ns )
port map ( clk => clk, clr => clr, d => d(2), q => q(2) );
bit3 : component flipflop
generic map ( Tprop => 2 ns, Tsetup => 2 ns, Thold => 1 ns )
port map ( clk => clk, clr => clr, d => d(3), q => q(3) );
end architecture struct;
VHDL - Introdução
http://www.lsc.ic.unicamp.br
38
VHDL - Configuração
configuration identifier of entity_name is
for architeture_name
{ for component_specification
binding_indication;
end for;}
end for;
end [ configuration] [ identifier];
VHDL - Introdução
http://www.lsc.ic.unicamp.br
39
VHDL - Componente
• Configuração
FOR nome_da_instancia|others|all: nome_componente -- component_specification
USE ENTITY especificação_da_entidade; -- binding_indication
END FOR;
FOR inst51: xor_gate
USE ENTITY lib_projeto.xor(arq_rtl);
END FOR;
FOR bit0,bit1: flipflop
use entity work.edge_triggered_Dff(basic);
end for;
FOR others: flipflop
use entity work.edge_triggered_Dff(rtl);
end for;
VHDL - Introdução
http://www.lsc.ic.unicamp.br
40
VHDL – Exemplo
Begin
inst_latchD: latchD
port map(d1,clk, Q,NOTQ);
Architecture rtl of top is
Component and2
port(a, b: in std_logic;
c: out std_logic);
End component;
Component latchD
port(d, clk : in std_ulogic;
q, notq : out std_logic);
End component;
inst_and2_a: and2
port map(d1,Q,S1);
inst_and2_b: and2
port map(d2,NOTQ,S3);
End rtl;
For all : and2 use entity work.and2(rtl);
For all : latchD use entity work.latchD(rtl);
signal Q, NOTQ : std_ulogic := ‘1’;
OBS.: d1, d2 e clk são sinais de
entrada e S1, S2 e S3 são
sinais de saída
VHDL - Introdução
http://www.lsc.ic.unicamp.br
41
Download

vhdl-2