Menu
Coddy logo textTech

Входные и выходные порты

Часть раздела Основы путешествия по Verilog на Coddy — урок 31 из 90.

Входные и выходные порты — это соединения, которые позволяют модулю взаимодействовать с внешним миром. Они похожи на выводы микросхемы. Порты представляют собой интерфейс между модулем и остальной частью проекта.

Каждый модуль имеет:

  • Входные порты — сигналы, которые поступают вперёд/внутри модуля
  • Выходные порты — сигналы, которые выходят из модуля

Входные порты

Входные порты получают данные извне. Их нельзя изменять внутри модуля — только читать.

input clk;        // Однобитный вход
input [7:0] data; // 8-битный входной вектор
input a, b;       // Несколько входов на одной строке

Правила для inputs:

  • Нельзя присваивать значение внутри module
  • Не могут объявляться как reg
  • Всегда wire (по умолчанию)

Output Ports

Output ports отправляют данные наружу. Они могут управляться блоками assign или always.

output out;           // Однобитный выход
output [3:0] result;  // 4-битный выход
output reg busy;      // Выход может быть reg
output wire ready;    // Выход может быть wire

Правила для выходов:

  • Могут быть wireassign) или regalways)
  • Должны управляться чем-то внутри модуля

Синтаксис объявления портов

Синтаксис объявления портов — это определённый способ записи входных и выходных портов в модуле. Он сообщает Verilog три вещи о каждом порте:

  1. Направление — это input, output или inout?
  2. Размер — сколько бит составляет его ширина?
  3. Имя — как оно называется?
module example (
  input [7:0] data_in,    // Входной вектор
  input clk,              // Одиночный вход
  input enable,           // Одиночный вход
  output reg [7:0] out,   // Выходной reg
  output busy             // Выходной wire
);

Почему направление портов имеет значение

Направление указывает Verilog:

  • Какие сигналы модуль может читать (входы)
  • Какие сигналы модуль может писать (выходы)
  • Какие типы соединений разрешены

Использование неправильного направления приводит к ошибкам компиляции.

Пример кода

module port_demo (
  input [3:0] a,        // Можно только читать
  input [3:0] b,        // Можно только читать
  output reg [3:0] sum, // Можно писать (reg)
  output [3:0] diff     // Можно писать (wire)
);
  always @(*) begin
    sum = a + b;        // Запись в выходной reg
  end
  
  assign diff = a - b;   // Запись в выходной wire
endmodule
challenge icon

Задание

Завершите объявление портов

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

  1. Добавьте 8-битный вход data_in
  2. Добавьте однобитный вход clk
  3. Добавьте 4-битный выход result (используйте reg — значение будет присваиваться в блоке always)
  4. Добавьте однобитный выход valid (используйте wire — значение будет присваиваться с помощью assign)

Попробуйте сами

module port_challenge (
  // Задача 1: Добавьте 8-битный вход с именем data_in
  
  
  // Задача 2: Добавьте однобитный вход с именем clk
  
  
  // Задача 3: Добавьте 4-битный выход с именем result (используйте reg)
  
  
  // Задача 4: Добавьте однобитный выход с именем valid (используйте wire)
  
  
);

  reg [3:0] counter;
  
  always @(posedge clk) begin
    counter <= counter + 1;
    result <= counter;
  end
  
  assign valid = (counter > 8);
  
endmodule
quiz iconПроверьте себя

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

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