Anda di halaman 1dari 43

VHDL - VHSIC Hardware Description Language

Aula 2 Semntica de VHDL


Leonardo Augusto Casillo Ivan Saraiva Silva 2003-2

Identificadores
q Usados

como referncia a todos os objetos declarados no cdigo. q Regras: Primeiro caractere deve ser uma letra (Obrigatrio);
Ex: Teste, Teste123 No so CASE-SENSITIVE (maisculas/minsculas); o Ex: Teste = teste = TESTE No possvel o uso de palavras reservadas com outras finalidades; o Ex: mux, and
o

Identificadores

q Regras: So permitidos apenas letras, nmeros e underscore( _ ) ltimo caractere no pode ser underscore; o Ex: Teste_ No so permitidos 2 underscores em seqncia; o Ex: Teste__projeto Nomes com underscore so diferentes de nome sem underscore. o Ex: teste_projeto testeprojeto

Objetos de dados
q q q

Usados para representar e armazenar dados; Trs tipos bsicos: constantes, sinais e variveis; Cada objeto possui um tipo de dados especfico e um conjunto de possveis valores; Objetos de dados de tipos diferentes no podem ser atribudos um ao outro. Ex: somar 101(Bit) e 011(Std_logic). Quando um valor especificado(atribuio de um valor a um sinal ou varivel ou um valor transferido como parmetro para um subprograma), este valor representado na forma de um literal.

Constantes
q q

Assumem apenas um valor em todo o cdigo. Declarao: constant <identificador>: <tipo> := <valor>
Ex: constant errado : boolean := False; Ex: constant parte_ram : bit_vector(3 downto 0) := 1110; Podem ser declaradas em qualquer parte do cdigo:

Constante com valor global:

Package (uso mais freqente) entity, architecture, process, function

Somente no contexto em que foi declarada:

Sinais
q q

Representam ligaes entre elementos (aula anterior) Declarao:

signal <identificador>: <tipo> [:= valor];

Podem ser declaradas:

Globalmente:
package

Internamente:
entity, architecture (mais utilizado)

Variveis
Utilizados para armazenar valores intermedirios entre expresses; Atribuio imediata; Declarao:

variable <identificador>: <tipo> [:= valor];


Podem ser declaradas apenas em processos (variveis locais); Podem corresponder a registradores (processos sem temporizao) ou no (processos com temporizao);

FPGA & VHDL

Literais
Valores de dados especficos usados como parmetros de objetos ou dentro de expresses. No representam tipos especficos: Ex: '1' pode representar um bit ou um caractere. So vlidos dependendo do tipo: Ex: '$' vlido como um caractere mas no como bit.

Literais
Podem ser representados pelas seguintes categorias: Character Literals: um caracter ASCII (a, z). String Literals: seqncia de caracteres ASCII (texto) Bit String Literals: formas especiais de string literals para representar valores das bases binria, octal e hexadecimal.
B100100 O446 XA0F4B51

Vlidos para bit_vector e std_logic_vector

Literais
Numeric Literals: Integer Literals (Ex: 1) e Real Literals (Ex: 1.1)
Nmeros reais no so sintetizveis.

Based Literals: idntico a numeric literals, mas utilizando bases binria, octal e hexadecimal.
Ex: 2#101#, 16#FC9#, 2#1.0#E10#

Physical Literals: grandeza fsica. Contm parte numrica e unidade.


Podem representar tempo, velocidade, distncia etc Ex: 300 s, 40 m

Tipos de dados
So divididos em 4 classes:

Tipos escalares (representam um nico valor); Tipos compostos (representam uma coleo de valores); *Tipos de acessos (similares a ponteiros); *Tipos de arquivo (referencia objetos que contm uma seqncia de valores). * No so sintetizveis

Tipos Escalares
Tipos enumerados: tipos j definidos pela norma:
Bit Boolean Integer Real Physical STD_LOGIC

Tipos Escalares
Tipos enumerados: permite criar novos tipos.

til para mquina de estados (FSM)


Ex: type estado is (inicio, espera, calculo, final);

