Você está na página 1de 47

VHDL Quick Start

EA-078 - 2 Sem/2010 PED: Karlo Lenzi

Sumrio

Histrico Aspectos Gerais Descrio de Circuitos Entidade Arquitetura Classes Tipos Operadores

Atributos Vetores Processo Construes Concorrentes Construes Sequenciais Concorrente x Sequencial Projeto Estrutural Referncias

Histrico

Necessidade de linguagem de descrio de hardware padronizada Substituio dos esquemas eltricos Circuitos parametrizveis Melhorar documentao e anlise formal dos projetos Simulao

Histrico

Departamento de defesa americano solicita uma ferramenta de HDL (VHSIC) IBM e outras ganham o contrato Em 1985, os direitos autorais so transferidos para o IEEE Em 1987, aps reviso dos acadmicos, surge o padro IEEE 1076 (VHDL)

Exemplo - AND
ENTITY my_AND2 IS PORT ( i1, i2 : IN BIT; o1 : OUT BIT); END my_AND2; ARCHITECTURE bhv OF my_AND2 IS BEGIN o1 <= i1 AND i2; END bhv;

i1

i2

o1

My_AND2

Aspectos Gerais

dividido em duas partes:


Descrio da interface Descrio do comportamento Projeto estrutural e comportamental

Suporta mltiplos nveis de hierarquia

Declaraes concorrentes (execuo simultnea)

Aspectos Gerais

possvel definir regies sequenciais de cdigo (subprogramas e processos) Linguagem complexa: permite inmeras maneiras de modelar o comportamento de um mesmo circuito No CASE SENSITIVE Cometrios so precedidos por 2 traos (--)

Exemplo - Seletor
ENTITY mux IS PORT ( A, B, C, D : IN BIT; s1, s2: IN BIT; M : OUT BIT); END mux; ARCHITECTURE tst OF mux IS SIGNAL sel : BIT_VECTOR (1 DOWNTO 0); BEGIN sel <= s2 & s1; M <= A WHEN sel = 00 ELSE B WHEN sel = 01 ELSE C WHEN sel = 10 ELSE D; -- sel = 11 END tst;

Descrio de Circuitos

Cdigo VHDL dividido em 2 partes + biblioteca (*):


*Declarao das bibliotecas e pacotes utilizados Declarao da interface (entity): entradas e sadas do circuito Declarao do comportamento (architecture): descrio do modo de operao do circuito (relao entre interfaces)

Descrio de Circuitos
LIBRARY XXX; USE XXX.YYY.ALL; ENTITY entity_name IS PORT ( -- port declarations (specifies circuit interface) ); END entity_name ;

ARCHITECTURE project_type OF entity_name IS -- signals, components, constants, function, etc declarations BEGIN -- concurrent declarations (specifies circuit behavior) END project_type ;

Exemplo - Decodificador
ENTITY decoder IS PORT (code: IN BIT_VECTOR (0 TO 1); decode: OUT BIT_VECTOR (0 TO 3)); END decoder; ARCHITECTURE bhv OF decoder IS BEGIN WITH code SELECT decode <= 0001 WHEN 00, 0010 WHEN 01, 0100 WHEN 10, 1000 WHEN 11; END bhv ;

Entidade

Entidade: declara as entradas e sadas do circuito (interface) Pode ser utilizado parmetros* para o circuito descrita pelas seguintes palavras reservadas

ENTITY PORT IN, OUT, BUFFER, INOUT GENERIC (*)

Entidade
ENTITY adder1 IS PORT ( A, B, Cin : IN BIT; Sum, Cout: OUT BIT); END adder1;

Arquitetura

Descreve a relao entre entradas e sadas do circuito Define seu comportamento (aes) ou estrutura (conexes) Utiliza as seguintes palavras reservadas:

ARCHITECTURE BEGIN, END

Arquitetura
ARCHITECTURE comportamento OF nome_entidade IS
-- Declaraes de sinais internos -- Declarao de componentes -- Descrio de subprogramas locais -- Definio de novos tipos BEGIN -- Declarao de operaes concorrentes END comportamento;

