Menu
Coddy logo textTech

Mapowanie portów według nazw

Część sekcji Podstawy ścieżki Verilog w Coddy. Lekcja 34 z 90.

W poprzedniej lekcji dowiedziałeś się, jak utworzyć instancję modułu, przekazując sygnały w tej samej kolejności, w jakiej porty występują w definicji modułu. To działa, ale ma pewien problem: kolejność ma znaczenie.

Jeśli przypadkowo pomylisz kolejność, sygnały zostaną podłączone do niewłaściwych portów. Może to utrudnić debugowanie.

Problem z mapowaniem pozycyjnym

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

// Przyporządkowanie według kolejności — kolejność MUSI się zgadzać
or_gate or1 (input_a, input_b, output_y);  // Poprawnie
or_gate or1 (input_b, input_a, output_y);  // Błąd! Zamienione wejścia

Druga linia łączy input_b z in1 i input_a z in2: to subtelny błąd, który łatwo przeoczyć.

Rozwiązanie: mapowanie portów według nazw

Mapowanie portów według nazw wykorzystuje nazwę portu do tworzenia połączeń. Kolejność nie ma znaczenia, ponieważ każde połączenie jest wyraźnie oznaczone.

Składnia:

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

Kropka . przed nazwą portu wskazuje, że odwołujemy się do portu wewnątrz modułu. Sygnał w nawiasach jest tym, co z nim łączymy.

Przykład

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

To mówi wprost:

  • Port in1 otrzymuje sygnał input_a
  • Port in2 otrzymuje sygnał input_b
  • Port result otrzymuje sygnał output_y

Kolejność nie ma znaczenia

Przy mapowaniu portów według nazw możesz zapisać połączenia w dowolnej kolejności:

// Wszystkie trzy są IDENTYCZNE

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

Wszystkie robią dokładnie to samo, ponieważ każde połączenie jest opisane etykietą.

challenge icon

Wyzwanie

Dokończ instancję, dodając brakujące połączenia portów za pomocą mapowania portów według nazw.

Co zrobić:

  1. Połącz port clk z sygnałem clock_signal
  2. Połącz port data_in z sygnałem input_data
  3. Połącz port data_out z sygnałem output_data

Spróbuj swoich sił

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: Dodaj przypisania portów, używając składni .port(signal)
  );
  
endmodule
quiz iconSprawdź się

Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.

Wszystkie lekcje w sekcji Podstawy

Poćwicz samodzielnie: Kompilator Verilog online