Os tipos criados podem ser declarados


Ex: signal estado_atual : estado

Tipos Compostos
ARRAY: Coleo de elementos do mesmo tipo

Exemplos:
type word is array (31 downto 0) of bit; type vetor is array(integer range <>) of real; type std_logic_vector is array(natural range <>) of std_logic;

Tipos Compostos
Records: coleo de elementos de tipos diferentes. Semelhante a struct em C Exemplos: type instruction is record Mnemonico: string; Codigo: bit_vector(3 downto 0); Ciclos: integer; end record signal instrucao : instruction; instrucao.Mnemonico : registrador instrucao.codigo : 0001 instrucao:ciclos : 3

Expresses
Realizam operaes sobre objetos do mesmo tipo; Operaes lgicas: and, or, nand, nor, xor, xnor e not; Operaes relacionais: igual (=), diferente (/=), menor que (<), menor ou igual (<=), maior que (>), maior ou igual (>=); Operaes numricas: soma (+), subtrao (-), negao (- unrio), multiplicao (*), diviso (/), mdulo (mod), remanescente (rem), expoente (**) e valor absoluto (abs);

Expresses
Operaes de concatenao:
Cria um novo vetor a partir de dois vetores j existentes. Ex:
Dado1: bit_vector(7 downto 0); Dado2: bit_vector(7 downto 0); Dado_Resultante: bit_vector(7 downto 0)
Dado1 := 01011011; Dado2 := 11010010; Dado_Resultante := (Dado1(7 downto 6) & Dado2(5 downto 2) & Dado1(1 downto 0)); Dado_Resultante = 01010011

Expresses

Atribuio de sinais
Comandos utilizados para atribuir um dado valor a um sinal em funo de um sinal de controle. Comando WITH - SELECT.
Atribuio de sinal com escolha.

Comando WHEN - ELSE


Atribuio condicional de sinais.

Utilizados fora de processos.

Comando WHEN - ELSE


Exemplo: Multiplexador de 1 bit
D0 D1

D 0 D 1

MUX S

D0, D1 = Entradas A = Sinal S = Sada

Multiplexador de 1 bit
LIBRARY ieee; USE ieee.std_logic_1164.all; ENTITY Mux_1b IS PORT ( D0, D1, Sinal: IN BIT; Saida : OUT BIT ); END Mux_1b; possvel declarar portas do mesmo tipo em apenas uma linha Aps a declarao da ltima porta no se usa ; O ; declarado aps o )

ARCHITECTURE behavior_we OF Mux_1b IS BEGIN Saida <= D0 WHEN Sinal = 0 ELSE D1 WHEN Sinal = 1; END behavior;

Decodificador 3-8
ARCHITECTURE behavior_we OF decod3to8 IS BEGIN Saida <= 00000001 WHEN endereco = 000 ELSE 00000010 WHEN endereco = 001 ELSE ENTITY decod3to8 IS 00000100 WHEN endereco = 010 ELSE PORT ( 00001000 WHEN endereco = 011 ELSE endereco : IN BIT_VECTOR(2 00010000 WHEN endereco = 100 ELSE DOWNTO 0); 00100000 WHEN endereco = 101 ELSE Saida : OUT BIT_VECTOR(7 01000000 WHEN endereco = 110 ELSE DOWNTO 0) ); 10000000 WHEN endereco = 111; END decod3to8; END behavior;

LIBRARY ieee; USE ieee.std_logic_1164.all;

Comando WITH SELECT


Exemplo: Multiplexador de 8 bits com 4 entradas
D0 8 D1 8 D2 8 D3 8 Sinal 2 MUX Sada 8

Multiplexador de 8 bits
LIBRARY ieee; USE ieee.std_logic_1164.all; ENTITY Mux_8b IS PORT ( D0, D1, D2, D3 : IN BIT_VECTOR(7 DOWNTO 0); Sinal : IN BIT_VECTOR (1 DOWNTO 0); Saida : OUT BIT_VECTOR(7 DOWNTO 0) ); END Mux_8b; ARCHITECTURE behavior_ws OF Mux_8b IS BEGIN WITH Sinal SELECT Saida <= D0 WHEN 00, D1 WHEN 01, D2 WHEN 10, D3 WHEN 11; END behavior;

