Menu
Coddy logo textTech

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

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

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

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

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

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

Входные порты получают 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:

  • Какие сигналы module can read (inputs)
  • Какие сигналы module can write (выходы)
  • Какие типы соединений разрешены

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

Пример кода

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. Add 8-битный input called data_in
  2. Add однобитный input called clk
  3. Add 4-битный output called result (используйте reg: будет присвоено в блоке always)
  4. Add однобитный output called 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