Mapeamento de Portas por Nome
Parte da seção Fundamentos do Journey de Verilog da Coddy — lição 34 de 90.
Na lição anterior, você aprendeu como instanciar um módulo passando sinais na mesma ordem em que as portas aparecem na definição do módulo. Isso funciona, mas tem um problema: a ordem importa.
Se você acidentalmente misturar a ordem, os sinais se conectam às portas erradas. Isso pode ser difícil de depurar.
O Problema com o Mapeamento por Ordem
module or_gate (
input in1,
input in2,
output result
);
assign result = in1 | in2;
endmodule
// Mapeamento por ordem - a ordem DEVE coincidir
or_gate or1 (input_a, input_b, output_y); // Correto
or_gate or1 (input_b, input_a, output_y); // Errado! Entradas trocadasA segunda linha conecta input_b a in1 e input_a a in2 — um bug sutil que é fácil de passar despercebido.
Solução: Mapeamento de Porta por Nome
O mapeamento de porta por nome usa o nome da porta para fazer conexões. A ordem não importa porque cada conexão é explicitamente rotulada.
Sintaxe:
module_name instance_name (
.port_name(signal),
.port_name(signal)
);O ponto . antes do nome da porta indica que estamos nos referindo a uma porta dentro do módulo. O sinal dentro dos parênteses é o que conectamos a ela.
Exemplo
or_gate or1 (
.in1(input_a),
.in2(input_b),
.result(output_y)
);Isso diz explicitamente:
- A porta
in1recebe o sinalinput_a - A porta
in2recebe o sinalinput_b - A porta
resultrecebe o sinaloutput_y
A Ordem Não Importa
Com o mapeamento de portas por nome, você pode escrever as conexões em qualquer ordem:
// Todos os três são IDÊNTICOS
or_gate or1 (
.in1(input_a),
.in2(input_b),
.result(output_y)
);
or_gate or1 (
.result(output_y),
.in1(input_a),
.in2(input_b)
);
or_gate or1 (
.in2(input_b),
.result(output_y),
.in1(input_a)
);Todos fazem exatamente a mesma coisa porque cada conexão está rotulada.
Desafio
Complete a instanciação adicionando as conexões de porta que faltam usando o mapeamento de porta por nome.
O que fazer:
- Conecte a porta
clkao sinalclock_signal - Conecte a porta
data_inao sinalinput_data - Conecte a porta
data_outao sinaloutput_data
Folha de consulta
O mapeamento de portas por nome usa a sintaxe .port_name(signal), tornando a ordem irrelevante:
module_name instance_name (
.port_name(signal),
.port_name(signal)
);Exemplo:
or_gate or1 (
.in1(input_a),
.in2(input_b),
.result(output_y)
);O . antes do nome da porta refere-se a uma porta dentro do módulo; o sinal entre parênteses é o que se conecta a ela. Ao contrário do mapeamento por ordem, as conexões podem ser listadas em qualquer ordem sem causar bugs.
Experimente você mesmo
module register (
input clk,
input [7:0] data_in,
output reg [7:0] data_out
);
always @(posedge clk) begin
data_out <= data_in;
end
endmodule
module top (
input clock_signal,
input [7:0] input_data,
output [7:0] output_data
);
register reg1 (
// TODO: Adicione mapeamentos de porta usando a sintaxe .port(signal)
);
endmoduleEsta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.
Todas as lições de Fundamentos
1Introdução
O que é VerilogHardware vs SoftwareNíveis de Abstração de ProjetoSeu Primeiro MóduloComentários4Operadores Parte 1
Operadores AritméticosOperador de MóduloOperadores de ComparaçãoRecapitulação - Matemática SimplesOperadores Bitwise7Atribuição e Portas Lógicas
Atribuição ContínuaAtribuição com OperadoresPrimitivas de Portas IntegradasPortas AND, OR e NOTPortas XOR e XNORRecapitulação - Circuito de Portas Lógicas10Tomada de Decisão
Instrução IfIf - ElseRecapitulação - Comparador SimplesInstrução CaseCasex e CasezRecapitulação - Projeto de ALU2Tipos de Dados
Tipo WireTipo RegInteger e RealVetoresArraysParâmetrosRecapitulação - Declarar Sinais5Operadores Parte 2
Operadores LógicosOperadores de ReduçãoOperadores de DeslocamentoOperador de ConcatenaçãoOperador CondicionalRecapitulação - Desafio de Operadores3Sistemas de Numeração
Representação BináriaNúmeros com Tamanho DefinidoNúmeros sem Tamanho DefinidoNúmeros NegativosValores Especiais X e ZRecapitulação - Formatos de Números6Módulos
Estrutura de MóduloPortas de Entrada e SaídaPortas InoutInstanciação de MóduloMapeamento de Portas por NomeMapeamento de Portas por OrdemRecapitulação - Construa um Módulo