Подключение портов по порядку
Часть раздела Основы путешествия по Verilog на Coddy — урок 35 из 90.
В предыдущем уроке вы узнали о сопоставлении портов по имени, где вы явно указываете каждое соединение с помощью .port(signal). Теперь мы рассмотрим альтернативный метод: сопоставление портов по порядку.
Он подключает сигналы к портам модуля на основе order, в котором они указаны в определении модуля. Вы просто перечисляете сигналы в скобках, и Verilog сопоставляет их один за другим.
Синтаксис:
module_name instance_name (signal1, signal2, signal3);Первый `signal` подключается к первому `port`, второй — ко второму `port` и так далее.
Пример
Определение модуля:
module or_gate (
input in1, // Первый порт
input in2, // Второй порт
output result // Третий порт
);
assign result = in1 | in2;
endmoduleИнстанцирование с port mapping по order:
or_gate or1 (input_a, input_b, output_y);Это подключает:
- Первый сигнал
input_a→ первый портin1 - Второй сигнал
input_b→ второй портin2 - Третий сигнал
output_y→ третий портresult
Порядок имеет значение
При подключении портов по порядку последовательность имеет решающее значение:
// Правильный порядок
or_gate or1 (input_a, input_b, output_y);
// Неправильный порядок - сигналы подключены к неправильным портам!
or_gate or1 (input_b, input_a, output_y);
or_gate or1 (output_y, input_a, input_b);Если вы перепутаете order, соединения пойдут на wrong ports. Это может быть сложно отладить, так как на первый взгляд код выглядит correct.
Сопоставление портов по имени и по порядку
| Характеристика | По имени | По порядку |
|---|---|---|
| Синтаксис (syntax) | .port(signal) | signal1, signal2 |
| Порядок имеет значение? | Нет | Да |
| Самодокументируемость? | Да | Нет |
| Риск ошибок | Низкий | Высокий |
| Рекомендуется для | Большинства проектов | Только простых случаев |
Когда использовать сопоставление портов по порядку
Сопоставление портов по порядку допустимо, когда:
- Модуль имеет очень мало портов (2-3)
- Порядок портов очевиден и вряд ли изменится
- Вы пишете быстрые тестовые окружения (testbench)
Для большинства проектов port mapping по имени предпочтительнее, так как это понятнее и менее подвержено ошибкам.
Задание
Завершите инстанцирование, перечислив сигналы в правильном порядке с использованием позиционного связывания портов (port mapping by order).
Что нужно сделать:
Порты модуля (в следующем порядке):
input en(строб/разрешение)input [7:0] d(входные данные)output [7:0] q(выходные данные)
Сигналы для подключения:
enable_signal→ подключить кendata_input→ подключить кddata_output→ подключить кq
Попробуйте сами
module register (
input en,
input [7:0] d,
output [7:0] q
);
assign q = en ? d : q;
endmodule
module top (
input enable_signal,
input [7:0] data_input,
output [7:0] data_output
);
// TODO: Инстанцируйте register с именем reg1, используя ORDER mapping
// Перечислите сигналы в правильном порядке: enable_signal, data_input, data_output
// Не используйте синтаксис .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