1 Linguagens de Descrição de Hardware VHDL Foco: Síntese Lógica Integração Hardware-Software...

Post on 07-Apr-2016

216 views 0 download

Transcript of 1 Linguagens de Descrição de Hardware VHDL Foco: Síntese Lógica Integração Hardware-Software...

1

Linguagens de Descrição de HardwareVHDLFoco: Síntese Lógica

Integração Hardware-Software

João M. P. CardosoEmail: jmcardo@ualg.ptURL: http://w3.ualg.pt/~jmcardo

2005

2

Modelação de Sistemas Digitais Razões para modelar

Especificação dos requisitos documentação Teste utilizando simulação Verificação formal síntese

Objectivo Processo de desenho mais fiável, com custo

e tempo mínimos Fuga aos erros de desenho!

3

Modelação de Sistemas Digitais Linguagens de Programação de

HardwareVHDL (VHSIC Hardware Description

Language)• VHSIC: Very High Speed Integrated

CircuitVerilog

4

Domínios e Níveis de Modelação

high level of abstraction

FunctionalStructural

Geometric “Y-chart” due to Gajski & Kahn

low level of abstraction

5

Domains and Levels of Modeling

FunctionalStructural

Geometric “Y-chart” due to Gajski & Kahn

Algorithm(behavioral)

Register-TransferLanguage

Boolean Equation

Differential Equation

6

Domains and Levels of Modeling

FunctionalStructural

Geometric “Y-chart” due to Gajski & Kahn

Processor-MemorySwitch

Register-Transfer

Gate

Transistor

7

Domains and Levels of Modeling

FunctionalStructural

Geometric “Y-chart” due to Gajski & Kahn

Polygons

Sticks

Standard Cells

Floor Plan

8

Conceitos básicos de VHDL

Interfaces Comportamento (behavior) Estrutura Conjuntos de teste (Test Benchs) Análise, elaboração, simulação Síntese

9

Interfaces de Modelação

Declaração da EntityDescreve as entradas/saídas de cada módulo

entity reg4 isport ( d0, d1, d2, d3, en, clk : in bit;

q0, q1, q2, q3 : out bit );end reg4;

entity name port names port mode (direction)

port typereserved words

punctuation

10

Modelação do Behavior

Corpo da Architecture Descreve uma implementação da entity Podem ser várias por entity

Arquitectura Behavioral Descreve o algoritmo realizado pelo módulo contém

• process statements, cada contém• sequential statements, incluindo• signal assignment statements e• wait statements

11

Exemplo de Behaviorarchitecture behav of reg4 isbegin

storage : processvariable stored_d0, stored_d1, stored_d2, stored_d3 : bit;

beginif en = '1' and clk = '1' then

stored_d0 := d0; stored_d1 := d1; stored_d2 := d2; stored_d3 := d3;

end if;q0 <= stored_d0 after 5 ns;

q1 <= stored_d1 after 5 ns; q2 <= stored_d2 after 5 ns; q3 <= stored_d3 after 5 ns;

wait on d0, d1, d2, d3, en, clk;end process;

end behav;

12

Modelação de Estruturas

Structural architecture Implementa o módulo como uma

composição de sub-sistemas contém

• signal declarations, para interligações internas• Portos da entity são também tratados como sinais

• component instances• Instâncias de pares entity/architecture previamente

declarados• port maps em component instances

• Conecta sinais a portos dos componentes

13

Exemplo de Estrutura

int_clk

d0

d1

d2

d3

en

clk

q0

q1

q2

q3

bit0d_latchd

clk

q

bit1d_latchd

clk

q

bit2d_latchd

clk

q

bit3d_latchd

clk

q

gateand2

a

b

y

14

Exemplo de Estrutura Declarar primeiro entidades e arquitecturas

para o D-latch e and-gateentity d_latch is

port ( d, clk : in bit; q : out bit );end d_latch;

architecture basic of d_latch isbegin

latch_behavior : process (clk, d)begin

if clk = ‘1’ thenq <= d after 2 ns;

end if;end process;

end basic;

entity and2 isport ( a, b : in bit; y : out bit );

end and2;

architecture basic of and2 isbegin

and2_behavior : process (a, b)begin

y <= a and b after 2 ns;end process;

end basic;

15

Exemplo de Estrutura

Declarar os componentes correspondentes no corpo da arquitectura do registo

architecture struct of reg4 iscomponent d_latch

port ( d, clk : in bit; q : out bit );end component;component and2

port ( a, b : in bit; y : out bit );end component;signal int_clk : bit;

