UNIVERSIDADE TECNOLÓGICA FEDERAL DO PARANÁ DEPARTAMENTO ACADÊMICO DE ELETROTÉCNICA CURSO DE ENGENHARIA INDUSTRIAL ELÉTRICA MESTRADO EM SISTEMAS DE ENERGIA Lógica Reconfigurável - amauriassef@utfpr.edu.br paginapessoal.utfpr.edu.br/amauriassef 1
1. Linguagem VHDL Code Structure Library: Declaração das bibliotecas necessárias no projeto std e work são incluídas por definição Package: Declaração da biblioteca e informações sobre os modelos VHDL LIBRARY ieee; USE ieee.std_logic_1164.all; -- std_logic e funções relacionadas USE ieee.numeric_std.all; -- funções com ou sem sinal em std_logic USE ieee.std_logic_arith.all; -- funções aritméticas (não usar com numeric_std) USE ieee.std_logic_signed.all; -- funções aritméticas com sinal USE ieee.std_logic_unsigned.all; -- funções aritméticas sem sinal (overload) Library Package Todas as funções 2
Entity: Declaração das interfaces do projeto (pinos de I/O) ENTITY <entity_name> IS -- mesmo nome do código.vhd GENERIC (...); -- pode definir uma constante genérica (optativo) PORT ( port_name: signal_mode signal_type; port_name: signal_mode signal_type;...); -- pinos de I/O [BEGIN] [declarative part] END <entity_name > Signal mode: IN, OUT, INOUT e BUFFER Signal type: BIT, BIT_VECTOR, INTEGER, STD_LOGIC, STD_LOGIC_VECTOR, BOOLEAN, etc. Declarative part: SIGNAL, CONSTANT, FUNCTION, PROCEDURE, TYPE, etc. (not COMPONENT) 3
Architecture: Define o código VHDL ARCHITECTURE <architecture_name> OF <entity_name> IS [declarative_part] BEGIN [code] END < architecture_name >; Declarative part: SIGNAL, CONSTANT, FUNCTION, PROCEDURE, TYPE, etc. Code: concorrente (paralelo) ou sequencial 4
Exemplo: XOR (Ou-exclusiva) LIBRARY ieee; -- LIBRARY USE ieee.std_logic_1164.all; ----------------------------------------------------- ENTITY xor_vhdl IS -- ENTITY GENERIC (N: INTEGER :=8); PORT ( a,b: IN STD_LOGIC; s: OUT STD_LOGIC); END xor_vhdl; ----------------------------------------------------- ARCHITECTURE behavior OF xor_vhdl IS -- ARCHITECTURE BEGIN s <= a XOR b; END behavior; 5
Exemplo: Multiplexador 4x8 library ieee; -- LIBRARY use ieee.std_logic_1164.all; use ieee.numeric_std.all; --------------------------------------------- entity aula2 is -- ENTITY port (a,b,c,d : in std_logic_vector(7 downto 0); sel : in integer range 0 to 3; -- mais simples que o SLV y : out std_logic_vector(7 downto 0)); end aula2; ---------------------------------------------- architecture rtl of aula2 is -- ARCHITECTURE begin y <= a when sel=0 else b when sel=1 else c when sel=2 else d; end rtl; 6
2. Tipos de dados sintetizáveis STD_LOGIC e STD_LOGIC_VECTOR Usado para valores lógicos Valor Descrição U Não inicializado X Desconhecido / Não importa para síntese 0 Lógica 0 1 Lógica 1 Z Tristate / Alta impedância W Fraco desconhecido L Pull-down weak 0 H Pull-up weak 1 - Não importa 7
3. Tipos de dados pré-definidos Tipos de dados pré-definidos Library/Package Valores sintetizáveis BIT, BIT_VECTOR std/standard 0, 1 BOOLEAN std/standard TRUE, FALSE INTEGER std/standard -(2 31-1) a +(2 31-1) NATURAL std/standard 0 a (2 31-1) POSITIVE std/standard 1 a (2 31-1) CHARACTER std/standard 256 símbolos ASCII STRING std/standard Utilizado para redução de síntese REAL std/standard 1.0E308 a 1.0E308 (ponto flut.) STD_ULOGIC, STD_ULOGIC_VECTOR, STD_LOGIC, STD_LOGIC_VECTOR UNSIGNED, SIGNED ieee/std_logic_1164 ieee/numeric_std ieee/std_logic_arith Input: 0, 1, L H Output: 0, 1, L, H, Z, -, X Mesmo que o STD_LOGIC 8
Exemplo de tipos de dados comuns em VHDL Tipo de dados Declaração (Amostra) Valores sintetizáveis BIT y: OUT BIT 0, 1 STD_LOGIC driver: STD_LOGIC 0, 1, Z, X, - BIT_VECTOR bcd_data: BIT_VECTOR (3 DOWNTO 0) 0101, 1001, STD_LOGIC_VECTOR bus: STD_LOGIC_VECTOR (7 DOWNTO 0) 000011Z1X INTEGER SIGNAL z: INTEGER RANGE -32 TO 31-32, -16, 15, 31 Tipo de dados Uso BIT Y <= 0 ; STD_LOGIC BIT_VECTOR STD_LOGIC_VECTOR INTEGER Driver <= Z ; Saida <=bcd_data IF rd = 0 THEN bus <= 100Z ; IF z > 5 THEN 9
Números sinalizados 10
Intervalos: determina um intervalo de utilização de um determinado tipo RANGE <valor_menor> TO <valor_maior> RANGE <valor_maior> DOWNTO <valor_menor> Exemplo STD_LOGIC: sinal teste_sl: STD_LOGIC; sinal teste_sl: STD_LOGIC := 0 ; 1-bit: ( ) Multi-bit: ( ) Exemplo STD_LOGIC _VECTOR: signal teste_slv : STD_LOGIC_VECTOR(0 TO 3); signal teste_slv : STD_LOGIC_VECTOR(3 DOWNTO 0) := 1001 ; Exemplo INTEGER signal teste_integer : INTEGER := 255; signal teste_integer: INTEGER RANGE 0 TO 255; 11
4. Libraries/Packages Library/Package std/standard ieee/std_logic_1164 ieee/numeric_std ieee/std_logic_arith ieee/std_logic_signed ieee/std_logic_unsigned Tipos de dado BOOLEAN, BIT, BIT_VECTOR, INTEGER, NATURAL, POSITIVE, REAL, TIME, etc. STD_ULOGIC e STD_LOGIC SIGNED e UNSIGNED com STD_LOGIC como base SIGNED e UNSIGNED com STD_LOGIC como base Aritmético, comparação, e alguns operadores de deslocamento para STD_LOGIC_VECTOR quando SIGNED Similar ao anterior para UNSIGNED 12
5. Tipos de dados definidos pelo usuário Integer-based user-defined types: Subset of INTEGER Exemplo: TYPE input_range IS RANGE -128 TO 128; signal a : input_range; Enumerated user-defined types: Utilizado em projetos de máquina de estados finita (FSM) Exemplo: TYPE machine_state IS (idlle, forward, backward); signal state_1: idle; Array-based user-define types: Utilizar a palavra ARRAY Exemplo de matriz (array) 1D: TYPE vector IS ARRAY (15 DOWNTO 0) OF STD_LOGIC; signal a, b, c : vector := 1111000011110000 ; a(5 DOWNTO 1) <= 010Z0 ; b(0) <= 1 ; c <= (others => 0 ); 13
Exemplo matriz 1D x 1D: TYPE matriz1 IS ARRAY (1 TO 3) OF BIT_VECTOR(7 DOWNTO 0); SIGNAL a, b, c: matriz1; a(3)(7) <= 1 ; b (1)(2 DOWNTO 0) <= 1101 ; c <= (OTHERS => 0, OTHERS => 0, OTHERS => 0 ) ; Obs: (linha)(coluna) Exemplo matriz 2D: TYPE matriz2 IS ARRAY (1 TO 3, 7 DOWNTO 0) OF BIT; SIGNAL a, b, c: matriz2; a(3)(7) <= 1 ; b (1)(3 DOWNTO 0) <= 1101 ; c <= (OTHERS => 0, OTHERS => 0, OTHERS => 0 ) 14
6. Operadores VHDL Concatenação: &,,, OTHERS=> Exemplo: k: CONSTANTE BIT_VECTOR(1 TO 4) := 1100 ; x <= ( Z, K(2 TO 3), 11111 ); -- resultado: x <= Z1011111 y <= Z & K(2 TO 3) & 11111 ; -- resultado: y <= Z1011111 Operadores de atribuição: <= para sinais := para variáveis ou valores iniciais 15
Tipo da operação Lógica Operador VHDL NOT, AND, NAND, NOR, XOR, XNOR (NOT has precedence) Support: BOOLEAN, BIT, BIT_VECTOR, STD_(U)LOGIC, STD_LOGIC_(U)VECTOR, (UN)SIGNED(*) *Depends on the package Comparação =, /=, >, >=, <, <= Support: BOOLEAN, BIT, BIT_VECTOR, INTEGER, NATURAL, POSITIVE, SIGNED, UNSIGNED, CHARACTER, STRING Deslocamento (Shift) Aritmético SLL, SRL, SLA, SRA, ROL, ROR (não são standard) Lógico completa com zero; Aritmético repete o último Usar & para operações de deslocamento. Exemplo: y <= x(6 DOWNTO 0) & 1 ; +, -, *, /, ABS, **, MOD, REM Support: INTEGER, NATURAL, POSITIVE, SIGNED, UNSIGNED ABS valor absoluto, ** - expoente, MOD módulo e REM resto da divisão 16
Obs: Utilizar parênteses entre operadores não associados Legal z <= a AND b AND c; z <= (a AND b) OR c; z <= not a AND b; z <= (not a) AND b; -- not precede Ilegal z <= a AND b OR C; z <= a NAND b NAND c; z <= a NOR b NOR c; 17
Exercício 1 Projetar o seguinte circuito utilizando VHDL: S <=? Verificar através do RTL Viewer 18
7. Atributos EVENT-RELATED: Utilizado para monitorar mudanças nos sinais clk EVENT borda de clock (mais comum) If (res = 1 ) then elsif (clk EVENT and clk= 1 ) then end if; GENERIC Especifica uma constante genérica Utilizar na ENTITY, antes do PORT, exemplo: ENTITY teste IS GENERIC (n: INTEGER := 16; BUS_WIDTH: NATURAL := 8; ESTADO: STD_LOGIC_VECTOR := "10101010"); PORT (...) END teste; 19
Exercício 2 Projetar o multiplexador 4xN utilizando operadores VHDL e GENERIC: A B C D N 0 1 2 3 sel 2 N S entity ex2 is port ( ); end ex2; ---------------------------------------------- architecture rtl of ex2 is begin S <= A when sel= else B when sel= else C when sel= else D; end rtl; 20
8. Objetos (SIGNAL, VARIABLE, CONSTANT) CONSTANT nome_constante: tipo_constante := valor_constante; VARIABLE nome_variável: tipo_variável [range] [:= valor_inicial]; SIGNAL nome_sinal: tipo_sinal [range] [:= valor_inicial]; SIGNAL : representam as interconexões físicas (fios e barramentos) de comunicação entre os processos Podem ser utilizados para a comunicação entre processos Podem aparecer em listas de sensibilidade de um processo Podem ter atrasos 21
VARIABLE: são as variáveis utilizadas dentro dos processos Podem ser utilizadas apenas dentro do processo que foram declaradas Não podem aparecer em listas de sensibilidade Não podem ter atrasos CONSTANT: são valores que não se alteram e que são rotulados para facilitar a programação Exemplo: CONSTANTE mask: STD_LOGIC_VECTOR (31 DOWNTO 0) := (OTHERS => 1 ); SIGNAL resultado_temp: INTEGER RANGE 0 TO 255; VARIABLE leds_temp: STD_LOGIC_VECTOR (0 TO 7) := X FF ; 22
Diferença entre SIGNAL e VARIABLE signal a,b : std_logic_vector(0 to 4); process (CLK) begin if (rising_edge(clk)) then a <= '10111'; b <= a; end if; end process; Neste código, b irá receber o valor de a ao mesmo tempo que a recebe 10111. Com isso, b não irá receber 10111. signal a,b : std_logic_vector(0 to 4); process (CLK) variable var : std_logic_vector(0 to 4); begin if (rising_edge(clk)) then var := '10111'; a <= var; b <= var; end if; end process; Neste código, o valor 10111 será carregado em a e b. 23
Exemplo do SIGNAL como interconexão (dentro da ARCHITECTURE): ENTITY comb IS GENERIC (K: INTEGER :=16); PORT ( a,b,c,d: IN STD_LOGIC; s: OUT STD_LOGIC); END comb; ARCHITECTURE behavior OF comb IS SIGNAL s1,s2,s3,s4: STD_LOGIC; BEGIN s1 <= a OR b; s2 <= c XOR d; s3 <= NOT s2; s4 <= s1 AND s3; s <= s4; END behavior; Códigos Concorrentes (não importa a ordem) 24
9. Códigos Concorrentes (WHEN, GENERATE) Os códigos paralelos em geral implementam circuitos lógicos combinacionais, onde a saída do circuito depende apenas da entrada atual Não importa a ordem em que os sinais são escritos, eles podem ser executados ao mesmo tempo (códigos concorrentes ou paralelos) WHEN-ELSE atribuição WHEN condição WHEN condição...; WITH-SELECT-WHEN WITH identificador SELECT atribuição WHEN valor, WHEN valor,...; ELSE ELSE Exemplo x <= a WHEN sel = 0 ELSE b WHEN sel = 1 ELSE c; Exemplo WITH sel SELECT x <= a WHEN 0, b WHEN 1, c WHEN OTHERS; 25
GENERATE label: FOR ident IN range GENETATE [declarações] BEGIN (atribuições concorrentes) END GENERATE [label] Exemplo Teste: FOR i IN 0 TO M GENERATE b(i) <= a(m-i); END GENERATE Teste 26
Exemplo Multiplexador 4x8 (4 entradas e 8 bits) Com WHEN simples: A B C D 8 0 1 2 3 sel 2 8 S LIBRARY ieee; USE ieee.std_logic_1164.all; ENTITY mux4 IS PORT (A,B,C,D: IN STD_LOGIC_VECTOR(7 DOWNTO 0); sel: IN INTEGER RANGE 0 TO 3; S: OUT STD_LOGIC_VECTOR (7 DOWNTO 0)); END mux4; ARCHITECTURE behavior OF mux4 IS BEGIN y <= a WHEN sel=0 ELSE b WHEN sel=1 ELSE c WHEN sel=2 ELSE d ; END behavior; 27
Exercício Criar um multiplexador 4xN (GENERIC) Com WHEN selecionado: A B C D N 0 1 2 3 sel 2 N S LIBRARY ieee; USE ieee.std_logic_1164.all; ENTITY mux1 IS GENERIC(); PORT (); END mux1; WITH sel SELECT x <= a WHEN 0, b WHEN 1, c WHEN OTHERS; ARCHITECTURE behavior OF mux1 IS BEGIN S <= END behavior; 28
Exercício Criar um decodificador 3x8 Com WHEN selecionado: ENTRADA A B C 0 1 2 0 1 2 3 4 5 6 7 SAÍDA O0 O1 O2 O3 O4 O5 O6 O7 WITH sel SELECT x <= a WHEN 0, b WHEN 1, c WHEN OTHERS; C B A 07 06 05 04 03 02 01 00 0 0 0 1 1 1 1 1 1 1 0 0 0 1 1 1 1 1 1 1 0 1 0 1 0 1 1 1 1 1 0 1 1 0 1 1 1 1 1 1 0 1 1 1 1 0 0 1 1 1 0 1 1 1 1 1 0 1 1 1 0 1 1 1 1 1 1 1 0 1 0 1 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 29
Tabela 1 Dispositivos FPGA da série DE. Nome da placa DE DE0-CV DE0-Nano DE0-Nano-SoC DE1-SoC DE10-Lite DE5a-NET DE2-115 Dispositivo FPGA Cyclone V 5CEBA4F23C7 Cyclone IV E EP4CE22F17C6 Cyclone V SoC 5CSEMA4U23C6 Cyclone V SoC 5CSEMA5F31C6 Max 10 10M50DAF484C7G Arria 10 10AX115N3F45E2SG Cyclone IV EP4CE115F29C7 30
Tabela 2 Atribuição da pinagem da série DE0-Nano. Componente DE0-Nano KEY[0] PIN_J15 KEY[1] PIN_E1 DIP Switch[0] PIN_M1 DIP Switch[1] PIN_T8 DIP Switch[2] PIN_B9 DIP Switch[3] PIN_M15 LED[0] PIN_A15 LED[1] PIN_A13 LED[2] PIN_B13 LED[3] PIN_A11 LED[4] PIN_D1 LED[5] PIN_F3 LED[6] PIN_B1 LED[7] PIN_L3 CLOCK 50MHz PIN_R8 31
Referências: Notas de aula do professor Volnei A. Pedroni PEDRONI, Volnei A. Circuit design and simulation with VHDL. MIT press, 2010. HAMBLEN, James O.; HALL, Tyson S.; FURMAN, Michael D. Rapid prototyping of digital systems: SOPC edition. Springer Science & Business Media, 2007. TOCCI, Ronald J.; WIDMER, Neal S.; MOSS, Gregory L. Sistemas digitais: princípios e aplicações. Prentice Hall, 2003. 32