projetos grandes mo801/mc912. roteiro componentes configurações instanciação múltipla...
Post on 22-Apr-2015
106 Views
Preview:
TRANSCRIPT
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 isport (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 reg4for 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 structend 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á existentefor 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
Exemploconfiguration 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 registeredend 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
• Exemploentity nand3 is
port (a, b, c : in bit;
y : out bit);
end entity nand3;
Criando um Componente nand2library 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 declarationsbegin gate1 : component nand2 port map ( in1 => s1, in2 => s2, result => s3 ); -- . . . -- other concurrent statementsend 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
top related