Linguagens de Descrição de Hardware VHDL Foco: Síntese Lógica Integração Hardware-Software João M. P. Cardoso Email: [email protected] URL: http://w3.ualg.pt/~jmcardo 2005 1 Modelação de Sistemas Digitais Razões para modelar Objectivo 2 Especificação dos requisitos documentação Teste utilizando simulação Verificação formal síntese Processo de desenho mais fiável, com custo e tempo mínimos Fuga aos erros de desenho! Modelação de Sistemas Digitais Linguagens de Programação de Hardware VHDL (VHSIC Hardware Description Language) • VHSIC: Very High Speed Integrated Circuit 3 Verilog Domínios e Níveis de Modelação Functional Structural high level of abstraction low level of abstraction Geometric 4 “Y-chart” due to Gajski & Kahn Domains and Levels of Modeling Functional Structural Algorithm (behavioral) Register-Transfer Language Boolean Equation Differential Equation Geometric 5 “Y-chart” due to Gajski & Kahn Domains and Levels of Modeling Functional Structural Processor-Memory Switch Register-Transfer Gate Transistor Geometric 6 “Y-chart” due to Gajski & Kahn Domains and Levels of Modeling Functional Structural Polygons Sticks Standard Cells Floor Plan Geometric 7 “Y-chart” due to Gajski & Kahn Conceitos básicos de VHDL Interfaces Comportamento (behavior) Estrutura Conjuntos de teste (Test Benchs) Análise, elaboração, simulação Síntese 8 Interfaces de Modelação Declaração da Entity Descreve as entradas/saídas de cada módulo entity name port names port mode (direction) entity reg4 is port ( d0, d1, d2, d3, en, clk : in bit; q0, q1, q2, q3 : out bit ); end reg4; reserved words 9 port type punctuation 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 • • • • 10 process statements, cada contém sequential statements, incluindo signal assignment statements e wait statements Exemplo de Behavior 11 architecture behav of reg4 is begin storage : process variable stored_d0, stored_d1, stored_d2, stored_d3 : bit; begin if 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; 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 12 Exemplo de Estrutura bit0 d_latch d q d0 q0 clk bit1 d_latch d q d1 q1 clk bit2 d_latch d q d2 q2 clk bit3 d_latch d q d3 en clk 13 gate and2 a y b clk int_clk q3 Exemplo de Estrutura Declarar primeiro entidades e arquitecturas para o D-latch e and-gate entity d_latch is port ( d, clk : in bit; q : out bit ); end d_latch; architecture basic of d_latch is begin latch_behavior : process (clk, d) begin if clk = ‘1’ then q <= d after 2 ns; end if; end process; end basic; 14 entity and2 is port ( a, b : in bit; y : out bit ); end and2; architecture basic of and2 is begin and2_behavior : process (a, b) begin y <= a and b after 2 ns; end process; end basic; Exemplo de Estrutura Declarar os componentes correspondentes no corpo da arquitectura do registo architecture struct of reg4 is component 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; ... 15 Exemplo de Estrutura 16 Utilizá-los para implementar o registo ... begin bit0 : d_latch port map ( d0, int_clk, q0 ); bit1 : d_latch port map ( d1, int_clk, q1 ); bit2 : d_latch port map ( d2, int_clk, q2 ); bit3 : d_latch port map ( d3, int_clk, q3 ); gate : and2 port map ( en, clk, int_clk ); end struct; Exemplo de Estrutura Configurar os modelos: necessário quando temos mais do que um modelo para cada entidade configuration basic_level of reg4 is for struct for all : d_latch use entity work.d_latch(basic); end for; for all : and2 use entity work.and2(basic) end for; end for; end basic_level; 17 Mistura de comportamento e estrutura Uma arquitectura pode ser descrita com comportamentos e estruturas Exemplo: modelo register-transfer-level (RTL) 18 Instruções process e instâncias de componentes Processos podem ler e atribuir sinais Data-path é descrito estruturalmente Unidade de controlo descrita comportamentalmente Exemplo com mistura multiplier multiplicand shift_reg control_ section shift_ adder reg product 19 Exemplo com mistura entity 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 componentes signal partial_product, full_product : integer; signal arith_control, result_en, mult_bit, mult_load : bit; begin arith_unit : shift_adder port map ( addend => multiplicand, augend => full_product, sum => partial_product, add_control => arith_control ); result : reg port map ( d => partial_product, q => full_product, en => result_en, reset => reset ); 20 ... 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; 21 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 22 Exemplo de bancada de teste architecture test_reg4 of test_bench is entity test_bench is end test_bench; 23 -- falta declaração do componente a testar: reg4 signal d0, d1, d2, d3, en, clk, q0, q1, q2, q3 : bit; begin dut : 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; Teste de regressão Testar se um refinamento do desenho está correcto A bancada de teste inclui duas instâncias do desenho em teste 24 se um modelo estrutural de mais baixo nível faz o mesmo que um modelo comportamental 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 Exemplo de teste de regressão architecture regression of test_bench is 25 -- falta declaração do componente a testar signal d0, d1, d2, d3, en, clk : bit; signal q0a, q1a, q2a, q3a, q0b, q1b, q2b, q3b : bit; begin dut_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; 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; 26 Processamento do Desenho Análise Elaboração Simulação Síntese 27 Análise 28 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 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 29 Colecção planar de nets de sinais e processos Exemplo Elaborado bit0 d_latch d q reg4(struct) d0 q0 clk bit1 d_latch d q d1 q1 clk bit2 d_latch d q d2 q2 clk bit3 d_latch d q d3 en clk 30 gate and2 a y b clk int_clk q3 Exemplo Elaborado bit0 d_latch(basic) d q reg4(struct) d0 q0 clk bit1 d_latch(basic) d q d1 q1 clk bit2 d_latch(basic) d q d2 q2 clk bit3 d_latch(basic) d q d3 en clk 31 gate and2(basic) a y b q3 clk int_clk process with variables and statements 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 32 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 33 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? 34 Metodologia de desenho básica Requirements RTL Model Simulate Synthesize Gate-level Model ASIC or FPGA 35 Simulate Place & Route Timing Model Simulate Test Bench VHDL Detalhes sobre a linguagem 36 Bibliotecas e Pacotes Bibliotecas Fornecem 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; 37 Ports 38 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>) 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 39 Apenas é suportada conversão de tipos explicita 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 40 Representações de lógica multi-valor MVL (Multi-Valued Logic) MVL-4 • • • • MVL-9 • • • • • • • • • 41 Forçar ‘1’: ‘1’ Forçar ‘0’: ‘0’ Forçar desconhecido: ‘X’ Forçar alta impedância: ‘Z’ 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’ 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 42 Bit (1 bit) bit_vector (vector de bits) Integer Real Outros tipos de dados podem ser definidos pelo utilizador Tipos de Dados prédefinidos 43 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 STD_LOGIC_1164 Pacote standard que implementa um conjunto de tipos de dados Utiliza 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 44 Operadores Lógicos VHDL suporta 45 AND OR XOR XNOR NOT NAND NOR VHDL suporta a sobrecarga dos operadores existentes e a criação de novos Outros operadores Relacionais 46 = (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) Instruções de atribuição 47 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’ 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; 48 Arrays Uma ou mais dimensões array (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; 49 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; 50 Definição de novos tipos de dados 51 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'); Atributos pré-definidos ‘event ‘length 52 Para identificar um evento (mudança de estado) num sinal Exemplo: clock’event Exemplo: bus’length ‘range (esquerda downto/to direita) ‘high (valor do limite superior) ‘low (valor do limite inferior) ... Comentários Cada linha de comentários é precedida por ”--” Exemplo • -- exemplo de um comentário 53 Contador de 0 a 7 architecture Behavioral of count is signal cnt1 : std_logic_vector(2 downto 0); begin process(clk, reset) library IEEE; begin use IEEE.STD_LOGIC_1164.ALL; if reset = '1' then use IEEE.STD_LOGIC_ARITH.ALL; cnt1 <= (others => '0'); use IEEE.STD_LOGIC_UNSIGNED.ALL; elsif clk'event AND clk = '1' then cnt1 <= cnt1 + 1; entity count is end if; Port ( clk : in std_logic; end process; reset : in std_logic; cnt <= cnt1; cnt : out std_logic_vector(2 downto 0)); end Behavioral; end count; • Com std_logic_vector 54 Contador de 0 a 7 • Com integer 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; 55 architecture Behavioral of count is signal cnt1 : integer range 0 to 7; begin process(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; Bancada de teste Declaração de um sinal periódico: exemplo do relógio LIBRARY ieee; USE ieee.std_logic_1164.ALL; USE ieee.numeric_std.ALL; ENTITY testbench IS END testbench; ARCHITECTURE behavior OF testbench IS COMPONENT count PORT(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 56 BEGIN uut: count PORT MAP( clk => clk, reset => reset, cnt => cnt ); clock <= not clock after 10 ns; -- T = 20ns clk <= 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; Processos: process Secções onde a execução é sequencial Process(........) Lista de sensibilidades • -- declaração de variáveis Begin • ...– código sequencial 57 End process; Lista de sensibilidades: sinais de entrada do processo Processos: process Declaração de variáveis (variable) apenas visíveis no escopo do processo process (A, B, Cin) variable carry : std_logic; begin S <= 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 := 58 Processos: process Possibilidade de utilização de instruções de controlo com o modelo imperativo Condicionais • • Ciclos • • • • 59 If: [LABEL:] if expr then ... [{elsif expr then ...}] [else ... ] end if [LABEL]; Case: [LABEL:] case expr is {when choice [{| choice}] => ...} end case [LABEL]; 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]; 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; 60 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; 61 c5 c4 c0 c6 c1 c2 c3 c0 c1 c2 c3 c4 c5 c6 Descodificador de BCD para 7– segmentos A B C D when others => out_data <= “-------"; 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; 62 while Tris, A, tris: std_logic_vector(7 downto 0) process(tris, A) variable i: integer; -- :=0; begin i := 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; 63 Loop Tris, A, tris: std_logic_vector(7 downto 0) process(tris, A) variable i: integer; -- :=0; begin i := 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; 64 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) 65 Processos: variables versus signals Variables 66 Actualizadas instantaneamente Signals Actualizados no fim do processo Processos: variables versus signals entity xor_sig is port (A, B, C: in STD_LOGIC; X, Y: out STD_LOGIC); end xor_sig; architecture SIG_ARCH of xor_sig is signal 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; 67 entity xor_var is port (A, B, C: in STD_LOGIC; X, Y: out STD_LOGIC); end xor_var; architecture VAR_ARCH of xor_var is begin 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; Exemplo: somador de 4 bits library IEEE; use IEEE.std_logic_1164.all; entity adder is port(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; 68 Exemplo: somador de 4 bits architecture comportamental of adder is signal S0: std_logic_vector(4 downto 0); Begin S0 <= ('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; 69 Exemplo: somador de 4 bits architecture comportamental of adder is signal S0: std_logic_vector(4 downto 0); Begin S0 <= ('0' & A) + ('0' & B) + Cin; S <= S0(3 downto 0); Cout <= S0(4); end comportamental; 70 Exemplo: somador de 4 bits architecture estrutural of adder is component FullAdder port (A , B, CI: CO, S : in std_logic; out std_logic ); end component; signal cin_temp: std_logic_vector(4 downto 0); begin cin_temp(0) <= Cin; gen: for i in 0 to 3 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; Cin Cin a0 b0 a a1 b1 a2 b2 Cout <= cin_temp(4); b Cout Cin a FA1 s b s1 Cout Cin a s0 FA2 s b s2 Cout Cin end estrutural; 71 FA0 s a3 b3 a b FA3 s Cout s3 Cout Exemplo: somador de 4 bits Full Adder (FA) Cin a b Cin a b s FA s Cout Cout 72 Exemplo: somador de 4 bits Cin a b Full Adder (FA) entity FullAdder is port (A , B, Cin: in std_logic; Cout, S : out std_logic ); end FullAdder; Cin a b FA s Cout architecture logic of FullAdder is Begin process (A, B, Cin) variable carry : std_logic; begin S <= A xor B xor Cin; Cout <= (A and B) or (Cin and b) or (Cin and a); end process; end logic; 73 s Cout Exemplo: somador de N bits? Utilização de parâmetros Por omissão N=8 entity adder is generic(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; 74 Exemplo: somador de N bits? architecture comportamental of adder_param is signal S0: std_logic_vector(N downto 0); Begin S0 <= ('0' & A) + ('0' & B) + Cin; S <= S0(N-1 downto 0); Cout <= S0(N); end comportamental; 75 Exemplo: somador de N bits? architecture estrutural of adder_param is component FullAdder port (A , B, Cin: Cout, S : in std_logic; out std_logic ); end component; signal cin_temp: std_logic_vector(N downto 0); Instrução para gerar N instâncias do FullAdder 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; 76 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) 77 Parâmetros Declarados como generic na entity Ou num package como constantes Utilização de duas instruções para gerar instâncias For ... Generate : instrução cíclica If ... generate : geração condicional 78 Exemplo: Máquina de Bebidas Disponibiliza a lata depois de 150 ou mais escudos terem sido depositados Uma única abertura para moedas Reset (50$00 e 100$00) Não dá troco CEM Sensor de Moedas 79 CINQ FSM da máquina de bebidas Clock Abre Mecanismo de Libertar Lata Exemplo: Máquina de Bebidas Tabela e Diagrama de Estados Reset Estado Actual 0$ 0$ CINQ 50$ 50$ CEM CINQ CEM 100$ 100$ CEM + CINQ 150$ 80 [open] 150$ Entrada CEM CINQ 0 0 0 1 1 0 1 1 0 0 0 1 1 0 1 1 0 0 0 1 1 0 1 1 – – Próx. Estado 0$ 50$ 100$ – 50$ 100$ 150$ – 100$ 150$ 150$ – 150$ Tabela de estados Simbólica Saída open 0 0 0 – 0 0 0 – 0 0 0 – 1 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 is type state_type is (zero, cinquenta, st_cem, cent_cinq); signal current_state, next_state: state_type; begin process(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; 81 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; Funções e Procedimentos Corpo executa sequencialmente Permitem declaração de variáveis locais Funções: devolvem dados utilizando a instrução return function 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) is Begin O := …; End allzero; 82 Redefinição de funções e procedimentos Exemplo: function max(A, B: myType) return myType; function max(A, B, C: myType) return myType; 83 Sobrecarga de operadores Exemplo: 84 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 is constant 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 is constant length: INTEGER := max(L'length, R'length); begin return plus(CONV_SIGNED(L, length), CONV_SIGNED(R, length)); end; ... 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)) return std_logic is variable Z: std_logic; begin if (A = "00000000") then Z := '1'; else Z := '0'; end if; return(Z); end allzero; … 85 end aritmetica; Packages Exemplo: library IEEE; use IEEE.std_logic_1164.all; package rom is constant 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; 86 Outras potencialidades Ficheiros utilizados para simulação como armazenamento de dados de memórias 87 Etc. Síntese Gera a estrutura de um circuito A partir do código VHDL Utiliza os componentes existentes numa biblioteca (portas lógicas, unidades aritméticas, etc.) 88 Inferência de determinados componentes com base na descrição VHDL Síntese: Inferência Largura em bits numa linha Número de bits atribuído a um sinal ou porto Exemplo: Port A: in integer range 0 to 15; • Síntese atribui 4 bits a A 89 Síntese: Inferência 90 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 Síntese: Inferência Flip Flop com reset assíncrono process(reset, clk) Begin if(reset = '1') then Q <= '0'; elsif(clk'event and clk='1') then Q <= D; End if; end process; 91 Síntese: Inferência Flip Flop com reset síncrono process(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; 92 Síntese: Inferência Latch process(load, D) begin if(load = '1') then Q <= D; end if; end process; 93 Síntese: Inferência Multiplexador process(sel, D1, D2) begin if(sel = '1') then Q <= D1; else Q <= D2; end if; end process; 94 Síntese: Inferência Flip-Flop com sinal de load process(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; 95 Síntese: Inferência tabelas de valores: ROMs ou portas lógicas library IEEE; use IEEE.std_logic_1164.all; entity tabela is port (ADDR : in INTEGER range 0 to 3; DATA : out STD_LOGIC_VECTOR (1 downto 0)); end tabela ; architecture description of tabela is subtype 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")); begin DATA <= ROM(ADDR); -- Read from the ROM end description ; 96 Síntese: Inferência Distributed RAMs ... process (clk) begin if (clk'event and clk = '1') then if (we = '1') then RAM(conv_integer(a)) <= di; end if; end if; end process; do <= RAM(conv_integer(a)); Read assíncrono ... 97 Síntese: Inferência Block RAMs ... process (clk) begin if (clk'event and clk = '1') then if (we = '1') then RAM(conv_integer(a)) <= di; end if; index <= conv_integer(a); end if; end process; do <= RAM(index); Read síncrono ... 98 Comentários VHDL é uma linguagem definida para simulação de sistemas digitais 99 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