Порты Inout
Часть раздела Основы путешествия по Verilog на Coddy — урок 32 из 90.
Порт inout является двунаправленным портом, который может как отправлять, так и принимать сигналы. Он может выступать в качестве входа или выхода в разное время.
Большинство портов являются либо input (данные поступают на вход), либо output (данные выходят на выход). Порт inout может выполнять обе функции — он может выдавать данные или принимать их, в зависимости от ситуации.
Представьте это как улицу с двусторонним движением вместо дороги с односторонним движением.
Порты inout используются для:
- Общие шины — несколько устройств, подключенных к одним и тем же проводам
- Шины данных памяти — данные могут быть прочитаны или записаны
- Двунаправленная связь — I2C, SPI и т. д.
Только одно устройство управляет шиной в каждый момент времени. Другие устройства должны находиться в состоянии высокого импеданса (Z).
Объявление порта Inout
inout [7:0] data_bus; // 8-битная двунаправленная шина
inout ready; // Однобитный двунаправленный сигналКак работает Inout
Порту inout требуется управляющий сигнал, чтобы определить, работает ли он как вход или как выход:
module bidir (
inout [7:0] bus,
input [7:0] data_out,
input enable,
output [7:0] data_in
);
assign bus = (enable) ? data_out : 8'bZ; // Управлять шиной, когда включено, иначе Z
assign data_in = bus; // Всегда читать шину
endmodule- Когда
enable = 1, модуль управляет шиной (режим выхода) - Когда
enable = 0, модуль освобождает шину (режим входа, high-Z)
Важные правила для Inout
| Правило | Почему |
|---|---|
Должен быть объявлен как wire | Не может быть reg |
| Нельзя одновременно читать и записывать | Это создаст конфликт (X) |
Используйте Z для освобождения шины | Позволяет другим устройствам управлять шиной |
| Только один драйвер одновременно | Предотвращает конфликты на шине |
Inout vs Input vs Output
| Тип порта | Направление | Может управлять (Drive) | Может читать |
|---|---|---|---|
input | Одностороннее (только вход) | Нет | Да |
output | Одностороннее (только выход) | Да | Нет |
inout | Двустороннее (оба) | Да (когда включено) | Да (всегда) |
Распространенная ошибка
// ОШИБКА: Нельзя присваивать значение inout внутри блока always
always @(posedge clk) begin
data_bus <= something; // Ошибка! Используйте assign с условием
end// ПРАВИЛЬНО: Используйте assign с условием enable
assign data_bus = (enable) ? something : 8'bZ;Задание
Добавьте недостающий порт inout и операторы assign, чтобы этот двунаправленный буфер заработал.
Что нужно сделать:
- Добавьте 8-битный порт
inoutс названиемio_bus - Добавьте оператор
assign, который передаетsend_valueвio_bus, когдаsend_enableравен 1, в противном случае —Z - Добавьте оператор
assign, который считывает значение изio_busвreceive_value
Шпаргалка
inout — это двунаправленный порт, который может как передавать, так и принимать сигналы. Только одно устройство управляет шиной в конкретный момент времени; остальные должны выдавать высокоимпедансное состояние (Z).
module bidir (
inout [7:0] bus,
input [7:0] data_out,
input enable,
output [7:0] data_in
);
assign bus = (enable) ? data_out : 8'bZ; // Передача при включении, иначе освобождение шины
assign data_in = bus; // Всегда чтение шины
endmoduleОсновные правила:
- Должен быть типа
wire(неreg) - Используйте
assignс тернарным оператором — никогда не выполняйте присваивание внутри блокаalways - Освобождайте шину с помощью
Z, когда передача не ведется, чтобы избежать конфликтов на шине
Попробуйте сами
module bidir_buffer (
// Задача 1: Добавьте сюда 8-битный порт inout с именем io_bus
input [7:0] send_value,
input send_enable,
output [7:0] receive_value
);
// Задача 2: Добавьте оператор assign, который передает send_value в io_bus, когда send_enable равен 1, иначе Z
// Задача 3: Добавьте оператор assign, который считывает io_bus в receive_value
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