Multiplexador de 8 bits
LIBRARY ieee; USE ieee.std_logic_1164.all; ENTITY Mux_8b IS PORT ( D0, D1, D2, D3 : IN STD_LOGIC_VECTOR(7 DOWNTO 0); Sinal : IN STD_LOGIC_VECTOR (1 DOWNTO 0); Saida : OUT STD_LOGIC_VECTOR(7 DOWNTO 0) ); END Mux_8b; ARCHITECTURE behavior_ws OF Mux_8b IS BEGIN WITH Sinal SELECT Saida <= D0 WHEN 00, D1 WHEN 01, D2 WHEN 10, D3 WHEN OTHERS; END behavior;

Decodificador 3-8
LIBRARY ieee; USE ieee.std_logic_1164.all; ARCHITECTURE behavior_ws OF decod3to8 IS BEGIN WITH endereco SELECT ENTITY decod3to8 IS Saida <= 00000001 WHEN 000, 00000010 WHEN 001, PORT ( 00000100 WHEN 010, endereco : IN BIT_VECTOR(2 DOWNTO 0); 00001000 WHEN 011, Saida : OUT BIT_VECTOR(7 DOWNTO 0) ); 00010000 WHEN 100, END decod3to8; 00100000 WHEN 101, 01000000 WHEN 110, 10000000 WHEN 111; END behavior;

Exerccio: Multiplexador Estrutural


Criar componentes AND, OR, NOT; Instanciar componentes; Realizar a ligao entre os componentes instanciados (PORT MAP);

Clusula Generate
Comando IF __generate_label: IF __expression GENERATE __statement; __statement; END GENERATE; Comando FOR: __generate_label: FOR __index_variable IN __range GENERATE __statement; __statement; END GENERATE;

Exemplo Generate
Comando IF Sequencia_reset: IF reset = 0 GENERATE a <= 0; b <= 0; END GENERATE; Comando FOR: Operacao_and: FOR indice IN (0 to 7) GENERATE Soma(indice) <= a(indice) and b(indice); END GENERATE;

Exemplo Somador 1 Bit


A B Vem_1
(CARRY_IN)

Vai_
(CARRY_OUT)

Exemplo Somador 1 Bit


SUM = A XOR B XOR CIN;
A 0 0 0 0 1 1 1 1 B 0 0 1 1 0 0 1 1 CIN 0 1 0 1 0 1 0 1 SUM COUT 0 0 1 0 1 0 0 1 1 0 0 1 0 1 1 1

COUT = ((A OR B) AND CIN) OR (A AND B);

Exemplo Somador 1 Bit


LIBRARY ieee; USE ieee.std_logic_1164.all; ENTITY onebit_full_adder IS PORT (Cin, A, B : IN STD_LOGIC; Sum, Cout : OUT STD_LOGIC); END onebit_full_adder; ARCHITECTURE behavior OF onebit_full_adder IS BEGIN Sum <= a XOR b XOR Cin; Cout <= ((a OR b) AND Cin) OR (a AND b); END behavior;

Exemplo Somador 8 Bits utilizando o somador de 1 bit


LIBRARY ieee; USE ieee.std_logic_1164.all; ENTITY eight_bits_adder IS PORT (Cin : IN STD_LOGIC; A : IN STD_LOGIC_VECTOR(7 DOWNTO 0); B : IN STD_LOGIC_VECTOR(7 DOWNTO 0); Sum : OUT STD_LOGIC_VECTOR(7 DOWNTO 0); Cout : OUT STD_LOGIC); END eight_bits_adder;

Exemplo Somador 8 Bits utilizando o somador de 1 bit


COUT ADDER SUM B CIN A

COUT ADDER 7 S(7)

CIN A(7) B(7)

COUT ADDER 1 S(1)

A(1) B(1)

ADDER COUT 0 S(0)

CIN A(0) B(0)

