Проектирование передатчика
Часть раздела Основы путешествия по Verilog на Coddy — урок 89 из 90.
Задание
В этом уроке вы завершите создание передатчика UART, добавив сдвиговый регистр для отправки любого байта, а не только фиксированной буквы 'A'.
Сдвиговый регистр загружает полный кадр (стоп-бит + 8 бит данных + старт-бит) и сдвигает его по одному биту за раз.
Формат кадра
| Стоп (1) | Данные (8 бит) | Старт (0) |
|---|---|---|
| 1 | data_in | 0 |
Например, если data_in = 8'b01000001 (буква 'A'), сдвиговый регистр принимает вид: 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, // НОВОЕ: сигнал start для начала передачи
output reg tx, // НОВОЕ: линия последовательного вывода
output reg [3:0] cnt // Оставить как выход для тестирования
);
initial begin
cnt = 0;
tx = 1; // НОВОЕ: установить tx в HIGH (состояние ожидания)
end
always @(posedge clk) begin
// НОВОЕ: Логика счетчика с условием запуска
if (cnt == 0 && start) begin // НОВОЕ: начать передачу
cnt <= 1;
end
else if (cnt > 0 && cnt < 9) begin // НОВОЕ: считать во время передачи
cnt <= cnt + 1;
end
else if (cnt == 9) begin // НОВОЕ: сброс после последнего бита
cnt <= 0;
end
end
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