Menu
Coddy logo textTech

Input And Output Ports

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

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

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

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

Input порты

Input порты получают data извне. Их нельзя изменять внутри module: можно только read.

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

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

  • Нельзя присвоить значение внутри module
  • Нельзя объявить как 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. Направление: это 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:

  • Какие сигналы модуль can read (inputs)
  • Какие сигналы модуль can write (outputs)
  • Какие типы соединений разрешены

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

Пример кода

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