...

16

Exemplo de Estrutura

Utilizá-los para implementar o registo

...begin

bit0 : d_latchport map ( d0, int_clk, q0 );

bit1 : d_latchport map ( d1, int_clk, q1 );

bit2 : d_latchport map ( d2, int_clk, q2 );

bit3 : d_latchport map ( d3, int_clk, q3 );

gate : and2port map ( en, clk, int_clk );

end struct;

17

Exemplo de Estrutura

Configurar os modelos: necessário quando temos mais do que um modelo para cada entidade

configuration basic_level of reg4 isfor struct

for all : d_latchuse entity work.d_latch(basic);

end for;for all : and2

use entity work.and2(basic)end for;

end for;end basic_level;

18

Mistura de comportamento e estrutura Uma arquitectura pode ser descrita com

comportamentos e estruturas Instruções process e instâncias de

componentes Processos podem ler e atribuir sinais

Exemplo: modelo register-transfer-level (RTL) Data-path é descrito estruturalmente Unidade de controlo descrita

comportamentalmente

19

Exemplo com mistura

shift_reg

reg

shift_adder

control_section

multiplier multiplicand

product

20

Exemplo com misturaentity multiplier is

port ( clk, reset : in bit;multiplicand, multiplier : in integer;product : out integer );

end multiplier;

architecture mixed of mulitplier is-- falta declaração de componentessignal partial_product, full_product : integer;signal arith_control, result_en, mult_bit, mult_load : bit;

beginarith_unit : shift_adder

port map ( addend => multiplicand, augend => full_product,sum => partial_product, add_control => arith_control );

result : regport map ( d => partial_product, q => full_product,

en => result_en, reset => reset );...

21

Exemplo com mistura

…multiplier_sr : shift_reg

port map ( d => multiplier, q => mult_bit,load => mult_load, clk => clk );

product <= full_product;

control_section : process-- variable declarations for control_section-- …

begin-- sequential statements to assign values to control signals-- …wait on clk, reset;

end process;end mixed;

22

Bancada de teste

Testar um desenho por simulação Utilizar um modelo de test bench

Um corpo de arquitectura que inclui uma instância do desenho a testar

Aplicar sequências de valores de teste às entradas

Monitorizar valores em sinais de saída• Utilizando o simulador• Ou com um processo que verifica a correcta

operacionalidade

23

Exemplo de bancada de teste

architecture test_reg4 of test_bench is

-- falta declaração do componente a testar: reg4signal d0, d1, d2, d3, en, clk, q0, q1, q2, q3 : bit;

begindut : reg4

port map ( d0, d1, d2, d3, en, clk, q0, q1, q2, q3 );stimulus : process begin

d0 <= ’1’; d1 <= ’1’; d2 <= ’1’; d3 <= ’1’; wait for 20 ns; en <= ’0’; clk <= ’0’; wait for 20 ns;en <= ’1’; wait for 20 ns;clk <= ’1’; wait for 20 ns;d0 <= ’0’; d1 <= ’0’; d2 <= ’0’; d3 <= ’0’; wait for 20 ns;en <= ’0’; wait for 20 ns;…wait;

end process;end test_reg4;

entity test_bench isend test_bench;

24

Teste de regressão

Testar se um refinamento do desenho está correcto se um modelo estrutural de mais baixo nível

faz o mesmo que um modelo comportamental

A bancada de teste inclui duas instâncias do desenho em teste Comportamental e estrutural de baixo-nível Simula ambos com as mesmas entradas Verifica igualdade dos resultados

Necessita de ter em conta diferenças temporais

25

Exemplo de teste de regressão

architecture regression of test_bench is

-- falta declaração do componente a testarsignal d0, d1, d2, d3, en, clk : bit;signal q0a, q1a, q2a, q3a, q0b, q1b, q2b, q3b : bit;

begindut_a : entity reg4(struct)

port map ( d0, d1, d2, d3, en, clk, q0a, q1a, q2a, q3a );dut_b : entity reg4(behav)

port map ( d0, d1, d2, d3, en, clk, q0b, q1b, q2b, q3b );stimulus : process begin

d0 <= ’1’; d1 <= ’1’; d2 <= ’1’; d3 <= ’1’; wait for 20 ns; en <= ’0’; clk <= ’0’; wait for 20 ns;en <= ’1’; wait for 20 ns;clk <= ’1’; wait for 20 ns;…wait;

end process;...

26

Exemplo de teste de regressão

…verify : process begin

