390 likes | 581 Views
.. . . . ... . .. . .. . .... . . . . . . . . . ... . . . .. . . . . . . . .... . .. . . . . .. . . . . .. .. .. . I n t r o d u ç ã o a o V H D L. EPUSP – PTC2527 2010 Guido Stolfi. V H D L. VHDL = VHSIC Hardware Description Language
E N D
.. . . . ... . .. . .. . .... . . . . . . . . . ... . . . .. . . . . . . . .... . .. . . . . .. . . . . .. .. .. . Introdução aoV H D L EPUSP – PTC2527 2010 Guido Stolfi
V H D L • VHDL = VHSIC Hardware Description Language • VHSIC = Very High Speed Integrated Circuits • Departamento de Defesa –EUA – 1985 • IEEE 1076-1987 • IEEE 1076-1993 • IEEE 1164
V H D L • Objetivos: • Simulação • Descrição de Funcionamento • Síntese Lógica • FPGA’s , EPLD’s, ASIC’s • Independente de Tecnologia • Vários níveis de abstração • Alternativa: Verilog
Descrição de um Circuito • Abordagens e Níveis de Abstração Estrutural Processadores Registradores Portas Transistores Comportamental Algoritmos RTL Funções Lógicas Func. Transferência Células Módulos Chips Subsistemas Física
Descrição Estrutural por Esquema Qual a função deste circuito? Qual a resposta a um conjunto de estímulos? Como modificá-lo para alterar sua função? Tem algum erro?
Descrição Estrutural por V H D L -- declaração: ENTITY circuito_1 IS PORT( A, B, C : IN BIT; R : OUT BIT; Q : INOUT BIT ); END circuito_1; -- descrição comportamental: ARCHITECTURE arq_circ_1 OF circuito_1 IS BEGIN Q <= NOT ( A AND B ); R <= C AND Q ; END arq_circ_1; -- fim da descrição
V H D L x Programa Programa V H D L Código Operações Concorrentes Paralelismo Execução assíncrona ou síncrona • Software, Firmware • Algoritmos • Passos Sequenciais • Execução síncrona
Simulação de um Circuito A B C Q ? ? ? ? ? R ? ? ? ? ?
Simulação VHDL -- descrição das entradas: BEGIN A <= ‘0’; B <= ‘0’; C <= ‘1’; WAIT 50 ns; A <= ‘1’; WAIT 50 ns; B <= ‘1’; WAIT 50 ns; C <= ‘0’; WAIT 50 ns; A <= ‘0’; B <= ‘0’; END; A B C Q ? ? ? ? ? R ? ? ? ? ?
Simulação VHDL T = 0 ns A <= ‘0’; B <= ‘0’; C <= ‘1’; WAIT 50 ns; A <= ‘1’; WAIT 50 ns; B <= ‘1’; WAIT 50 ns; C <= ‘0’; WAIT 50 ns; A <= ‘0’; B <= ‘0’; -- descrição comportamental: ARCHITECTURE arq_circ_1 OF circuito_1 IS BEGIN Q <= NOT ( A AND B ); R <= C AND Q ; END arq_circ_1; Sinais A e B mudaram e afetam uma atribuição Atribuição gera novo evento para a variável Q num instante futuro: Q <= ‘1’;
Simulação VHDL T = 0 ns A <= ‘0’; B <= ‘0’; C <= ‘1’; WAIT 5 ns; Q <= ‘1’; WAIT 45 ns; A <= ‘1’; WAIT 50 ns; B <= ‘1’; WAIT 50 ns; C <= ‘0’; WAIT 50 ns; A <= ‘0’; B <= ‘0’; -- descrição comportamental: ARCHITECTURE arq_circ_1 OF circuito_1 IS BEGIN Q <= NOT ( A AND B ) AFTER 5ns; R <= C AND Q ; END arq_circ_1; Implícito Novo evento para a variável Q é inserido na lista de eventos
Simulação VHDL T = 0 ns A <= ‘0’; B <= ‘0’; C <= ‘1’; WAIT 5 ns; Q <= ‘1’; R <= ‘X’; WAIT 45 ns; A <= ‘1’; WAIT 50 ns; B <= ‘1’; WAIT 50 ns; C <= ‘0’; WAIT 50 ns; A <= ‘0’; B <= ‘0’; -- descrição comportamental: ARCHITECTURE arq_circ_1 OF circuito_1 IS BEGIN Q <= NOT ( A AND B ); R <= C AND Q AFTER 5ns; END arq_circ_1; Implícito Novo evento para a variável R é inserido na lista de eventos
Simulação VHDL T = 5 ns A <= ‘0’; B <= ‘0’; C <= ‘1’; WAIT 5 ns; Q <= ‘1’; R <= ‘X’; WAIT 5 ns; R <= ‘1’; WAIT 40 ns; A <= ‘1’; WAIT 50 ns; B <= ‘1’; WAIT 50 ns; C <= ‘0’; WAIT 50 ns; A <= ‘0’; B <= ‘0’; -- descrição comportamental: ARCHITECTURE arq_circ_1 OF circuito_1 IS BEGIN Q <= NOT ( A AND B ); R <= C AND Q AFTER 5ns; END arq_circ_1; Implícito Novo evento para a variável R é inserido na lista de eventos
Simulação VHDL T = 10 ns A <= ‘0’; B <= ‘0’; C <= ‘1’; WAIT 5 ns; Q <= ‘1’; R <= ‘X’; WAIT 5 ns; R <= ‘1’; WAIT 40 ns; A <= ‘1’; WAIT 50 ns; B <= ‘1’; WAIT 50 ns; C <= ‘0’; WAIT 50 ns; A <= ‘0’; B <= ‘0’; -- descrição comportamental: ARCHITECTURE arq_circ_1 OF circuito_1 IS BEGIN Q <= NOT ( A AND B ); R <= C AND Q; END arq_circ_1; A variável de saída R não causa nenhum evento (não é entrada do circuito)
Simulação VHDL T = 50 ns A <= ‘0’; B <= ‘0’; C <= ‘1’; WAIT 5 ns; Q <= ‘1’; R <= ‘X’; WAIT 5 ns; R <= ‘1’; WAIT 40 ns; A <= ‘1’; WAIT 5 ns; Q <= ‘1’; WAIT 45 ns; B <= ‘1’; WAIT 50 ns; C <= ‘0’; WAIT 50 ns; A <= ‘0’; B <= ‘0’; -- descrição comportamental: ARCHITECTURE arq_circ_1 OF circuito_1 IS BEGIN Q <= NOT ( A AND B ); R <= C AND Q; END arq_circ_1; Novo evento para a variável Q poderia ser inserido na lista de eventos, mas é redundadnte (não há alteração no estado de Q)
Simulação VHDL T = 100 ns A <= ‘0’; B <= ‘0’; C <= ‘1’; WAIT 5 ns; Q <= ‘1’; R <= ‘X’; WAIT 5 ns; R <= ‘1’; WAIT 40 ns; A <= ‘1’; WAIT 50 ns; B <= ‘1’; WAIT 5 ns; Q <= ‘0’; WAIT 45 ns; C <= ‘0’; WAIT 50 ns; A <= ‘0’; B <= ‘0’; -- descrição comportamental: ARCHITECTURE arq_circ_1 OF circuito_1 IS BEGIN Q <= NOT ( A AND B ); R <= C AND Q; END arq_circ_1; Novo evento para a variável Q é inserido na lista de eventos etc...
Simulação VHDL T = 300 ns BEGIN A <= ‘0’; B <= ‘0’; C <= ‘1’; WAIT 5 ns; Q <= ‘1’; R <= ‘X’; WAIT 5 ns; R <= ‘1’; WAIT 40 ns; A <= ‘1’; WAIT 50 ns; B <= ‘1’; WAIT 5 ns; Q <= ‘0’; WAIT 5 ns; R <= ‘0’; WAIT 40 ns; C <= ‘0’; WAIT 50 ns; A <= ‘0’; B <= ‘0’; WAIT 5 ns; Q <= ‘1’; END; A B C Q R
Tipos de Dados em VHDL • BOOLEAN : pode ser ‘False’ ou ‘True’ • Funções pré-definidas: • and, or, nand, nor, xor, xnor, not (retornam BOOLEAN) • =, /=, <, >, <=, >= (retornam BOOLEAN) Ex.: Função AND
Tipos de Dados em VHDL • BIT : pode ser ‘0’ ou ‘1’ • Funções pré-definidas: • and, or, nand, nor, xor, xnor, not (retornam BIT) • =, /=, <, >, <=, >= (retornam BOOLEAN) Ex.: Função AND
Tipos de Dados em VHDL • STD_LOGIC ( IEEE1164): • ‘X’ = Desconhecido • ‘0’ = Força Nível 0 • ‘1’ = Força Nível 1 • ‘Z’ = Alta Impedância • ‘W’ = Desconhecido Fraco • ‘L’ = Nível 0 Fraco • ‘H’ = Nível 1 Fraco • ‘-’ = Indiferente Ex.: Função AND
Tipos de Dados em VHDL • INTEGER: Depende de implementação; p. ex. 32 bits • Funções pré-definidas: • +, -, abs, *, /, mod, rem, ** (retornam INTEGER) • =, /=, <, >, <=, >= (retornam BOOLEAN)
Tipos de Dados em VHDL LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; -- std_logic USE IEEE.STD_LOGIC_ARITH.ALL; -- numeros e funções ENTITY circuito_2 IS-- exemplos: PORT ( A, B : IN STD_LOGIC; -- entradas -- barramentos: Q : OUT STD_LOGIC_VECTOR (7 DOWNTO 0); P : BUFFER STD_LOGIC_VECTOR (1 TO 5)); END circuito2;
Tipos de Dados em VHDL -- outros tipos pré definidos: TYPE integer is range -2147483648 to +2147483647; typeNAtural is range 0 to +2147483647; -- exemplos de tipos definidos pelo usuario: TYPE uint_6 IS RANGE 0 TO 63; TYPE estado_mp IS (play, pause, ff, ref, rec, stop); TYPE vetor8 IS ARRAY (7 DOWNTO 0) OF STD_LOGIC; TYPE matriz8 IS ARRAY (7 DOWNTO 0) OF vetor8;
Processos • Blocos de código contendo IF, WAIT, CASE, LOOP e lista de sensibilidade • São executados quando um dos sinais da lista sofre alteração de estado. PROCESS (A, B) -- processo combinatório BEGIN IF A = ‘0’ THEN Q <= B; ELSE Q <= NOT B; -- implementa XOR END IF; END PROCESS;
Lógica Sequencial com Processos • Lista de sensibilidade inclui um Clock PROCESS (CLK) -- processo sequencial (contador) BEGIN IF CLK’EVENT AND CLK = ‘1’ THEN -- borda de subida Q <= Q + 1; -- precisa de ieee.std_logic_arith.all END IF; END PROCESS; PROCESS (CLK) -- registrador de deslocamento BEGIN IF CLK’EVENT AND CLK = ‘0’ THEN -- borda de descida Q (7 DOWNTO 1) <= Q (6 DOWNTO 0); Q (0) <= D; END IF; END PROCESS;
Lógica Sequencial PROCESS (CLK, RST) -- contador c/ reset assíncrono BEGIN IF RST = ‘1’ THEN -- reset Q <= “00000000”; -- zera 8 bits ELSE IF CLK’EVENT AND CLK = ‘1’ THEN IF Q = 191 THEN Q <= (OTHERS => ‘0’); -- zera 8 bits ELSE Q <= Q + 1; -- conta de 0 a 191 END IF; END IF; -- fim evento CLK END IF; -- fim RST END PROCESS;
Exemplo Não Sintetizável PROCESS (CLK) -- contador nas duas bordas do clock ! BEGIN IF CLK’EVENT THEN -- a sintaxe do VHDL permite... Q <= Q + 1; -- pode ser simulado... END IF; -- mas não é implementável c/ flip-flops! END PROCESS; --- Problema: Implementar um contador que conta nas duas bordas do Clock. CLK Q 0 1 2 3 4 5 ...
Sinais e Variáveis • SIGNAL: • Pode ser declarado em uma ENTITY ou ARCHITECTURE • Representa um sinal elétrico (fio, barramento, registrador) • Disponível após a conclusão de um PROCESS • VARIABLE: • Declarado apenas dentro de um PROCESS • Representa um valor ou informação de uso local • Valor disponível imediatamente • Não é passado para fora do PROCESS
Sinais ENTITY delay_2000 IS PORT ( D, CLK : IN STD_LOGIC; Q : OUT STD_LOGIC); END delay_2000; -- atrasador de 2000 amostras ARCHITECTURE delay_2000 OF delay_2000 IS SIGNAL REG : STD_LOGIC_VECTOR (1999 DOWNTO 0); BEGIN PROCESS (CLK) -- registrador de deslocamento BEGIN IF CLK’EVENT AND CLK = ‘0’ THEN -- shifta na descida REG (0) <= D; REG (1999 DOWNTO 1) <= REG (1998 DOWNTO 0); END IF; END PROCESS; Q <= REG(1999); -- atribuição fora do processo END delay_2000;
Variáveis ENTITY count_1080 IS PORT ( R, CLK : IN STD_LOGIC; LINHA : OUT STD_LOGIC_VECTOR(10 downto 0)); END count_1080; -- contador de linhas HDTV ARCHITECTURE arquit OF count_1080 IS BEGIN PROCESS (CLK) -- contador up 0 a 1079 VARIABLE reg : INTEGER RANGE 0 to 2047; BEGIN IF R = ‘1’ THEN reg := 0; ELSIF CLK’EVENT AND CLK = ‘0’ THEN reg := reg + 1; IF reg = 1080 THEN reg := 0; END IF; END IF; LINHA <= reg; END PROCESS; END arquit ;
CASE ... WHEN -- multiplexador de barramentos usando CASE ENTITY mux2_12b IS PORT( SEL : IN STD_LOGIC_VECTOR(1 downto 0); A, B : IN STD_LOGIC_VECTOR(11 downto 0); X : OUT STD_LOGIC_VECTOR(11 downto 0)); END mux2_12b; -- seleciona 2 barramentos de 10 b ARCHITECTURE arquit OF mux2_12b IS BEGIN PROCESS (A, B, SEL) -- logicacombinatoria BEGIN CASE SEL IS WHEN “00” => X <= A; WHEN “01” => X <= B; WHEN OTHERS => X <= “000000000000”; END CASE; END PROCESS; END arquit;
Exemplo -- Laboratorio de TV Digital – Mackenzie -- Eng. Guido Stolfi - 25/05/2007 -- Projeto: ISDTV MOD -------------------------------------------------------------------------------- -- Modulo: fec_3.VHD -- Descricao: Generates FEC for ISDB-T -- Frame Sync resets puncturing pattern -- Rev. 2.0 14/11/07 - FS input on first bit -- Slices: 49 FF´s: 19 LUT´s: 72 -------------------------------------------------------------------------------- library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_ARITH.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; entity fec_3 is Port ( CLK : in std_logic; -- bit clock (32 MHz) RST : in std_logic; -- Frame Sync (1 pulse) BITIN : in std_logic; -- serial bit input ENA : in std_logic; -- enables FEC RATE : in std_logic_vector(2 downto 0); -- 1/2, 2/3, 3/4, 5/6, 7/8 B0 : out std_logic; -- output bit b0, b1 B1 : out std_logic; ENAOUT : out std_logic; -- enables output (XY) symbol RSTOUT : out std_logic); -- delayed reset (1 pulse) end fec_3; --------------------------------------------------------------------------------
Exemplo architecture Behavioral of fec_3 is signal DEL : std_logic_vector(5 downto 0); -- Shift Register signal B3 : std_logic; -- temporary bit signal BITCNT : std_logic_vector(2 downto 0); -- counts input bits begin ------------------------------------------------------------------------- process (CLK,BITIN,DEL) variable OX : std_logic; -- output bits variable OY : std_logic; begin OX := BITIN xor ((DEL(5) xor DEL(4)) xor (DEL(3) xor DEL(0))); -- FEC OY := BITIN xor ((DEL(4) xor DEL(3)) xor (DEL(1) xor DEL(0))); if CLK'event and CLK = '1' then RSTOUT <= RST; if ENA = '1' then -- register shifting DEL(4 downto 0) <= DEL(5 downto 1); DEL(5) <= BITIN; end if; -- --------------------------------------------------------------------
Exemplo if RATE = "000" and ENA = '1' then -- rate 1/2 ,no reset BITCNT <= "000"; B0 <= OX; B1 <= OY; ENAOUT <= ENA; -- -------------------------------------------------------------------- elsif RATE = "001" and ENA = '1' then -- 2/3 (4/6) if BITCNT = "011" or RST = '1' then -- pattern: 0-1-2-3- 0 BITCNT <= "000"; else BITCNT <= BITCNT + 1; end if; if BITCNT = "011" then B0 <= OX; B1 <= OY; ENAOUT <= ENA; elsif BITCNT = "000" then B3 <= OY; -- stores bit ENAOUT <= '0'; elsif BITCNT = "001" then B0 <= B3; B1 <= OX; B3 <= OY; -- stores bit ENAOUT <= ENA; else B0 <= B3; B1 <= OY; ENAOUT <= ENA; end if;
Exemplo elsif RATE = "010" and ENA = '1' then -- 3/4 if BITCNT = "010" or RST = '1' then -- pattern: 0-1-2- 0 BITCNT <= "000"; else BITCNT <= BITCNT + 1; end if; if BITCNT = "010" then B0 <= OX; B1 <= OY; ENAOUT <= ENA; elsif BITCNT = "000" then B0 <= OY; ENAOUT <= '0'; else B1 <= OX; ENAOUT <= ENA; end if; -- --------------------------------------------------------------------
Exemplo elsif RATE = "011" and ENA = '1' then -- 5/6 if BITCNT = "100" or RST = '1' then -- patern: 0-1-2-3-4- 0 BITCNT <= "000"; else BITCNT <= BITCNT + 1; end if; if BITCNT = "100" then B0 <= OX; B1 <= OY; ENAOUT <= ENA; elsif BITCNT = "000" then B0 <= OY; ENAOUT <= '0'; elsif BITCNT = "001" then B1 <= OX; ENAOUT <= ENA; elsif BITCNT = "010" then B0 <= OY; ENAOUT <= '0'; else B1 <= OX; ENAOUT <= ENA; end if; -- --------------------------------------------------------------------
Exemplo elsif RATE = "100" and ENA = '1' then -- 7/8 if BITCNT = "110" or RST = '1' then -- pattern: 0-1-2-3-4-5-6- 0 BITCNT <= "000"; else BITCNT <= BITCNT + 1; end if; if BITCNT = "110" then B0 <= OX; B1 <= OY; ENAOUT <= ENA; elsif BITCNT = "000" then B3 <= OY; -- stores bit ENAOUT <= '0'; elsif BITCNT = "001" then B0 <= B3; B1 <= OY; ENAOUT <= ENA; elsif BITCNT = "010" then B0 <= OY; ENAOUT <= '0'; elsif BITCNT = "011" then B1 <= OX; ENAOUT <= ENA; elsif BITCNT = "100" then B0 <= OY; ENAOUT <= '0'; else B1 <= OX; ENAOUT <= ENA; end if;
Exemplo -- -------------------------------------------------------------------- elsif ENA = '1' then -- no FEC (1/1) Hypotetic if BITCNT = "001" or RST = '1' then -- pattern: 0-1- 0 BITCNT <= "000"; else BITCNT <= BITCNT + 1; end if; if BITCNT = "001" then B0 <= BITIN; ENAOUT <= '0'; else B1 <= BITIN; ENAOUT <= ENA; end if; -- -------------------------------------------------------------------- else -- ENA = 0 ENAOUT <= '0'; end if; -- end rate end if; -- end clock event end process; -------------------------------------------------------------------------------- end Behavioral;
Uso de Componentes --- declaração de componentes (descritos em outro lugar): COMPONENT count_1080 IS PORT ( R, CLK : IN STD_LOGIC; LINHA : OUT STD_LOGIC_VECTOR(10 downto 0)); END COMPONENT; -- contador de linhas HDTV COMPONENT delay_2000 IS PORT ( D, CLK : IN STD_LOGIC; Q : OUT STD_LOGIC); END COMPONENT; -- atrasador de 2000 amostras --------- -- CLOCK, TRIG : IN STD_LOGIC; LINEOUT: OUT STD_LOGIC_VECTOR(10 downto 0); -- SIGNAL TRIGDEL : STD_LOGIC; --- uso dos componentes declarados: blk001: count_1080 PORT MAP ( TRIGDEL, CLOCK, LINEOUT); -- posicional blk002: delay_2000 PORT MAP ( TRIG => D, TRIGDEL => Q, CLOCK => CLK); -- nominal