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
Download

Projetos Grandes - Facom-UFMS