wait for 10 ns;assert q0a = q0b and q1a = q1b and q2a = q2b and q3a = q3b

report ”implementations have different outputs”severity error;

wait on d0, d1, d2, d3, en, clk;end process;

end regression;

27

Processamento do Desenho

Análise Elaboração Simulação Síntese

28

Análise

Verifica sintaxe e semântica sintaxe: gramática da linguagem semântica: o sentido do modelo

Analisa cada unidade de desenho em separado Declaração da entity Corpo da architecture … Preferível unidades de desenho em ficheiros

separados Unidades de desenho analisadas são colocadas numa

biblioteca Numa forma interna de implementação dependente A biblioteca corrente é designada por work

29

Elaboração

“Flattening” da hierarquia do desenho Cria portos Cria sinais e processos no corpo da

arquitectura Para cada instância de um componente,

copia a entity e a architecture instanciada Repete recursivamente

• Corpos de architecture unicamente comportamentais

Resultado final da elaboração Colecção planar de nets de sinais e

processos

30

Exemplo Elaborado

int_clk

d0

d1

d2

d3

en

clk

q0

q1

q2

q3

bit0d_latchd

clk

q

bit1d_latchd

clk

q

bit2d_latchd

clk

q

bit3d_latchd

clk

q

gateand2

a

b

y

reg4(struct)

31

Exemplo Elaborado

int_clk

d0

d1

d2

d3

en

clk

q0

q1

q2

q3

bit0

bit1

bit2

bit3

gate

reg4(struct)d_latch(basic)d

clk

q

d_latch(basic)d

clk

q

d_latch(basic)d

clk

q

d_latch(basic)d

clk

q

and2(basic)a

b

yprocess with variables

and statements

32

Simulação

Execução dos processos no modelo elaborado Simulação de eventos discretos

Tempo avança em passos discretos Quando os sinais mudam de valor - eventos

Um processo é sensível a eventos nos sinais de entrada Especificados em instruções wait ou na lista de

sensibilidades do processo Resume e escalona novos valores nos sinais de

saída• Escalona transacções• Evento num sinal se um novo valor é diferente do valor

antigo

33

Síntese

Traduz desenho RTL em netlist ao nível da porta lógica

Restrições no estilo de código para o modelo RTL

Dependente da ferramenta de síntese utilizada

34

Simulação versus Síntese

Todos os desenhos sintetizáveis podem ser simulados

Nem todos os desenhos simuláveis podem ser sintetizáveis

dout <= din after 10 ns;Sintetizável?

35

Metodologia de desenho básica

Requirements

SimulateRTL Model

Gate-levelModel

Synthesize

Simulate Test Bench

ASIC or FPGA Place & Route

TimingModel Simulate

36

VHDL

Detalhes sobre a linguagem

37

Bibliotecas e Pacotes

BibliotecasFornecem um conjunto de desenhos,

componentes, e funções Pacotes (packages)

Fornecem uma colecção de tipos de dados e sub-programas utilizados num desenho

library IEEE;use IEEE.STD_LOGIC_1164.ALL;

38

Ports

Nomes Letras, dígitos, e/ou underscores Começa sempre com uma letra Não é case-sensitive

Escolha de direcções de ports In: port de entrada Out: port de saída Inout: port bidireccional

Tipos de sinal do port (sugestões): STD_LOGIC STD_LOGIC_VECTOR(<max> DOWNTO/TO <min>)

39

Signals

Representam fios e elementos de armazenamento num desenho VHDL

Só podem ser declarados dentro de architecture

São associados com um certo tipo de dados

VHDL é uma linguagem fortemente tipificada Apenas é suportada conversão de tipos

explicita

40

Representações Signal

Em termos físicos os fios não podem ser modelados com exactidão utilizando a representação binária

São necessários outros valores além do ‘0’ e do ‘1’ para representar o estado de um fio

41

Representações de lógica multi-valor MVL (Multi-Valued Logic)

MVL-4• Forçar ‘1’: ‘1’• Forçar ‘0’: ‘0’• Forçar desconhecido: ‘X’• Forçar alta impedância: ‘Z’

MVL-9• Forçar ‘1’: ‘1’• Forçar ‘0’: ‘0’• Forçar desconhecido: ‘X’• Forçar alta impedância: ‘Z’• Não interessa o valor: ‘-’• Não inicializado: ‘U’• 1 fraco: ‘H’• 0 fraco: ‘L’• Desconhecido fraco: ‘W’

42

Tipos de Dados pré-definidos Os tipos de dados pré-definidos funcionam

bem para simulação mas não são ideais para síntese

