Port Mapping By Name
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 projeto4Operators Part 1
Arithmetic OperatorsModulo OperatorComparison OperatorsRecap - Simple MathBitwise Operators7Assign And Gates
Continuous AssignmentAssign With OperatorsBuilt In Gate PrimitivesAND OR NOT GatesXOR XNOR GatesRecap - Logic Gate Circuit10Decision Making
If StatementIf - ElseRecap - Simple ComparatorCase StatementCasex And CasezRecap - ALU Design5Operators Part 2
Logical OperatorsReduction OperatorsShift OperatorsConcatenation OperatorConditional OperatorRecap - Operator Challenge3Number System
Binary RepresentationSized NumbersUnsized NumbersNegative NumbersSpecial Values X And ZRecap - Number Formats6Modules
Module StructureInput And Output PortsInout PortsModule InstantiationPort Mapping By NamePort Mapping By OrderRecap - Build A Module9Procedural Blocks
Always BlockInitial BlockSensitivity ListBlocking AssignmentNon Blocking AssignmentRecap - Always vs Initial15Traffic Light Controller
Defining The StatesState Machine LogicPratique por conta própria: Compilador de Verilog online