Menu
Coddy logo textTech

Подключение портов по имени

Часть раздела Основы путешествия по Verilog на Coddy — урок 34 из 90.

В предыдущем уроке вы узнали, как создавать экземпляр модуля, передавая сигналы в том же порядке, в котором порты указаны в определении модуля. Это работает, но у этого подходы есть проблема: порядок имеет значение.

Если вы случайно перепутаете порядок, сигналы подключатся не к тем портам. Это может быть трудно отладить.

Проблема с Order Mapping

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

// Сопоставление порядка - порядок ДОЛЖЕН совпадать
or_gate or1 (input_a, input_b, output_y);  // Правильно
or_gate or1 (input_b, input_a, output_y);  // Неправильно! Поменяны местами входы

Вторая строка подключает input_b к in1, а input_a к in2 — незаметная ошибка, которую легко пропустить.

Решение: сопоставление портов по имени

Сопоставление портов по имени использует имя порта для выполнения соединений. Порядок не имеет значения, поскольку каждое соединение явно обозначено.

Синтаксис:

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

Точка . перед именем порта указывает на то, что мы ссылаемся на порт внутри модуля. Сигнал внутри скобок — это то, что мы к нему подключаем.

Пример

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

Это явно означает:

  • Порт in1 получает сигнал input_a
  • Порт in2 получает сигнал input_b
  • Порт result получает сигнал output_y

Порядок не имеет значения

При сопоставлении портов по имени вы можете записывать соединения в любом порядке:

// Все три ИДЕНТИЧНЫ

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

Все они делают абсолютно одно и то же, потому что каждое соединение имеет метку.

challenge icon

Задание

Завершите инстанцирование, добавив недостающие подключения портов с помощью именованного связывания портов (port mapping by name).

Что нужно сделать:

  1. Подключите port clk к signal clock_signal
  2. Подключите port data_in к signal input_data
  3. Подключите port data_out к signal output_data

Попробуйте сами

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: Добавьте сопоставления портов, используя синтаксис .port(signal)
  );
  
endmodule
quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

Все уроки раздела Основы