Exemplos de Tipos de dados Bit (1 bit) bit_vector (vector de bits) Integer Real

Outros tipos de dados podem ser definidos pelo utilizador

43

Tipos de Dados pré-definidos Time: hr, min, sec, ms, us, ns, ps, fs STRING(positivo): array de chars CHARACTER: 7-bit ASCII BIT_VECTOR(natural): Array of bits BIT: ‘0’, ‘1’ REAL: Floating-point POSITIVE: inteiros > 0 NATURAL: inteiros >= 0 INTEGER: 32 ou 64 bits BOOLEAN: True ou false

44

STD_LOGIC_1164

Pacote standard que implementa um conjunto de tipos de dadosUtiliza MVL-9

IEEE recomenda a utilização dos tipos de dados STD_LOGIC e STD_LOGIC_VECTOR

utilização recomendada pela maioria das ferramentas de síntese

45

Operadores Lógicos

VHDL suporta AND OR XOR XNOR NOT NAND NOR

VHDL suporta a sobrecarga dos operadores existentes e a criação de novos

46

Outros operadores

Relacionais = (igualdade) /= (diferente) < (menor que) > (maior que) <= (menor ou igual) >= (maior ou igual)

Deslocamento sll Srl Sla Sra Rol ror

Aritméticos + (adição) - (subtracção) * (multiplicação) / (divisão) mod Rem

outros & (concatenação) abs (valor absoluto) ** (potência)

47

Instruções de atribuição

X: std_logic Y: std_logic_vector(7 downto 0) Z: integer; Instruções de atribuição de sinais concorrentes

X <= Y AND z; A <= B OR c; (X e A são produzidos concorrentemente)

Atribuição de constantes a sinais X <= ‘0’; X <= ‘1’; X <= ‘Z’; Y <= “00111010”; -- atribui 0x3A a Y Y <= X”3A”; -- atribui 0x3A a Y Y <= X”3” & X”A”; -- atribui 0x3A a Y Z <= 9; -- atribui 9 a Z Y <= (others => ‘0’); -- atribui todos os bits a ‘0’

Joao Cardoso
Aula

48

Constantes

Exemplos:constant a : integer := 5;constant b: std_logic := ‘1’;constant c: std_logic_vector(3 downto

0) := “0000”;constant d: std_logic_vector(0 to 3) :=

“0000”;constant delay : time := 5 ns;

49

Arrays

Uma ou mais dimensõesarray (0 to 7) of integer range 0 to

15;type array1 of char is array(1 to 4) of

character;type matrix is array(1 to 4, 1 to 7) of

integer;

50

Definição de novos tipos de dados type

type gap is range 10 to 100; type word is range -32768 to 32767; type myInteger is range -2147483647 to

2147483647 subtype

subtype G is INTEGER range 0 to 9; subtype word is bit_vector(31 downto 0); subtype myNatural is myInteger range 0 to

myInteger'HIGH;

51

Definição de novos tipos de dados Enumerados

type color is (white, black, blue, red, yellow);

signal my_color: color;Type instr is (load, store, add, mult);type BOOLEAN is (FALSE, TRUE);type BIT is ('0', '1');

52

Atributos pré-definidos

‘event Para identificar um evento (mudança de

estado) num sinal Exemplo: clock’event

‘length Exemplo: bus’length

‘range (esquerda downto/to direita) ‘high (valor do limite superior) ‘low (valor do limite inferior) ...

53

Comentários

Cada linha de comentários é precedida por ”--”Exemplo

• -- exemplo de um comentário

54

Contador de 0 a 7

library IEEE;use IEEE.STD_LOGIC_1164.ALL;use IEEE.STD_LOGIC_ARITH.ALL;use IEEE.STD_LOGIC_UNSIGNED.ALL;

entity count is Port ( clk : in std_logic; reset : in std_logic; cnt : out std_logic_vector(2 downto 0));end count;

architecture Behavioral of count issignal cnt1 : std_logic_vector(2 downto 0);

beginprocess(clk, reset)begin if reset = '1' then

cnt1 <= (others => '0'); elsif clk'event AND clk = '1' then

cnt1 <= cnt1 + 1; end if;end process;cnt <= cnt1;

end Behavioral;

• Com std_logic_vector

55

Contador de 0 a 7

library IEEE;use IEEE.STD_LOGIC_1164.ALL;

entity count is Port ( clk : in std_logic; reset : in std_logic; cnt : out integer range 0 to 7);end count;

architecture Behavioral of count issignal cnt1 : integer range 0 to 7;