Arquitetura

Somador: dois bits de entrada a serem somados, junto com um carry-in Gera dois bits de sada, um representando a soma e outro o carry-out

Arquitetura
ARCHITECTURE bhv OF adder1 IS BEGIN Sum <= Cin XOR (A XOR B); Cout <= (A AND B) OR (Cin AND (A XOR B)); END adder1 ;

Exemplo Somador 1 bit


ENTITY adder1 IS PORT ( A, B, Cin : IN BIT; Sum, Cout: OUT BIT); END adder1; ARCHITECTURE bhv OF adder1 IS BEGIN Sum <= Cin XOR (A XOR B); Cout <= (A AND B) OR (Cin AND (A XOR B)); END bhv;

Classes

Classes de objetos:

Constantes: CONSTANT Sinais (associados a um fator tempo): SIGNAL Variveis (somente em regies sequenciais): VARIABLE Arquivo: FILE

Atribuio de constantes e variveis feita pelo operador :=, enquanto sinais utilizam <= Sinais podem receber valores de variveis e constantes. Variveis no podem receber valores de sinais

Tipos

Fortemente tipada Permite a definio de novos tipos (TYPE IS) Tipos pr-estabelecidos:

BIT, BOOLEAN, CHARACTER INTEGER, REAL TIME BIT_VECTOR, STRING RECORD STD_LOGIC**, STD_LOGIC_VECTOR**

Tipos
ARCHITECTURE comportamento OF exemplo IS TYPE positivo IS INTEGER RANGE 0 TO 63; SIGNAL s1 : positivo; CONSTANT c1 : INTEGER := 2; CONSTANT pi : REAL := 3.1415e0; CONSTANT t1 : TIME := 1us; SIGNAL s2 : BIT_VECTOR (0 to 3) := x9; BEGIN s1 <= c1; END comportamento;

Operadores

Exemplo D Flip Flop


ENTITY dff IS PORT (d, clk, clr: IN BIT; q : OUT BIT); END dff; ARCHITECTURE bhv OF dff IS BEGIN main: PROCESS (clk, clr) BEGIN IF clr = 0 THEN q <= 0; ELSIF clk = 1 AND clkevent THEN q <= d; END IF; END PROCESS main; END bhv;

Atributos

Informaes adicionais associadas a tipos, objetos e unidades de projeto Operador aspas simples: objetoatributo Atributos pr-definidos para sinais

Event: h transio de valor (bordas) Stable: no h transio de valor Active: h uma nova atribuio de valor Quiet: no h uma nova atribuio de valor

Atributos

Atributos pr-definidos para vetores


HIGH LOW RIGHT LEFT LENGTH -- tamanho do vetor (ex. 8) RANGE -- faixa do vetor (ex. 0 TO 7)

Exemplo (detector de borda de subida) IF clk = 1 AND clkevent THEN ...

Vetores

VHDL pode descrever operaes vetoriais BIT_VECTOR, STD_LOGIC_VECTOR Operandos precisam ser do mesmo tamanho Podem ser com ou sem sinal Sinais de um vetor podem ser indexados por valores inteiros: s(1), s(2), etc Operador & usado para concatenar vetores

Vetores
-- signal s1, s2, s3 : std_logic_vector (0 to 19); S1 <= 0010 & xFF04; -- concatenao S2(2 to 6) <= s1 (0 to 3) & s(17); -- composio S2(1) <= S1(0); -- indexao S3 <= s1 + s2; -- operao vetorial

Exemplo Memria ROM


LIBRARY ieee; USE ieee.std_logic_1164.ALL;

