Проектирование передатчика
Часть раздела Основы путешествия по Verilog на Coddy. Урок 89 из 90.
Задание
В этом уроке вы завершите передатчик UART, добавив shift register для отправки любого байта, а не только фиксированной буквы 'A'.
shift register загружает полный кадр (стоповый бит + 8 бит данных + стартовый бит) и сдвигает его по одному биту за раз.
Формат кадра
| Stop (1) | Data (8 bits) | Start (0) |
|---|---|---|
| 1 | data_in | 0 |
Например, если data_in = 8'b01000001 (буква 'A'), shift register становится таким: 1 01000001 0
Ваша задача
Вам дана машина состояний из предыдущего урока (передающая фиксированный байт). Вам нужно изменить её, чтобы отправлять любой байт из входа data_in.
Что нужно сделать:
- Добавьте
input [7:0]с именемdata_inв список портов (внутри скобок) - Добавьте 10-битный
regс именемshift_regвне скобок (внутри тела модуля, поскольку это внутренний сигнал) - Когда
cnt == 0иstart == 1:- Загрузите в
shift_regзначение{1'b1, data_in, 1'b0}
- Загрузите в
- Когда значение
cntнаходится между 1 и 8:- Отправьте
tx <= shift_reg[0] - Сдвиньте вправо:
shift_reg <= shift_reg >> 1
- Отправьте
- Когда
cnt == 9:- Отправьте
tx <= shift_reg[0] - Сдвиньте вправо:
shift_reg <= shift_reg >> 1
- Отправьте
Попробуйте сами
module uart_tx (
input clk,
input start, // NEW: сигнал start для начала передачи
output reg tx, // NEW: линия последовательного вывода
output reg [3:0] cnt // Оставить как выход для тестирования
);
initial begin
cnt = 0;
tx = 1; // NEW: установить tx в HIGH (состояние простоя)
end
always @(posedge clk) begin
// NEW: логика счётчика с условием start
if (cnt == 0 && start) begin // NEW: начать передачу
cnt <= 1;
end
else if (cnt > 0 && cnt < 9) begin // NEW: считать во время передачи
cnt <= cnt + 1;
end
else if (cnt == 9) begin // NEW: сброс после последнего бита
cnt <= 0;
end
end
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