Menu
Coddy logo textTech

Проектирование передатчика

Часть раздела Основы путешествия по Verilog на Coddy — урок 89 из 90.

challenge icon

Задание

В этом уроке вы завершите создание передатчика UART, добавив сдвиговый регистр для отправки любого байта, а не только фиксированной буквы 'A'.

Сдвиговый регистр загружает полный кадр (стоп-бит + 8 бит данных + старт-бит) и сдвигает его по одному биту за раз.

Формат кадра

Стоп (1)Данные (8 бит)Старт (0)
1data_in0

Например, если data_in = 8'b01000001 (буква 'A'), сдвиговый регистр принимает вид: 1 01000001 0

Ваша задача

Вам дана машина состояний из предыдущего урока (которая передает фиксированный байт). Вам нужно изменить ее так, чтобы она отправляла любой байт со входа data_in.

Что нужно сделать:

  1. Добавьте input [7:0] с именем data_in в список портов (внутри круглых скобок)
  2. Добавьте 10-битный reg с именем shift_reg вне круглых скобок (внутри тела модуля, так как это внутренний сигнал)
  3. Когда cnt == 0 и start == 1:
    1. Загрузите в shift_reg значение {1'b1, data_in, 1'b0}
  4. Когда cnt находится в диапазоне от 1 до 8:
    1. Отправьте tx <= shift_reg[0]
    2. Выполните сдвиг вправо: shift_reg <= shift_reg >> 1
  5. Когда cnt == 9:
    1. Отправьте tx <= shift_reg[0]
    2. Выполните сдвиг вправо: 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

Все уроки раздела Основы