beginprocess(clk, reset)begin if reset = '1' then

cnt1 <= 0; elsif clk'event AND clk = '1' then

cnt1 <= cnt1 + 1; end if;end process;cnt <= cnt1;

end Behavioral;

• Com integer

56

Bancada de teste Declaração de um sinal periódico:

exemplo do relógioLIBRARY ieee;USE ieee.std_logic_1164.ALL;USE ieee.numeric_std.ALL;

ENTITY testbench ISEND testbench;

ARCHITECTURE behavior OF testbench IS

COMPONENT countPORT(clk : IN std_logic;reset : IN std_logic; cnt : OUT std_logic_vector(2 downto 0));END COMPONENT;

SIGNAL clk : std_logic;SIGNAL reset : std_logic;SIGNAL cnt : std_logic_vector(2 downto 0);

SIGNAL clock : std_logic := '0'; -- for simulation

BEGINuut: count PORT MAP(clk => clk,reset => reset,cnt => cnt);

clock <= not clock after 10 ns; -- T = 20nsclk <= clock;

-- *** Test Bench - User Defined Section *** tb : PROCESS BEGIN

reset <= '1';wait for 20 ns;reset <= '0';wait for 200 ns;

--wait; -- will wait forever END PROCESS; -- *** End Test Bench - User Defined Section ***END;

57

Processos: process

Secções onde a execução é sequencialProcess(........)

• -- declaração de variáveisBegin

• ...– código sequencialEnd process;

Lista de sensibilidades: sinais de entrada do processo

Lista de sensibilidades

58

Processos: process

Declaração de variáveis (variable) apenas visíveis no escopo do processo

process (A, B, Cin)variable carry : std_logic;

beginS <= A xor B xor Cin;carry := (A and B) or (Cin and B) or (Cin and A);Cout <= carry;

end process;

Atribuição a variáveis utiliza :=

59

Processos: process

Possibilidade de utilização de instruções de controlo com o modelo imperativo

Condicionais• If: [LABEL:] if expr then ... [{elsif expr then ...}]

[else ... ] end if [LABEL];• Case: [LABEL:] case expr is {when choice [{|

choice}] => ...} end case [LABEL]; Ciclos

• For: [LABEL:] for ID in range loop ... end loop [LABEL];

• While: [LABEL:] [while expr] loop ... end loop [LABEL];

• next [LOOPLBL] [when expr];• exit [LOOPLBL] [when expr];

60

if

S, temp: std_logic_vector(7 downto 0) Enable: std_logic

process(enable, temp)begin IF enable = ‘0' THEN S <= temp; ELSE S <= "ZZZZZZZZ"; END IF;end process;

61

case

Descodificador de código BCD para disply de sete segmentos

process(inp_data)begin

case inp_data is when "0000" => out_data <= "0000001";

when "0001" => out_data <= "1001111"; when "0010" => out_data <= "0010010"; when "0011" => out_data <= "0000110"; when "0100" => out_data <= "1001100"; when "0101" => out_data <= "0100100"; when "0110" => out_data <= "0100001"; when "0111" => out_data <= "0001111"; when "1000" => out_data <= "0000000"; when "1001" => out_data <= "0000100";when others => out_data <= "1111111";end case;

end process;

Descodificador deBCD para 7–segmentos

c0 c1 c2 c3 c4 c5 c6

A B C D

c1c5

c2c4 c6

c0

c3

when others => out_data <= “-------";

62

for

Tris, A, tris: std_logic_vector(7 downto 0)

process(tris, A)begin for i in 0 to 7 loop IF tris(i) = '0' THEN PORTA(i) <= A(i); ELSE PORTA(i) <= 'Z'; END IF; end loop;end process;

63

while

Tris, A, tris: std_logic_vector(7 downto 0)

process(tris, A)variable i: integer; -- :=0;

begini := 0;

while i <=7 loop IF tris(i) = '0' THEN PORTA(i) <= A(i); ELSE PORTA(i) <= 'Z'; END IF; i := i+1; end loop;end process;

64

Loop

Tris, A, tris: std_logic_vector(7 downto 0)

process(tris, A)variable i: integer; -- :=0;

begini := 0;

L1: loop IF tris(i) = '0' THEN PORTA(i) <= A(i); ELSE PORTA(i) <= 'Z'; END IF; i := i+1;

exit L1 when i > 7; -- if(i > 7) then return; end if; end loop;end process;

65

Processos: process

Cuidados com a síntese lógica Ciclos (loops)

