Menu
CoddyTech

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

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

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

У каждого модуля есть:

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

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

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

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

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

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

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

Выходные порты передают данные наружу. Ими могут управлять блоки assign или always.

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

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

  • Может быть wire (с assign) или reg (с always)
  • Должен управляться чем-либо внутри модуля

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

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

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

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

Направление указывает 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Проверьте себя

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

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

Потренируйтесь самостоятельно: Онлайн-компилятор Verilog