ENTITY rom IS PORT ( oe : IN STD_LOGIC; addr : IN STD_LOGIC_VECTOR (3 DOWNTO 0); data : OUT STD_LOGIC_VECTOR (0 TO 7) ); END rom; ARCHITECTURE behavioral OF rom IS TYPE mem IS ARRAY ( 0 TO 2**4 - 1) OF STD_LOGIC_VECTOR (0 TO 7); CONSTANT my_Rom : mem := ( 0 => x00", 1 => x"01", 2 => x02", 3 => x03", 4 => x04", 5 => x05", 6 => x06", 7 => x"07", 8 => x08", 9 => x09", 10 => x0A", 11 => x"0B", 12 => x0C", 13 => x0D", 14 => x0E", 15 => x0F"); BEGIN data <= my_rom(conv_integer(addr)) WHEN oe = '1' ELSE "00000000"; END behavioral;

Processo

Regio de declaraes sequenciais iniciado a partir de uma lista de eventos (sensibilidade) Pode ser sensvel a vrios sinais, mas somente a uma nica borda Obs.: outras regies sequenciais - funes e procedimentos

Processo

Sinais internos ao processo no so visveis para as demais regies do cdigo Transferncia do valor para sinais em regio sequencial ocorre com atraso t Variveis so objetos exclusivos de regies sequenciais Utiliza as palavras reservadas

PROCESS BEGIN END PROCESS

Exemplo - Contador
ENTITY count IS PORT ( clk, rst : IN BIT; cnt : OUT INTEGER); END count ; ARCHITECTURE bhv OF counter IS BEGIN abc: PROCESS (clk, rst) VARIABLE counter : INTEGER 0 to 127 := 0; BEGIN IF rst = 1 THEN counter := 0; ELSIF clk = 1 AND clkevent THEN counter := counter + 1; END IF; cnt <= counter; END PROCESS abc; END bhv;

Construes Concorrentes

Transferncia condicional com prioridade

s0 <= i0 OR i1 WHEN sel = 0 ELSE i1 WHEN sel = 1 OR sel = 2 ELSE i2;

Construes Concorrentes

Transferncia condicional sem prioridade

WITH counter SELECT s1 <= i1 WHEN 0, i3 OR i4 WHEN 1, 5 WHEN 2 | 3 | 4, i6 WHEN 5 to 9, i7 WHEN OTHERS;

Construes Concorrentes

Outras:

BLOCK GENERATE

Exemplo Memria RAM


LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.all; USE IEEE.Numeric_Std.all;

ENTITY sync_single_port_ram IS PORT ( clk, we : IN STD_LOGIC; addr : IN STD_LOGIC_VECTOR (3 DOWNTO 0); data : INOUT STD_LOGIC_VECTOR (7 DOWNTO 0)); END sync_single_port_ram;
ARCHITECTURE bhv OF sync_single_port_ram IS TYPE ram IS ARRAY (0 TO (2**addr'length)-1) OF STD_LOGIC_VECTOR (data'range); SIGNAL my_ram : ram;

Exemplo Memria RAM


BEGIN main: PROCESS (clk) BEGIN IF rising_edge(clk) THEN IF we = '1' THEN my_ram(conv_integer(addr )) <= data; ELSE data <= my_ram(conv_integer(addr )); END IF ; END IF ; END PROCESS main; END bhv;

Construes Sequenciais

Transferncia condicional com prioridade

IF counter = 2 THEN s1 <= 0; s2 <= 0; ELSIF (i3 /= i4) THEN s1 <= 1; s3 <= 0; ELSE s2 <= 1; END IF;

Construes Sequenciais

Transferncia condicional sem prioridade

CASE counter IS WHEN 0 => s1 <= 1; s2 <= 0; WHEN 1 => s1 <= i1 XOR i2; WHEN 2 | 3 => s1 <= 0; s2 <= s3 AND s4; WHEN 4 to 9 => s1 <= i5 i6; WHEN OTHERS => s1 <= i7*i8; END CASE;

Construes Sequenciais

Outras

WHILE LOOP FOR LOOP

Construes Concorrentes x Sequenciais

Construes concorrentes permitem a execuo de apenas uma declarao, enquanto as sequenciais permitem vrias WHEN ELSE e WITH SELECT somente em regio de cdigo concorrente IF ELSE e CASE WHEN somente em regio de cdigo sequencial

Exemplo Mquina de Estados


Projeto de um cadeado digital Usurio deve entrar com 3 dgitos de senha para destravar o cadeado A senha fixa e faz parte do circuito do cadeado digital

Key1 = NOk Lock = On

S1
Key3 = NOk / Lock = On Key1 = Ok / Lock = On Key2 = NOk / Lock = On Key3 = Ok / Lock = Off

S2

Key2 = Ok / Lock = On

S3

Exemplo Mquina de Estados


LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.all; ENTITY locker IS PORT ( clk, rst, en : IN STD_LOGIC; key: IN STD_LOGIC_VECTOR (3 DOWNTO 0); lock : OUT STD_LOGIC); END locker;

ARCHITECTURE bhv OF locker IS TYPE state_type IS (s1, s2, s3); SIGNAL state_reg, state_next : state_type := s1; SIGNAL digit : STD_LOGIC_VECTOR (3 downto 0) := x"0"; CONSTANT password : STD_LOGIC_VECTOR (11 downto 0) := x"95A"; BEGIN

Exemplo Mquina de Estados


state: PROCESS (clk, rst) BEGIN IF rst = '1' THEN state_reg <= s1; ELSIF rising_edge(clk) THEN state_reg <= state_next; END IF; END PROCESS state; input: PROCESS (clk, rst, en) BEGIN IF rst = '1' THEN digit <= (OTHERS => '0'); ELSIF rising_edge(clk) THEN IF en = '1' THEN digit <= key; END IF; END IF; END PROCESS input; fsm: PROCESS (digit) BEGIN CASE state_reg IS WHEN s1 => IF (digit = password(11 DOWNTO 8)) THEN lock <= '1'; 'state_next <= s2; ELSE lock <= '1'; state_next <= s1; END IF; WHEN s2 => IF (digit = password(7 DOWNTO 4)) THEN lock <= '1'; state_next <= s3; ELSE lock <= '1'; state_next <= s1; END IF; WHEN s3 => IF (digit = password(3 DOWNTO 0)) THEN lock <= '0'; state_next <= s1; ELSE lock <= '1'; state_next <= s1; END IF; END CASE; END PROCESS fsm; END bhv;

Projeto Estrutural

Descreve apenas conexes entre componentes do projeto No possui nenhuma descrio de comportamento Permite criar uma estrutura hierrquica de projeto Descrio Top-down

Exemplo Somador 4 bits


LIBRARY ieee; USE ieee.std_logic_1164.all;
ENTITY adder4 IS PORT( A, B: IN STD_LOGIC_VECTOR (3 DOWNTO 0); Cin : IN STD_LOGIC; Sum: OUT STD_LOGIC_VECTOR (3 DOWNTO 0); Cout: OUT STD_LOGIC); END adder4 ; ARCHITECTURE structural OF adder4 IS SIGNAL c: STD_LOGIC_VECTOR (4 DOWNTO 0); COMPONENT adder1 port(A, B, Cin: IN STD_LOGIC; Sum, Cout: OUT STD_LOGIC); END COMPONENT;

Exemplo Somador 4 bits


BEGIN FA0: adder1 PORT MAP (a(0), b(0), Cin, sum(0), c(1)); FA1: adder1 PORT MAP (a(1), b(1), C(1), sum(1),c(2)); FA2: adder1 PORT MAP (a(2), b(2), C(2), sum(2),c(3)); FA3: adder1 PORT MAP (a(3), b(3), C(3), sum(3),c(4)); Cout <= c(4); END structural;

Referncias

Roberto DAmore, VHDL Descrio e Sntese de Circuitos Digitais, ed. LTC, 2005. Peter J. Ashenden, VHDL Quick Start, @ http://www.ashenden.com.au/designersguide/VHDL-quick-start.pdf. Acessado em 26/07/2010. Weijun Zhang, VHDL Tutorial: Learn by examples @ http://esd.cs.ucr.edu/labs/tutorial/. Acessado em 26/07/2010.