Projetos Grandes MO801/MC912 Roteiro • • • • Componentes Configurações Instanciação múltipla Instanciação condicional • Atenção: Os exemplos são cumulativos Componentes • Forma de descrever a interface de um módulo sem indicar o conteúdo • Pode ser colocado num pacote e distribuído aos demais desenvolvedores • Pode esconder entidades complexas através de uma configuração – Removendo portas – Removendo generics Declaração component flipflop is generic(Tprop,Tsetup,Thold:delay_lengh); port (clk : in bit; clr : in bit; d : in bit; q : out bit); end component flipflop; Instanciação entity reg4 is port (clk, clr, in bit; d : in bit_vector(0 to 3); q : out bit_vector(0 to 3)); end entity reg4; architecture struct of reg4 is component flipflop … begin bit0 : component flipflop generic map (2 ns, 2 ns, 1 ns) port map (clk, clr, d(0), q(0)); bit1 : … bit2 : … bit3 : … end architecture struct; Sugestão de uso • Declarar os componentes dentro de pacotes – Declarar num pacote todos os componentes necessários aos submódulos • Utiliza-los de forma a desplugar totalmente a implementação do uso • Utiliza-los como uma funcionalidade existente, sem preocupação com o conteúdo Instanciação de Entidades x Componentes • Instanciar uma entidade indica exatamente – o módulo que será colocado no circuito – como ele será ligado • Instanciar um componente indica apenas que algo será ligado naquele lugar – Não explicita a entidade que será utilizada – As conexões explícitas são apenas para as portas do componente, que podem ser diferentes da entidade Mapeamento Componente x Entidade • Mapeamento nominal – Forma mais simples – O componente é mapeado diretamente na entidade de mesmo nome da biblioteca atual – Todas as portas e generics são mapeados de forma similar • Mapeamento através de configuração – Configurações de um componente – Configurações de uma arquitetura – Configurações de todos os submódulos Configurações • Explicita o mapeamento componente x entidade • Define parâmetros para componentes • Faz o mapeamento de pinos da entidade que não estão presentes no componente • Define a arquitetura que será utilizada • Define parâmetros para outros elementos da linguagem • Múltiplas configurações podem ser criadas • Pode ser instanciada Exemplo library star_lib; use star_lib.edge_triggered_Dff; configuration reg4_gate_level of reg4 is for struct -- architecture of reg4 for bit0 : flipflop use entity edge_triggered_Dff(hi_fanout); end for; for others : flipflop use entity edge_triggered_Dff(basic); end for; end for; -- end of architecture struct end configuration reg4_gate_level; Configurando Instâncias • Configurando uma instância – for bit0 : flipflop … • Configurando todas as instâncias – for all : flipflop … • Configurando todas as instâncias ainda não configuradas – for others : flipflop … Configurando Múltiplos Níveis • Utilizando uma configuração já existente for flag_reg : reg4 use configuration work.reg4_gate_level; end for; Exemplo (instanciação) architecture registered of counter is component digit_register is port ( clk, clr : in bit; d : in digit; q : out digit ); end component digit_register; signal current_val0, current_val1, next_val0, next_val1 : digit; begin val0_reg : component digit_register port map ( clk => clk, clr => clr, d => next_val0, q => current_val0 ); val1_reg : component digit_register port map ( clk => clk, clr => clr, d => next_val1, q => current_val1 ); … end architecture registered; Exemplo (configuração) configuration counter_down_to_gate_level of counter is for registered for all : digit_register use configuration work.reg4_gate_level; end for; -- . . . -- bindings for other component instances end for; -- end of architecture registered end configuration counter_down_to_gate_level; Outra Forma • Configurar toda a hierarquia com uma só configuração • Pouco flexível • Difícil de interpretar Exemplo configuration full of counter is for registered -- architecture of counter for all : digit_register use entity work.reg4(struct); for struct -- architecture of reg4 for bit0 : flipflop use entity edge_triggered_Dff(hi_fanout); end for; for others : flipflop use entity edge_triggered_Dff(basic); end for; end for; -- end of architecture struct end for; -- . . . -- bindings for other component instances end for; -- end of architecture registered end configuration full; Instanciando uma Configuração architecture top_level of alarm_clock is use work.counter_types.digit; signal reset_to_midnight, seconds_clk : bit; signal seconds_units, seconds_tens : digit; … begin seconds : configuration work.counter_down_to_gate_level port map ( clk => seconds_clk, clr => reset_to_midnight, q0 => seconds_units, q1 => seconds_tens ); … end architecture top_level; Generic e Port Map • Podem ser definidos na configuração • Permitem ocultar parte de uma entidade de um componente – Removendo generics (Exemplo 1) – Removendo portas (Exemplo 2) – Todas as portas e generics precisam ser definidas no final Exemplo 1 (Entidade Base) library ieee; use ieee.std_logic_1164.all; entity reg is generic ( t_setup, t_hold, t_pd : delay_length; width : positive ); port ( clock : in std_logic; data_in : in std_logic_vector(0 to width - 1); data_out : out std_logic_vector(0 to width - 1) ); end entity reg; Exemplo 1 (Componente) architecture structural of controller is component reg is generic ( width : positive ); port ( clock : in std_logic; data_in : in std_logic_vector(0 to width - 1); data_out : out std_logic_vector(0 to width - 1) ); end component reg; … begin state_reg : component reg generic map ( width => state_type'length ) port map ( clock => clock_phase1, data_in => next_state, data_out => current_state ); … end architecture structural; Exemplo 1 (Configuração) configuration controller_with_timing of controller is for structural for state_reg : reg use entity work.reg(gate_level) generic map ( t_setup => 200 ps, t_hold => 150 ps, t_pd => 150 ps, width => width ); end for; … end for; end configuration controller_with_timing; Exemplo 2 (Entidade Base) entity decoder_3_to_8 is generic ( Tpd_01, Tpd_10 : delay_length ); port ( s0, s1, s2 : in bit; enable : in bit; y0, y1, y2, y3, y4, y5, y6, y7 : out bit ); end entity decoder_3_to_8; Exemplo 2 (Componente) architecture structure of computer_system is component decoder_2_to_4 is generic ( prop_delay : delay_length ); port ( in0, in1 : in bit; out0, out1, out2, out3 : out bit ); end component decoder_2_to_4; … begin interface_decoder : component decoder_2_to_4 generic map ( prop_delay => 4 ns ) port map ( in0 => addr(4), in1 => addr(5), out0 => interface_a_select, out1 => interface_b_select, out2 => interface_c_select, out3 => interface_d_select ); … end architecture structure; Exemplo 2 (Configuração) configuration computer_structure of computer_system is for structure for interface_decoder : decoder_2_to_4 use entity work.decoder_3_to_8(basic) generic map ( Tpd_01 => prop_delay, Tpd_10 => prop_delay ) port map ( s0 => in0, s1 => in1, s2 => '0', enable => '1', y0 => out0, y1 => out1, y2 => out2, y3 => out3, y4 => open, y5 => open, y6 => open, y7 => open ); end for; … end for; end configuration computer_structure; Configurando sem Configuration • Usado para selecionar a entidade de um componente e fazer as configurações sem definir uma configuração explícita • Uso comum: simplificar um componente • Exemplo entity nand3 is port (a, b, c : in bit; y : out bit); end entity nand3; Criando um Componente nand2 library gate_lib; architecture ideal of logic_block is component nand2 is port ( in1, in2 : in bit; result : out bit ); end component nand2; for all : nand2 use entity gate_lib.nand3(behavioral) port map ( a => in1, b => in2, c => '1', y => result ); -- . . . -- other declarations begin gate1 : component nand2 port map ( in1 => s1, in2 => s2, result => s3 ); -- . . . -- other concurrent statements end architecture ideal; Instanciação Múltipla • Permite replicar componentes numa estrutura regular • Permite interligar os componentes • Visão geral: Permite replicar código – Incluindo processos Exemplo (Entidade) library ieee; use ieee.std_logic_1164.all; entity register_tristate is generic ( width : positive ); port ( clock : in std_logic; out_enable : in std_logic; data_in : in std_logic_vector(0 to width - 1); data_out : out std_logic_vector(0 to width - 1) ); end entity register_tristate; Exemplo (Componentes) architecture cell_level of register_tristate is component D_flipflop is port ( clk : in std_logic; d : in std_logic; q : out std_logic ); end component D_flipflop; component tristate_buffer is port ( a : in std_logic; en : in std_logic; y : out std_logic ); end component tristate_buffer; Exemplo (Arquitetura) begin cell_array : for bit_index in 0 to width - 1 generate signal data_unbuffered : std_logic; begin cell_storage : component D_flipflop port map ( clk => clock, d => data_in(bit_index), q => data_unbuffered ); cell_buffer : component tristate_buffer port map ( a => data_unbuffered, en => out_enable, y => data_out(bit_index) ); end generate cell_array; end architecture cell_level; Instanciação Condicional • Permite instanciar um componente somente caso uma condição seja verdadeira • Pode habilitar ou desabilitar certas funcionalidades do circuito – Últil para testes • A condição pode vir de um generic Exemplo (Entidade) library ieee; use ieee.std_logic_1164.all; entity shift_reg is port ( phi1, phi2 : in std_logic; serial_data_in : in std_logic; parallel_data : inout std_logic_vector ); end entity shift_reg; Exemplo (Componente) architecture cell_level of shift_reg is alias normalized_parallel_data : std_logic_vector(0 to parallel_data'length - 1) is parallel_data; component master_slave_flipflop is port ( phi1, phi2 : in std_logic; d : in std_logic; q : out std_logic ); end component master_slave_flipflop; Exemplo (Arquitetura) begin reg_array : for index in normalized_parallel_data'range generate begin first_cell : if index = 0 generate begin cell : component master_slave_flipflop port map ( phi1, phi2, d => serial_data_in, q => normalized_parallel_data(index) ); end generate first_cell; other_cell : if index /= 0 generate begin cell : component master_slave_flipflop port map ( phi1, phi2, d => normalized_parallel_data(index - 1), q => normalized_parallel_data(index) ); end generate other_cell; end generate reg_array; end architecture cell_level; Comentários Finais • É possível configurar as instâncias do generate • É possível criar entidades recursivas com generate instanciando a própria entidade dentro dela • Mais detalhes, consultar capítulo 14 do livro