Port Mapping By Name
Часть раздела Основы путешествия по 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)
);Точка . перед именем порта указывает, что мы обращаемся к порту внутри module. Сигнал в скобках — это то, что мы к нему подключаем.
Пример
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)
);All делают ровно одно и то же, потому что каждое соединение имеет метку.
Задание
Завершите инстанцирование, добавив отсутствующие соединения портов с помощью сопоставления портов по имени.
Что нужно сделать:
- Соедините порт
clkс сигналомclock_signal - Соедините порт
data_inс сигналомinput_data - Соедините порт
data_outс сигналом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В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Основы
1Введение
Что такое VerilogАппаратное обеспечение и программное обеспечениеВаш первый модульКомментарииУровни абстракции проектирования4Operators Part 1
Arithmetic OperatorsModulo OperatorComparison OperatorsRecap - Simple MathBitwise Operators7Assign And Gates
Continuous AssignmentAssign With OperatorsBuilt In Gate PrimitivesAND OR NOT GatesXOR XNOR GatesRecap - Logic Gate Circuit10Decision Making
If StatementIf - ElseRecap - Simple ComparatorCase StatementCasex And CasezRecap - ALU Design5Operators Part 2
Logical OperatorsReduction OperatorsShift OperatorsConcatenation OperatorConditional OperatorRecap - Operator Challenge3Number System
Binary RepresentationSized NumbersUnsized NumbersNegative NumbersSpecial Values X And ZRecap - Number Formats6Modules
Module StructureInput And Output PortsInout PortsModule InstantiationPort Mapping By NamePort Mapping By OrderRecap - Build A Module9Procedural Blocks
Always BlockInitial BlockSensitivity ListBlocking AssignmentNon Blocking AssignmentRecap - Always vs Initial15Traffic Light Controller
Defining The StatesState Machine LogicПотренируйтесь самостоятельно: Онлайн-компилятор Verilog