VHDL VHSIC Hardware Description Language Very High Speed Integrated Circuits VHDL-87 VHDL-93 entidade reg4 portas de entrada d0 s0 d1 s1 d2 s2 d3 s3 portas de saída en clk entity reg4 is port (d0, d1, d2, d3, en, clk : in bit; s0, s1, s2, s3 : out bit ); end entity reg4; declaração da entidade A descrição da implementação interna duma entidade chama-se corpo arquitectural. Uma entidade pode ter vários corpos arquitecturais que correspondem às implementação alternativas. Corpo arquitectural comportamental descreve o funcionamento de um modo abstracto; só inclui processos que especificam acções sequenciais a executar. estrutural descreve que subsistemas compõem a entidade e como estes são interligados. misto algumas partes da entidade são descritas com a ajuda de processos enquanto outras são descritas de modo estrutural. Descrição comportamental architecture Behavioral of reg4 is begin p0: process (d0, d1, d2, d3, en, clk) is begin if en = '1' and clk = '1' then s0 <= d0; s1 <= d1; s2 <= d2; s3 <= d3; end if; end process p0; end Behavioral; Descrição estrutural bit0 latch s s d0 s0 clk bit1 latch s s d1 s1 clk bit2 latch s s d2 s2 clk bit3 latch s s d3 en clk gate and2_gate x z y clk s3 Descrição estrutural entity latch is port ( d, clk : in bit; s : out bit); end latch; entity and2_gate is Port ( x, y : in bit; z : out bit); end and2_gate; architecture beh of latch is begin latch_beh: process (clk, d) is begin if clk = '1' then s <= d; end if; end process latch_beh; end beh; architecture beh of and2_gate is begin z <= x and y; end beh; entity reg4 is Port ( d0, d1, d2, d3, en, clk : in bit; s0, s1, s2, s3 : out bit); end reg4; architecture estrutural of reg4 is signal int_clk : bit; bit0 latch s s d0 bit1 latch s s d1 begin bit0: entity work.latch(beh) port map (d0, int_clk, s0); bit1: entity work.latch(beh) port map (d1, int_clk, s1); bit2: entity work.latch(beh) port map (d2, int_clk, s2); bit3: entity work.latch(beh) port map (d3, int_clk, s3); gate: entity work.and2_gate(beh) port map (en, clk, int_clk); end estrutural; s0 clk s1 clk bit2 latch s s d2 s2 clk bit3 latch s s d3 en clk gate and2_gate x z y clk instâncias de componentes s3 ----- Uncomment the following lines to use the declarations that are provided for instantiating Xilinx primitive components. library UNISIM; use UNISIM.VComponents.all; identificadores básicos: not case-sensitive - servem para nomear itens num modelo VHDL; - podem ser de comprimento arbitrário; - só podem incluir letras (‘A’-’Z’, ‘a’- ‘z’), digitos (‘0’-’9’), e ‘_’; - devem começar com uma letra; - não podem conter ‘_’ no fim; - não podem incluir dois ‘_’ seguidos. reg4 bit0 next_state 4reg bit0_ next__state identificadores estendidos: - servem para possibilitar a interacção entre as ferramentas CAD que processam código VHDL e as ferramentas que usam regras diferentes para os identificadores; - podem conter qualquer sequência de caracteres; - devem ser incluídos entre duas barras ‘\’. case-sensitive \4reg4\ \__bit0\ \next__state\ \@#@\ abs access after alias all and architecture array assert attribute begin block body buffer bus case component configuration constant disconnect downto else elsif end entity exit file for function generate generic group guarded if impure in inertial inout is label library linkage literal loop map mod nand new next nor not null of on open or others out package port postponed procedure process pure range record register reject rem report return rol select severity signal shared sla sll sra srl subtype then to transport type unaffected units until use variable wait when while with xnor xor & / ‘ : () ; * < + = , > | => ** := /= >= <= <> . reais: inteiros: 55 12 55.45 169 2#10101001# 16#A9# 8#251# Os caracteres em VHDL são escritos entre plicas ‘’: ‘F’ ‘q’ ‘’’ ‘‘ ‘,’ 1.5E+12 12.0e-03 Representam sequências de caracteres e são escritas entre aspas: “Esta e uma linha” & “comprida.” “0!1Z&%@*” “” “Linha “”1”” e” - representam sequências de bits; - começam com um caracter (B, b, O, o, X, x) que representa a base.; - escrevem-se entre aspas; - podem incluir ‘_’. B“0010” b“1111_1111” x”0a” = O“123” o“123” b”0000_1010” X”ABCDE” o”12” x”12ab” Um objecto é um item nomeado que pertence a um determinado tipo. - precisam de ser declaradas antes de poderem ser utilizadas. A declaração introduz o nome do objecto, define o seu tipo e pode especificar o valor inicial. constant a : string := "Linha ""1"" e" & "comprida." ; constant numero_de_bits : integer := 4; constant dados : std_logic_vector(11 downto 0) := b"0000_1111_1010"; variable var1 : bit; variable var2 : std_logic := '1'; assume o valor inicial por defeito que depende do tipo da variável As declarações de variáveis e constantes aparecem normalmente na parte declarativa de processos: architecture Behavioral of reg4 is begin p0: process (d0, d1, d2, d3, en, clk) is variable sd0, sd1, sd2, sd3 : bit; begin if en = '1' and clk = '1' then sd0 := d0; sd1 := d1; sd2 := d2; sd3 := d3; end if; s0 <= sd0; s1 <= sd1; s2 <= sd2; s3 <= sd3; end process p0; end Behavioral; A atribuição de um valor à variável (:=) substitui imediatamente o valor anterior desta variável !!! A atribuição de um valor a um sinal (<=) funciona de maneira diferente !!! entity var_sig is port (clk, reset: in std_logic; output : out std_logic); end entity var_sig; architecture behav of var_sig is begin test: process (clk) variable temp_var : std_logic; begin temp_var := '1'; if (temp_var = '1') then output <= temp_var; end if; temp_var := '0'; end process test; end behav; entity var_sig is port (clk, reset: in std_logic; output : out std_logic); end entity var_sig; architecture behav of var_sig is signal temp_sig : std_logic; begin test: process (clk) variable temp_var : std_logic; begin temp_sig <= '1'; if (temp_sig = '1') then output <= temp_sig; else output <= '0'; end if; temp_sig <= '0'; end process test; end behav;