Número de iterações tem de ser conhecido estaticamente

A ferramenta de síntese lógica desenrola completamente os ciclos

Não consegue gerar uma arquitectura com controlo (essa síntese chama-se de síntese de alto-nível)

66

Processos: variables versus signals Variables

Actualizadas instantaneamente

Signals Actualizados no

fim do processo

67

Processos: variables versus signalsentity xor_sig isport (A, B, C: in STD_LOGIC;

X, Y: out STD_LOGIC);end xor_sig;architecture SIG_ARCH of xor_sig issignal D: STD_LOGIC;begin

SIG:process (A,B,C)begin

D <= A; -- ignored !!X <= C xor D;D <= B; -- overrides !!Y <= C xor D;

end process;end SIG_ARCH;

entity xor_var isport (A, B, C: in STD_LOGIC;X, Y: out STD_LOGIC);end xor_var;architecture VAR_ARCH of xor_var isbegin

VAR:process (A,B,C)variable D:

STD_LOGIC;begin

D := A;X <= C xor D;D := B;Y <= C xor D;

end process;end VAR_ARCH;

68

Exemplo: somador de 4 bits

library IEEE;use IEEE.std_logic_1164.all;

entity adder isport(A, B: in std_logic_vector(3 downto 0);Cin: in std_logic;S : out std_logic_vector(3 downto

0);Cout: out std_logic);

end adder;

69

Exemplo: somador de 4 bits

architecture comportamental of adder issignal S0: std_logic_vector(4 downto 0);

BeginS0 <= ('0' & A) + ('0' & B) + Cin;S <= S0(3 downto 0);Cout <= S0(4);

end comportamental;

use IEEE.STD_LOGIC_ARITH.ALL;use IEEE.STD_LOGIC_UNSIGNED.ALL;

70

Exemplo: somador de 4 bits

architecture comportamental of adder issignal S0: std_logic_vector(4 downto 0);

BeginS0 <= ('0' & A) + ('0' & B) + Cin;S <= S0(3 downto 0);Cout <= S0(4);

end comportamental;

71

Exemplo: somador de 4 bits

architecture estrutural of adder iscomponent FullAdder

port (A , B, CI: in std_logic;CO, S : out std_logic );

end component;signal cin_temp: std_logic_vector(4 downto 0);

begincin_temp(0) <= Cin;

gen: for i in 0 to 3 generateFA: FullAdder port map(A=>A(i), B=>B(i), Cin=>cin_temp(i), Cout=>cin_temp(i+1), S=>S(i));

end generate gen;

Cout <= cin_temp(4);end estrutural;

ab Cout

sFA1Cin

ab Cout

sFA2Cin

a2

b2

s2

s3

a1

b1

s1

a0

b0

s0ab Cout

sFA0CinCin

ab Cout

sFA3Cin

Couta3

b3

72

Exemplo: somador de 4 bits

Full Adder (FA)

ab Cout

sFACin

a s

b

Cout

Cin

73

Exemplo: somador de 4 bits

Full Adder (FA)entity FullAdder is

port (A , B, Cin: in std_logic;Cout, S : out std_logic );

end FullAdder;

architecture logic of FullAdder isBegin

process (A, B, Cin)variable carry : std_logic;

beginS <= A xor B xor Cin;Cout <= (A and B) or (Cin and b) or (Cin and a);

end process;end logic;

ab Cout

sFACin

a sb

Cout

Cin

74

Exemplo: somador de N bits?

Utilização de parâmetros

entity adder isgeneric(N: integer := 8);port(A, B: in std_logic_vector(N-1 downto 0);Cin: in std_logic;S : out std_logic_vector(N-1 downto 0);Cout: out std_logic);

end adder;

Por omissão N=8

75

Exemplo: somador de N bits?

architecture comportamental of adder_param issignal S0: std_logic_vector(N downto 0);

BeginS0 <= ('0' & A) + ('0' & B) + Cin;S <= S0(N-1 downto 0);Cout <= S0(N);

end comportamental;

76

Exemplo: somador de N bits?

architecture estrutural of adder_param iscomponent FullAdder

port (A , B, Cin: in std_logic;Cout, S : out std_logic );

end component;

signal cin_temp: std_logic_vector(N downto 0);Begin

cin_temp(0) <= Cin;gen: for i in 0 to N-1 generate

FA: FullAdder port map(A=>A(i), B=>B(i), Cin=>cin_temp(i), Cout=>cin_temp(i+1), S=>S(i));

end generate gen;Cout <= cin_temp(N);

end estrutural;

