Входные и выходные порты
Часть раздела Основы путешествия по 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 три вещи о каждом порте:
- Направление: это вход, выход или ввод-вывод?
- Размер: сколько в нём бит?
- Название: как оно называется?
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Задание
Завершите объявления портов
Что нужно сделать:
- Добавьте 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Введение
Что такое VerilogАппаратное и программное обеспечениеВаш первый модульКомментарииУровни абстракции проектирования4Операторы. Часть 1
Арифметические операторыОператор взятия остаткаОператоры сравненияПовторение — простая математикаПобитовые операторы7Присваивание и логические элементы
Непрерывное присваиваниеПрисваивание с операторамиВстроенные примитивы логических элементовЭлементы И, ИЛИ и НЕЭлементы XOR и XNORПовторение — схема на логических элементах10Принятие решений
Оператор ifif—elseПовторение — простой компараторОператор casecaseх и casezПовторение — проектирование ALU5Операторы, часть 2
Логические операторыОператоры свёрткиОператоры сдвигаОператор конкатенацииУсловный операторПовторение — задание на операторы11Циклы
Цикл forЦикл whileЦикл повторенияБесконечный циклОператор отключенияПовторение — шаблоны циклов3Система счисления
Двоичное представлениеЧисла заданной разрядностиЧисла без указания разрядностиОтрицательные числаСпециальные значения X и ZПовторение — форматы чисел6Модули
Структура модуляВходные и выходные портыДвунаправленные портыСоздание экземпляра модуляПодключение портов по имениПодключение портов по порядкуПовторение — создание модуля9Процедурные блоки
Блок AlwaysБлок InitialСписок чувствительностиБлокирующее присваиваниеНеблокирующее присваиваниеПовторение: Always и InitialПотренируйтесь самостоятельно: Онлайн-компилятор Verilog