Входные и выходные порты
Часть раздела Основы путешествия по 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 три вещи о каждом порте:
- Направление: это 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 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Задание
Завершите объявления портов
Что нужно сделать:
- Add 8-битный input called
data_in - Add однобитный input called
clk - Add 4-битный output called
result(используйте reg: будет присвоено в блоке always) - 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В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Основы
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