Instrução para gerar N instâncias do FullAdder

77

Parâmetros

Como redefinir o valor dos parâmetros para cada instância do componente?ADD1: adder generic map(32) port

map(A1, B1, Cin1, S1, Cout1)ADD2: adder generic map(8) port

map(A2, B2, Cin2, S2, Cout2)

78

Parâmetros

Declarados como generic na entity Ou num package como constantes Utilização de duas instruções para

gerar instânciasFor ... Generate : instrução cíclicaIf ... generate : geração condicional

79

Exemplo: Máquina de Bebidas Disponibiliza a lata depois de 150 ou

mais escudos terem sido depositados Uma única abertura para moedas

(50$00 e 100$00) Não dá troco

FSMda máquina

debebidas

CEM

CINQ

Reset

Clock

AbreSensorde

MoedasMecanismo

deLibertar Lata

80

Exemplo: Máquina de Bebidas Tabela e Diagrama de Estados

0$

Reset

50$

CINQ

CINQ

CEM + CINQ

100$

CEM

150$[open]

CEM

Tabela de estados Simbólica

Estado Entrada Próx. SaídaActual CEMCINQ Estado open 0$ 0 0 0$ 0

0 1 50$ 01 0 100$ 01 1 – –

50$ 0 0 50$ 00 1 100$ 01 0 150$ 01 1 – –

100$ 0 0 100$ 00 1 150$ 01 0 150$ 01 1 – –

150$ – – 150$ 1

81

Exemplo: Máquina de Bebidas

library IEEE;use IEEE.STD_LOGIC_1164.ALL;use IEEE.STD_LOGIC_ARITH.ALL;use IEEE.STD_LOGIC_UNSIGNED.ALL;

entity fsm is Port ( clk : in std_logic; reset : in std_logic; CEM : in std_logic; CINQ : in std_logic; s_open : out std_logic);end fsm;

architecture Behavioral of fsm istype state_type is (zero, cinquenta, st_cem, cent_cinq);signal current_state, next_state: state_type;

beginprocess(reset, clk)begin if reset = '1' then current_state <= zero; elsif clk'event AND clk='1' then current_state <= next_state; end if;end process;

process(current_state, CEM, CINQ) begin s_open <= '0'; case current_state is when zero =>

if CINQ = '1' then next_state <= cinquenta; elsif CEM = ‘1’ then next_state <= st_cem;

else next_state <= zero; end if; when cinquenta => if CINQ = '1' then next_state <= st_cem;

elsif CEM = '1' then next_state <= cent_cinq;else next_state <= cinquenta; end if;

when st_cem => if CINQ = '1' OR CEM = '1' then next_state <= cent_cinq;

else next_state <= st_cem; end if;when cent_cinq =>s_open <= '1'; next_state <= zero;

when others =>next_state <= zero;

end case;end process;end Behavioral;

82

Funções e Procedimentos

Corpo executa sequencialmente Permitem declaração de variáveis locais

Funções: devolvem dados utilizando a instrução returnfunction allzero(A: std_logic_vector(7 downto 0)) return std_logic is

variable val: std_logic;Begin

…Return Val;

End allzero;

Procedimentos: devolvem dados através de variáveis de saída nos argumentos

procedure allzero(A: in std_logic_vector(7 downto 0), O: out std_logic) isBegin

O := …;End allzero;

83

Redefinição de funções e procedimentos Exemplo:

function max(A, B: myType) return myType;

function max(A, B, C: myType) return myType;

84

Sobrecarga de operadores

Exemplo: function "+"(L: UNSIGNED; R: UNSIGNED) return UNSIGNED; function "+"(L: SIGNED; R: SIGNED) return SIGNED; function "+"(A,B: myType) return myType;

function "+"(L: UNSIGNED; R: UNSIGNED) return UNSIGNED isconstant length: INTEGER := max(L'length, R'length);

begin return unsigned_plus(CONV_UNSIGNED(L, length), CONV_UNSIGNED(R, length));

end;

function "+"(L: SIGNED; R: SIGNED) return SIGNED isconstant length: INTEGER := max(L'length, R'length);

begin return plus(CONV_SIGNED(L, length), CONV_SIGNED(R, length));

end; ...

85

Packages

library IEEE; use IEEE.std_logic_1164.all;

package aritmetica is function allzero(A: std_logic_vector(7 downto 0)) return std_logic; function "+"(A,B: std_logic_vector(7 downto 0)) return std_logic_vector; …

end aritmetica; package body aritmetica is

