-
Notifications
You must be signed in to change notification settings - Fork 28
Problem 11: UART MMIO
Это задание посвящено подключению передатчика UART к микропроцессору RISC-V через MMIO. После его выполнения микропроцессор будет способен передавать данные на ПК.
Перейдите в каталог problems/11_uart_mmio
в вашей локальной копии репозитория. Для синхронизации локального репозтория используется команда git pull
.
Проверьте, что уже реализованный CPU из каталога с заданием работает. Посмотрите, как изменились mem_ctrl.v
и cpu_top.v
по сравнению с последним заданием. Теперь логика работы с MMIO разнесена между mem_ctrl.v
и cpu_top.v
. Обратите внимание на сигналы io_data
, io_line
, io_we
. С помощью симулятора и тестовой программы samples/no_uart.txt
посмотрите, как работает вывод на 7-сегментный индикатор и какие шины для этого используются.
Выберите область адресов, по которому через MMIO будет доступны входы data
и start
передатчика UART. Эта область не должна пересекаться с 0x20-0x21
, так как этот диапазон занят 7-сегментным индикатором.
Вопрос: сколько байт будет занимать эта область?
В файлах mem_ctrl.v
и cpu_top.v
опишите, что должно происходить при записи в область MMIO-адресов, выделенную для UART. Можно использовать mmio_addr
и io_line
как переключатель между 7-сегментным индикатором и UART (1'b0
- индикатор, 1'b1
- UART).
По аналогии с data_out0
, опишите выход CPU, данные из которого будет использовать передатчик UART.
В файле testbench.v
создайте экземпляр модуля uart_tx
и подсоедините его к cpu_top
. Не забудьте, что передатчик управляется 2-мя входами: data
(передаваемые данные) и start
(сигнал начала передачи).
В программе samples/uart_tx.s
предполагается, что передаваемый байт кладётся по адресу 0x30
, а сигнал start
представлен младшим битом в байте по адресу 0x31
. Если вы выбрали для UART другой диапазон MMIO-адресов, переделайте программу samples/uart_tx.s
.
С помощью симулятора и программы samples/uart_tx.s
проверьте, что uart_tx
корректно принимает данные от процессора, а флаг start
поднимается на 1 такт для начала передачи.
Доделайте модуль top.v
и скомпилируйте проект. На ПК откройте соединение через serial-порт /dev/ttyUSB0
на скорости 9600 бит/с. Сделать это можно так:
sudo cu -l /dev/ttyUSB0 -s 9600
Затем загрузите прошивку в FPGA. Сразу после этого микропроцессор должен запуститься и отправить через UART букву F
.
Запустите программу samples/uart_tx2.s
В ней тоже предполагается, что флаг start
и байт данных нужно записывать по адресу 0x30
. Эта программа непрерывно с небольшой задержкой печатает символы FPGA\r\n
.
Вопрос: какая наименьшая задержка (в тактах) должна быть между попытками отправить символ через UART, если он работает на скорости 9600 бит/с, а CPU работает на частоте 50МГц? Что произойдет, если задержку не сделать?
Вопрос (**): как можно бороться с этой проблемой?