Подключение портов по имени
Часть раздела Основы путешествия по Verilog на Coddy — урок 34 из 90.
В предыдущем уроке вы узнали, как создавать экземпляр модуля, передавая сигналы в том же порядке, в котором порты указаны в определении модуля. Это работает, но есть проблема: порядок имеет значение.
Если вы случайно перепутаете порядок, сигналы подключатся не к тем портам. Это может быть трудно отладить.
Проблема с позиционным отображением
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)
);Все они выполняют одно и то же действие, потому что каждое соединение помечено.
Задание
Завершите создание экземпляра, добавив недостающие соединения портов, используя именованное сопоставление портов.
Что нужно сделать:
- Подключите порт
clkк сигналуclock_signal - Подключите порт
data_inк сигналуinput_data - Подключите порт
data_outк сигналуoutput_data
Шпаргалка
Сопоставление портов по имени использует синтаксис .port_name(signal), что делает порядок неважным:
module_name instance_name (
.port_name(signal),
.port_name(signal)
);Пример:
or_gate or1 (
.in1(input_a),
.in2(input_b),
.result(output_y)
);Точка . перед именем порта относится к порту внутри модуля; сигнал в скобках — это то, что к нему подключается. В отличие от сопоставления по порядку, соединения могут быть перечислены в любом порядке, не вызывая ошибок.
Попробуйте сами
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В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Основы
1Введение
Что такое VerilogHardware против SoftwareУровни абстракции проектированияВаш первый модульКомментарии4Операторы. Часть 1
Арифметические операторыОператор остатка от деленияОператоры сравненияПовторение: простая математикаПобитовые операторы7Оператор Assign и логические вентили
Непрерывное присваиваниеAssign с операторамиВстроенные примитивы вентилейВентили AND, OR, NOTВентили XOR, XNORИтоги: Схемы на логических вентилях10Принятие решений
Оператор ifКонструкция if - elseПовторение: простой компараторОператор caseОператоры casex и casezПовторение: проектирование ALU5Операторы. Часть 2
Логические операторыОператоры редукцииОператоры сдвигаОператор конкатенацииУсловный операторПовторение — Испытание по операторам3Системы счисления
Двоичное представлениеЧисла с заданным размеромЧисла без заданного размераОтрицательные числаСпециальные значения X и ZИтоги — форматы чисел6Модули
Структура модуляВходные и выходные портыПорты InoutИнстанцирование модуляПодключение портов по имениПодключение портов по порядкуИтоги: создание модуля9Процедурные блоки
Блок alwaysБлок initialСписок чувствительностиБлокирующее присваиваниеНеблокирующее присваиваниеИтоги: always против initial