Exemplo Somador 8 Bits utilizando o somador de 1 bit


ARCHITECTURE behavior OF eight_bits_adder IS SIGNAL Int_cout : STD_LOGIC_VECTOR(7 DOWNTO 0); COMPONENT onebit_full_adder PORT (Cin : IN STD_LOGIC; A : IN STD_LOGIC; B : IN STD_LOGIC; Sum : OUT STD_LOGIC; Cout : OUT STD_LOGIC); END COMPONENT;

Exemplo Somador 8 Bits utilizando o somador de 1 bit


BEGIN

Adder0 : onebit_full_adder PORT MAP ( Cin => Cin, A => A(0), B => B(0), Sum => Sum(0), Cout => Int_cout(0));

Adder1 : onebit_full_adder PORT MAP ( Cin => Int_cout(0), A => A(1), B => B(1), Sum => Sum(1), Cout => Int_cout(1));

Exemplo Somador 8 Bits utilizando o somador de 1 bit


Adder2 : onebit_full_adder PORT MAP ( Cin => Int_cout(1), A => A(2), B => B(2), Sum => Sum(2), Cout => Int_cout(2)); Adder3 : onebit_full_adder PORT MAP ( Cin => Int_cout(2), A => A(3), B => B(3), Sum => Sum(3), Cout => Int_cout(3));

Exemplo Somador 8 Bits utilizando o somador de 1 bit


Adder4 : onebit_full_adder PORT MAP ( Cin => Int_cout(3), A => A(4), B => B(4), Sum => Sum(4), Cout => Int_cout(4)); Adder5 : onebit_full_adder PORT MAP ( Cin => Int_cout(4), A => A(5), B => B(5), Sum => Sum(5), Cout => Int_cout(5));

Exemplo Somador 8 Bits utilizando o somador de 1 bit


Adder6 : onebit_full_adder PORT MAP ( Cin => Int_cout(5), A => A(6), B => B(6), Sum => Sum(6), Cout => Int_cout(6)); Adder7 : onebit_full_adder PORT MAP ( Cin => Int_cout(6), A => A(7), B => B(7), Sum => Sum(7), Cout => Int_cout(7)); Cout <= Int_cout(7); END behavior;

Exemplo Somador Genrico (N-Bits)


LIBRARY ieee; USE ieee.std_logic_1164.all; ENTITY nbits_adder IS GENERIC (N : POSITIVE := 8); -- Default value PORT (Cin : IN STD_LOGIC; A, B : IN STD_LOGIC_VECTOR(N-1 DOWNTO 0); Sum : OUT STD_LOGIC_VECTOR(N-1 DOWNTO 0); Cout : OUT STD_LOGIC ); END nbits_adder;

Exemplo Somador Genrico


ARCHITECTURE behavior OF nbits_adder IS SIGNAL int_carry : STD_LOGIC_VECTOR(N-1 DOWNTO 0); BEGIN Sum <= A(N-1 DOWNTO 0) XOR B(N-1 DOWNTO 0) XOR (int_carry(N-2 DOWNTO 0) & Cin); int_carry(0) <= ((A(0) OR B(0)) AND Cin) OR (A(0) AND B(0)); CASCADE_CARRY: FOR I in 1 TO N-1 GENERATE int_carry(I) <= ((A(I) OR B(I)) AND int_carry(I-1)) OR (A(I) AND B(I)); END GENERATE CASCADE_CARRY; Cout <= int_carry(N-1); END behavior;

Exemplo Somador Genrico


Para interligar componentes genricos:

COMPONENT nbits_adder IS GENERIC (N : POSITIVE); PORT (Cin : IN STD_LOGIC; A, B : IN STD_LOGIC_VECTOR(N-1 DOWNTO 0); Sum : OUT STD_LOGIC_VECTOR(N-1 DOWNTO 0); Cout : OUT STD_LOGIC); END COMPONENT; Adder : nbits_adder GENERIC MAP (N => 8) PORT MAP (cin, A(7 downto 0), B(7 downto 0), Saida(7 downto 0), cout);

Anda mungkin juga menyukai