Skip to content

Problem 11: UART MMIO

Viktor Prutyanov edited this page Dec 3, 2019 · 1 revision

UART MMIO

Это задание посвящено подключению передатчика UART к микропроцессору RISC-V через MMIO. После его выполнения микропроцессор будет способен передавать данные на ПК.

Подготовка

Перейдите в каталог problems/11_uart_mmio в вашей локальной копии репозитория. Для синхронизации локального репозтория используется команда git pull.

Задача №1

Проверьте, что уже реализованный 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-сегментный индикатор и какие шины для этого используются.

Задача №2

Выберите область адресов, по которому через 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 такт для начала передачи.

Задача №3

Доделайте модуль top.v и скомпилируйте проект. На ПК откройте соединение через serial-порт /dev/ttyUSB0 на скорости 9600 бит/с. Сделать это можно так:

sudo cu -l /dev/ttyUSB0 -s 9600

Затем загрузите прошивку в FPGA. Сразу после этого микропроцессор должен запуститься и отправить через UART букву F.

Задача №4

Запустите программу samples/uart_tx2.s В ней тоже предполагается, что флаг start и байт данных нужно записывать по адресу 0x30. Эта программа непрерывно с небольшой задержкой печатает символы FPGA\r\n.

Вопрос: какая наименьшая задержка (в тактах) должна быть между попытками отправить символ через UART, если он работает на скорости 9600 бит/с, а CPU работает на частоте 50МГц? Что произойдет, если задержку не сделать?

Вопрос (**): как можно бороться с этой проблемой?