Подключение портов по имени
Часть раздела Основы путешествия по 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)
);Все они делают абсолютно одно и то же, потому что каждое соединение имеет метку.
Задание
Завершите инстанцирование, добавив недостающие подключения портов с помощью именованного связывания портов (port mapping by name).
Что нужно сделать:
- Подключите
portclkкsignalclock_signal - Подключите
portdata_inкsignalinput_data - Подключите
portdata_outкsignaloutput_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В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Основы
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