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:
Sinais
q q
Globalmente:
package
Internamente:
entity, architecture (mais utilizado)
Variveis
Utilizados para armazenar valores intermedirios entre expresses; Atribuio imediata; Declarao:
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
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#
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.
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.
D 0 D 1
MUX S
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;
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;
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;
Vai_
(CARRY_OUT)
A(1) B(1)
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));
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);