Menu
Coddy logo textTech

Mappatura delle porte per nome

Fa parte della sezione Fondamenti del percorso Verilog di Coddy. Lezione 34 di 90.

Nella lezione precedente, hai imparato a istanziare un modulo passando i segnali nello stesso ordine in cui le porte compaiono nella definizione del modulo. Funziona, ma presenta un problema: l’ordine è importante.

Se per sbaglio confondi l’ordine, i segnali si collegano alle porte sbagliate. Questo può essere difficile da diagnosticare.

Il problema del collegamento per ordine

module or_gate (
  input in1,
  input in2,
  output result
);
  assign result = in1 | in2;
endmodule

// Associazione per posizione: l'ordine DEVE corrispondere
or_gate or1 (input_a, input_b, output_y);  // Corretto
or_gate or1 (input_b, input_a, output_y);  // Errato! Ingressi scambiati

La seconda riga collega input_b a in1 e input_a a in2: un bug sottile che è facile non notare.

Soluzione: mappatura delle porte per nome

La mappatura delle porte per nome usa il nome della porta per creare le connessioni. L'ordine non è importante perché ogni connessione è etichettata in modo esplicito.

Sintassi:

module_name instance_name (
  .port_name(signal),
  .port_name(signal)
);

Il punto . prima del nome della porta indica che ci stiamo riferendo a una porta all'interno del modulo. Il segnale tra parentesi è ciò che colleghiamo a essa.

Esempio

or_gate or1 (
  .in1(input_a),
  .in2(input_b),
  .result(output_y)
);

Questo dice esplicitamente:

  • La porta in1 riceve il segnale input_a
  • La porta in2 riceve il segnale input_b
  • La porta result riceve il segnale output_y

L’ordine non è importante

Con il collegamento delle porte tramite nome, puoi scrivere le connessioni in qualsiasi ordine:

// Tutti e tre sono IDENTICI

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)
);

Fanno tutti esattamente la stessa cosa perché ogni connessione è etichettata.

challenge icon

Sfida

Completa l’istanza aggiungendo le connessioni mancanti delle porte usando la mappatura delle porte per nome.

Cosa fare:

  1. Collega la porta clk al segnale clock_signal
  2. Collega la porta data_in al segnale input_data
  3. Collega la porta data_out al segnale output_data

Provalo tu

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: Aggiungi le associazioni delle porte usando la sintassi .port(signal)
  );
  
endmodule
quiz iconMettiti alla prova

Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.

Tutte le lezioni di Fondamenti

Esercitati da solo: Compilatore Verilog online