i n t r o d u ç ã o a o v h d l epusp – ptc2527 2010 guido stolfi 1
TRANSCRIPT
Introdução ao
V H D LEPUSP – PTC2527
2010Guido Stolfi
1
.. . . . ... . .. ... . .... . . . .
. . . . . ... . .. .. . . .
. . . ..... . .. . . .
. .. . . .. .. .. .. .
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
2
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 3
Descrição de um Circuito
• Abordagens e Níveis de Abstração
Estru
tura
l
Comportamental
FísicaCélulas
Módulos
Chips
Subsistemas
Algo
ritm
osRT
L
Funç
ões L
ógica
sFu
nc.
Tran
sfer
ência
Processadores
Registradores
PortasTransistores
4
Descrição Estrutural por Esquema
5
Qual a função deste circuito?
Qual a resposta a um conjunto deestímulos?
Como modificá-lopara alterar suafunção?
Tem algum erro?
Descrição Estrutural por V H D L
-- declaração:
ENTITY circuito_1 ISPORT( 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
6
V H D L x Programa
Programa• Software, Firmware
• Algoritmos• Passos Sequenciais• Execução síncrona
V H D L• Código
• Operações Concorrentes• Paralelismo• Execução assíncrona ou
síncrona
7
Simulação de um Circuito
8
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;
9
A
B
C
Q ? ? ? ? ?
R ? ? ? ? ?
Simulação VHDL T = 0 ns
10
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;
Atribuição gera novo evento para a variável Q num instante futuro:
Q <= ‘1’;
Sinais A e B mudaram e afetam uma atribuição
Simulação VHDL T = 0 ns
11
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 ISBEGIN
Q <= NOT ( A AND B ) AFTER 5ns; R <= C AND Q ;END arq_circ_1;
Novo evento para a variável Q é inserido na lista de eventos
Implícito
Simulação VHDL T = 0 ns
12
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 ISBEGIN Q <= NOT ( A AND B );
R <= C AND Q AFTER 5ns;
END arq_circ_1;
Novo evento para a variável R é inserido na lista de eventos
Implícito
Simulação VHDL T = 5 ns
13
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 ISBEGIN Q <= NOT ( A AND B );
R <= C AND Q AFTER 5ns;
END arq_circ_1;
Novo evento para a variável R é inserido na lista de eventos
Implícito
Simulação VHDL T = 10 ns
14
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 ISBEGIN 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
15
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 ISBEGIN 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
16
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
17
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)
18
False True
False False False
True False True
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)
19
0 1
0 0 0
1 0 1
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
20
X 0 1 Z W L H -
X X 0 X X X 0 X X
0 0 0 0 0 0 0 0 0
1 X 0 1 X X 0 1 X
Z X 0 X X X 0 X X
W X 0 X X X 0 X X
L 0 0 0 0 0 0 0 0
H X 0 1 X X 0 1 X
- X 0 X X X 0 X X
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)
21
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;
22
Tipos de Dados em VHDL
-- outros tipos pré definidos:
TYPE INTEGER IS RANGE -2147483648 TO +2147483647;
TYPE NATURAL 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;
23
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órioBEGINIF A = ‘0’ THEN
Q <= B;ELSE
Q <= NOT B; -- implementa XOREND IF;
END PROCESS;
24
Lógica Sequencial com Processos
• Lista de sensibilidade inclui um Clock
PROCESS (CLK) -- processo sequencial (contador)BEGINIF CLK’EVENT AND CLK = ‘1’ THEN -- borda de subida Q <= Q + 1; -- precisa de ieee.std_logic_arith.allEND IF;
END PROCESS;
PROCESS (CLK) -- registrador de deslocamentoBEGINIF CLK’EVENT AND CLK = ‘0’ THEN -- borda de descida Q (7 DOWNTO 1) <= Q (6 DOWNTO 0); Q (0) <= D;END IF;
END PROCESS;
25
Lógica Sequencial
PROCESS (CLK, RST) -- contador c/ reset assíncronoBEGIN IF RST = ‘1’ THEN -- reset
Q <= “00000000”; -- zera 8 bits
ELSE IF CLK’EVENT AND CLK = ‘1’ THEN
IF Q = 191 THENQ <= (OTHERS => ‘0’); -- zera 8
bits ELSE
Q <= Q + 1; -- conta de 0 a 191 END IF; END IF; -- fim evento CLK
END IF; -- fim RSTEND PROCESS;
26
Exemplo Não Sintetizável
PROCESS (CLK) -- contador nas duas bordas do clock !BEGINIF 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.
27
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
28
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 processoEND delay_2000;
29
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 ISBEGINPROCESS (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 ; 30
CASE ... WHEN
-- multiplexador de barramentos usando CASEENTITY 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 ISBEGINPROCESS (A, B, SEL) -- logica combinatoria BEGIN CASE SEL IS WHEN “00” => X <= A; WHEN “01” => X <= B; WHEN OTHERS => X <= “000000000000”; END CASE; END PROCESS;END arquit;
31
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;--------------------------------------------------------------------------------
32
Exemplo architecture Behavioral of fec_3 issignal DEL : std_logic_vector(5 downto 0); -- Shift Registersignal B3 : std_logic; -- temporary bitsignal BITCNT : std_logic_vector(2 downto 0); -- counts input bits
begin-------------------------------------------------------------------------
process (CLK,BITIN,DEL)variable OX : std_logic; -- output bitsvariable OY : std_logic;
begin
OX := BITIN xor ((DEL(5) xor DEL(4)) xor (DEL(3) xor DEL(0))); -- FECOY := 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;-- --------------------------------------------------------------------
33
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;
34
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;-- --------------------------------------------------------------------
35
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;
-- --------------------------------------------------------------------
36
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; 37
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 rateend if; -- end clock eventend process;--------------------------------------------------------------------------------
end Behavioral;
38
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); -- posicionalblk002: delay_2000 PORT MAP ( TRIG => D, TRIGDEL => Q, CLOCK => CLK); -- nominal
39