Входные и выходные порты
Часть раздела Основы путешествия по 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Правила для выходов:
- Могут быть
wire(сassign) илиreg(сalways) - Должны управляться чем-то внутри модуля
Синтаксис объявления портов
Синтаксис объявления портов — это определённый способ записи входных и выходных портов в модуле. Он сообщает Verilog три вещи о каждом порте:
- Направление — это input, output или inout?
- Размер — сколько бит составляет его ширина?
- Имя — как оно называется?
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Задание
Завершите объявление портов
Что нужно сделать:
- Добавьте 8-битный вход
data_in - Добавьте однобитный вход
clk - Добавьте 4-битный выход
result(используйте reg — значение будет присваиваться в блоке always) - Добавьте однобитный выход
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В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Основы
1Введение
Что такое VerilogHardware против SoftwareУровни абстракции проектированияВаш первый модульКомментарии4Операторы. Часть 1
Арифметические операторыОператор остатка от деленияОператоры сравненияПовторение: простая математикаПобитовые операторы7Оператор Assign и логические вентили
Непрерывное присваиваниеAssign с операторамиВстроенные примитивы вентилейВентили AND, OR, NOTВентили XOR, XNORИтоги: Схемы на логических вентилях10Принятие решений
Оператор ifКонструкция if - elseПовторение: простой компараторОператор caseОператоры casex и casezПовторение: проектирование ALU5Операторы. Часть 2
Логические операторыОператоры редукцииОператоры сдвигаОператор конкатенацииУсловный операторПовторение — Испытание по операторам3Системы счисления
Двоичное представлениеЧисла с заданным размеромЧисла без заданного размераОтрицательные числаСпециальные значения X и ZИтоги — форматы чисел6Модули
Структура модуляВходные и выходные портыПорты InoutИнстанцирование модуляПодключение портов по имениПодключение портов по порядкуИтоги: создание модуля9Процедурные блоки
Блок alwaysБлок initialСписок чувствительностиБлокирующее присваиваниеНеблокирующее присваиваниеИтоги: always против initial