Menu
Coddy logo textTech

Порты 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;
challenge icon

Задание

Добавьте недостающий порт inout и операторы assign, чтобы этот двунаправленный буфер заработал.

Что нужно сделать:

  1. Добавьте 8-битный порт inout с названием io_bus
  2. Добавьте оператор assign, который передает send_value в io_bus, когда send_enable равен 1, в противном случае — Z
  3. Добавьте оператор 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
quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

Все уроки раздела Основы