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 a instanciar um módulo passando os 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 serão conectados às portas erradas. Isso pode ser difícil de depurar.
O problema do mapeamento por ordem
module or_gate (
input in1,
input in2,
output result
);
assign result = in1 | in2;
endmodule
// Mapeamento de 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 não perceber.
Solução: Mapeamento de Portas por Nome
O mapeamento de portas por nome usa o nome da porta para fazer conexões. A ordem não importa porque cada conexão é identificada explicitamente.
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 é aquilo 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)
);Todas fazem exatamente a mesma coisa porque cada conexão é identificada.
Desafio
Conclua a instanciação adicionando as conexões de porta ausentes usando mapeamento de portas 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
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 portas 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. SoftwareSeu primeiro móduloComentáriosNíveis de abstração de projeto4Operadores Parte 1
Operadores aritméticosOperador móduloOperadores de comparaçãoRecapitulação - Matemática simplesOperadores bit a bit7Atribuições e Portas
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ões
Declaração IfIf - ElseRevisão - Comparador SimplesDeclaração CaseCasex e CasezRevisão - Projeto de ALU2Tipos de Dados
Tipo WireTipo RegInteiro e RealVetoresArraysParâmetrosRecapitulação - Declarar Sinais5Operadores - Parte 2
Operadores lógicosOperadores de reduçãoOperadores de deslocamentoOperador de concatenaçãoOperador condicionalRevisão - Desafio de operadores3Sistema Numérico
Representação BináriaNúmeros com Tamanho DefinidoNúmeros sem Tamanho DefinidoNúmeros NegativosValores Especiais X e ZRevisão - Formatos Numéricos6Módulos
Estrutura de MódulosPortas de Entrada e SaídaPortas InoutInstanciação de MódulosMapeamento de Portas por NomeMapeamento de Portas por OrdemRecapitulação — Construindo um MóduloPratique por conta própria: Compilador de Verilog online