function allzero(A: std_logic_vector(7 downto 0)) returnstd_logic is

variable Z: std_logic; begin if (A = "00000000") then Z := '1'; else Z := '0'; end if; return(Z);end allzero;…

end aritmetica;

86

Packages Exemplo:library IEEE;use IEEE.std_logic_1164.all;

package rom isconstant ROM_WIDTH: integer := 12;constant ROM_LENGTH: integer := 135;subtype ROM_WORD is std_logic_vector (ROM_WIDTH-1 downto 0);subtype ROM_RANGE is integer range 0 to ROM_LENGTH-1;type ROM_TABLE is array (0 to ROM_LENGTH-1) of ROM_WORD;constant ROM: ROM_TABLE := ROM_TABLE'(

ROM_WORD'("000000000000"),ROM_WORD'("000001000000"),ROM_WORD'("000000000010"),...ROM_WORD'("000000000000"),ROM_WORD'("000000000000"));

end rom;

Utilização da package:Library work;Use work.rom.all;

87

Outras potencialidades

Ficheirosutilizados para simulaçãocomo armazenamento de dados de

memórias Etc.

88

Síntese

Gera a estrutura de um circuitoA partir do código VHDLUtiliza os componentes existentes

numa biblioteca (portas lógicas, unidades aritméticas, etc.)

Inferência de determinados componentes com base na descrição VHDL

89

Síntese: Inferência

Largura em bits numa linhaNúmero de bits atribuído a um sinal

ou portoExemplo: Port A: in integer range 0

to 15;• Síntese atribui 4 bits a A

90

Síntese: Inferência

A, B, S: std_logic_vector(7 downto 0)

S <= A + B; Síntese atribui um somador de 8

bits sem sinal S <= SIGNED(A) + SIGNED(B);

Síntese atribui um somador de 8 bits com sinal

SIGNED é uma função da package STD_LOGIC_ARITH da biblioteca IEEE Converte std_logic_vector em

representação de inteiros com sinal: signed

91

Síntese: Inferência

Flip Flop com reset assíncronoprocess(reset, clk)Begin if(reset = '1') then

Q <= '0'; elsif(clk'event and clk='1') then Q <= D; End if;

end process;

92

Síntese: Inferência

Flip Flop com reset síncronoprocess(reset, clk)begin

if(clk'event and clk='1') then if(reset = '1') then

Q <= '0'; else

Q <= D; end if; End if;

end process;

93

Síntese: Inferência

Latchprocess(load, D)begin

if(load = '1') then Q <= D;

end if; end process;

94

Síntese: Inferência

Multiplexadorprocess(sel, D1, D2)begin

if(sel = '1') then Q <= D1;else Q <= D2;

end if; end process;

95

Síntese: Inferência

Flip-Flop com sinal de loadprocess(reset, clk, load) begin

if(reset = '1') then Q <= '0';elsif(clk'event and clk='1') then if(load = '1') then

Q <= D; end if;End if;

end process;

96

Síntese: Inferência

tabelas de valores: ROMs ou portas lógicas

library IEEE;use IEEE.std_logic_1164.all;

entity tabela isport (ADDR : in INTEGER range 0 to 3;

DATA : out STD_LOGIC_VECTOR (1 downto 0));end tabela ;

architecture description of tabela issubtype ROM_WORD is STD_LOGIC_VECTOR (1 downto 0);type ROM_TABLE is array (0 to 3) of ROM_WORD;constant ROM : ROM_TABLE := ROM_TABLE’(

ROM_WORD’("01"),ROM_WORD’("00"),ROM_WORD’("10"), ROM_WORD’("11"));

beginDATA <= ROM(ADDR); -- Read from the ROM

end description ;

97

Síntese: Inferência

Distributed RAMs...process (clk)

beginif (clk'event and clk = '1') thenif (we = '1') thenRAM(conv_integer(a)) <= di;end if;end if;end process;do <= RAM(conv_integer(a));

...Read assíncrono

98

Síntese: Inferência

Block RAMs...process (clk)

beginif (clk'event and clk = '1') thenif (we = '1') thenRAM(conv_integer(a)) <= di;end if;index <= conv_integer(a);end if;end process;do <= RAM(index);

...Read síncrono

99

Comentários

VHDL é uma linguagem definida para simulação de sistemas digitais Inclui muitas formas de especificação não

suportadas por ferramentas de síntese No projecto de sistemas digitais com síntese

lógica utiliza-se um sub-conjunto de VHDL boa regra de descrição: evitar código ao

qual não associamos um tipo de estrutura de hardware