Skip to content
Kuznetsov Nikolai edited this page Feb 23, 2026 · 5 revisions

Постановка задачи и требования

1. Описание проблемы

Ripes - визуальный симулятор компьютерной архитектуры RISC-V, предназначенный для обучения и экспериментов. Подсистема Memory-Mapped I/O (MMIO) позволяет эмулировать взаимодействие процессора с периферийными устройствами. На данный момент в Ripes реализованы три устройства:

  • LED Matrix - матрица светодиодов с поддержкой RGB (24-bit цвет на пиксель).
  • Switches - набор переключателей (toggle), состояние которых читается процессором через регистр.
  • D-Pad - четырёхнаправленный джойстик (Up/Down/Left/Right), управляемый кнопками или клавишами WASD.

Этих устройств недостаточно для полноценной демонстрации взаимодействия процессора с типовой периферией. Отсутствуют:

  1. Устройство текстового ввода (клавиатура) - нет возможности передать символьный ввод в эмулируемую программу. D-Pad даёт лишь 4 дискретных направления и не заменяет полноценную клавиатуру.
  2. Числовой дисплей (семисегментный индикатор) - LED-матрица подходит для произвольной графики, но неудобна для отображения числовых значений. Семисегментный дисплей - каноническое устройство embedded-систем, знакомство с которым важно для обучения.
  3. Устройство позиционного ввода (мышь) - нет механизма для передачи координат указателя и состояния кнопок мыши в эмулируемую программу.

Реализация этих трёх устройств расширит возможности Ripes как учебной платформы и закроет ключевые пробелы в моделировании ввода-вывода.


2. Категории пользователей

Студенты

  • Изучают принципы работы MMIO, регистровые карты, взаимодействие «процессор ↔ периферия».
  • Важно: простота использования, наглядность виджетов, наличие примеров кода (ассемблер и C), понятная документация.

Преподаватели

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

Разработчики embedded-систем

  • Прототипируют алгоритмы обработки ввода (клавиатура, мышь) или отображения (семисегментный дисплей) без реального оборудования.
  • Важно: реалистичная регистровая модель, поддержка polling, предсказуемые адреса в memory map.

Контрибьюторы Ripes

  • Будут расширять или модифицировать реализацию.
  • Важно: соответствие архитектуре проекта (IOBase, IORegistry, IOManager), чистый код, тесты, документация.

3. Требования к устройствам

3.1. QWERTY-клавиатура

Функциональные требования

ID Требование
KB-F01 Устройство наследует IOBase и регистрируется в IORegistry (IOType::KEYBOARD).
KB-F02 Перехватывает события keyPressEvent/keyReleaseEvent хостовой клавиатуры, когда виджет устройства в фокусе (аналогично IODPad).
KB-F03 Предоставляет MMIO-регистры для чтения последнего нажатого символа и состояния «есть непрочитанный символ» (status/data, по аналогии с UART-подобным протоколом).
KB-F04 Регистр статуса (read-only): бит 0 = 1, если есть непрочитанные данные.
KB-F05 Регистр данных (read-only): ASCII-код последнего нажатого символа. Чтение регистра данных сбрасывает бит готовности в регистре статуса.
KB-F06 Поддержка буфера ввода (FIFO) для обработки быстрых последовательностей нажатий. Размер буфера - параметр устройства (IOParam).
KB-F07 Раскладка QWERTY. Передаются стандартные печатные ASCII-символы, Enter (0x0A), Backspace (0x08), Escape (0x1B), пробел (0x20).
KB-F08 Виджет отображает визуальное представление клавиатуры с подсветкой нажатых клавиш.
KB-F09 Экспортирует символы для ассемблера/C: KEYBOARD_BASE, KEYBOARD_SIZE, KEYBOARD_STATUS, KEYBOARD_DATA.
KB-F10 Реализует reset() - очистка FIFO-буфера и регистров при сбросе процессора.

Нефункциональные требования

ID Требование
KB-N01 Визуальный отклик нажатия клавиши - не более 1 кадра отрисовки (через emit scheduleUpdate()).
KB-N02 Корректная работа в многопоточном окружении: ioRead/ioWrite вызываются из потока симулятора, обновление UI - из главного потока.
KB-N03 Сериализация параметров через cereal (механизм IOBase::serialize).
KB-N04 Покрытие unit-тестами: чтение/запись регистров, работа FIFO, сброс.

3.2. Семисегментный дисплей

Функциональные требования

ID Требование
SS-F01 Устройство наследует IOBase и регистрируется в IORegistry (IOType::SEVEN_SEGMENT).
SS-F02 Параметр IOParam: количество отображаемых разрядов (от 1 до 8).
SS-F03 Каждый разряд управляется 8-битным регистром (write): 7 сегментов (биты 0–6) + десятичная точка (бит 7).
SS-F04 Предоставляет регистровую карту: N регистров по 4 байта (word-aligned), по одному на разряд. Адрес разряда i = i * 4.
SS-F05 Экспортирует символы: SEVENSEG_BASE, SEVENSEG_SIZE, SEVENSEG_N_DIGITS, а также SEVENSEG_0SEVENSEG_N-1 для адресов каждого разряда.
SS-F06 Виджет отрисовывает семисегментные индикаторы в реальном времени: каждый сегмент подсвечивается в зависимости от значения регистра.
SS-F07 Поддерживается отображение минуса (сегмент g), точки (бит 7), пустого знака (все сегменты погашены).
SS-F08 Реализует reset() - все регистры обнуляются, дисплей гасится.
SS-F09 Параметр IOParam: размер одного индикатора (аналогично LED size в IOLedMatrix).
SS-F10 ioRead возвращает текущее значение регистра разряда (read-back).

Нефункциональные требования

ID Требование
SS-N01 Обновление отрисовки через emit scheduleUpdate() при каждой записи в регистр.
SS-N02 Поддержка динамического изменения количества разрядов без перезапуска симуляции (через parameterChanged → пересчёт m_regDescs, emit regMapChanged()).
SS-N03 Корректная работа minimumSizeHint() для автоматического масштабирования виджета.
SS-N04 Покрытие unit-тестами: запись сегментов, чтение-back, изменение числа разрядов.

3.3. Мышь

Функциональные требования

ID Требование
MS-F01 Устройство наследует IOBase и регистрируется в IORegistry (IOType::MOUSE).
MS-F02 Отслеживает позицию курсора (x, y) в пределах виджета устройства, обрабатывая mouseMoveEvent.
MS-F03 Отслеживает состояние кнопок: левая, правая, средняя (колёсико) - через mousePressEvent/mouseReleaseEvent.
MS-F04 Отслеживает скролл (delta) через wheelEvent.
MS-F05 Регистровая карта (все регистры read-only для процессора):
- X (offset 0x00): координата X курсора (32 бит).
- Y (offset 0x04): координата Y курсора (32 бит).
- BUTTONS (offset 0x08): бит 0 = левая кнопка, бит 1 = правая, бит 2 = средняя (1 - нажата).
- SCROLL (offset 0x0C): знаковое значение последнего скролла (32 бит, signed). Чтение сбрасывает значение в 0.
MS-F06 Экспортирует символы: MOUSE_BASE, MOUSE_SIZE, MOUSE_X, MOUSE_Y, MOUSE_BUTTONS, MOUSE_SCROLL.
MS-F07 Виджет отображает область захвата мыши с визуализацией текущей позиции курсора (перекрестие) и состояния кнопок.
MS-F08 Параметры IOParam: ширина и высота области захвата (в пикселях).
MS-F09 Реализует reset() - координаты в (0, 0), кнопки отпущены, скролл = 0.
MS-F10 Координаты ограничены размерами виджета (0 ≤ x < width, 0 ≤ y < height).

Нефункциональные требования

ID Требование
MS-N01 Обновление координат и кнопок доступно процессору немедленно (на следующем цикле чтения MMIO).
MS-N02 Отрисовка перекрестия через emit scheduleUpdate().
MS-N03 Корректная потокобезопасность: события мыши приходят из главного потока, ioRead - из потока симулятора.
MS-N04 Покрытие unit-тестами: чтение координат, кнопок, скролла, сброс.

4. Сценарии использования (Use Cases)

4.1. Клавиатура

UC-KB-01: Ввод символа с клавиатуры

Поле Описание
Название Ввод символа с клавиатуры
Акторы Пользователь (студент/преподаватель), эмулируемая программа
Предусловия Устройство Keyboard создано во вкладке I/O, программа загружена и запущена, виджет клавиатуры в фокусе.
Основной поток 1. Пользователь нажимает клавишу (например, A) на хостовой клавиатуре. 2. Виджет перехватывает событие, ASCII-код символа помещается в FIFO-буфер. 3. Бит готовности в регистре статуса устанавливается в 1. 4. Эмулируемая программа читает регистр статуса, обнаруживает готовность. 5. Программа читает регистр данных, получает ASCII-код 0x61 ('a'). 6. Бит готовности сбрасывается (или указывает на следующий символ в буфере).
Альтернативные потоки А1. Буфер пуст - программа читает статус, бит готовности = 0, программа продолжает polling. А2. Буфер переполнен - новые нажатия игнорируются до освобождения места.
Постусловия Символ прочитан программой, буфер обновлён.

UC-KB-02: Быстрый последовательный ввод

Поле Описание
Название Быстрый набор нескольких символов
Акторы Пользователь, эмулируемая программа
Предусловия Устройство Keyboard активно, программа выполняется.
Основной поток 1. Пользователь быстро набирает строку «Hi». 2. Символы H, i помещаются в FIFO в порядке нажатия. 3. Программа в цикле вычитывает символы из регистра данных, пока статус показывает наличие данных.
Альтернативные потоки А1. Программа читает медленнее, чем пользователь вводит - буфер накапливает символы. При переполнении - см. UC-KB-01/А2.
Постусловия Все символы прочитаны в правильном порядке.

4.2. Семисегментный дисплей

UC-SS-01: Отображение числа на дисплее

Поле Описание
Название Отображение десятичного числа
Акторы Эмулируемая программа, пользователь (наблюдатель)
Предусловия Устройство Seven-Segment Display создано, параметр «количество разрядов» = 4. Программа загружена.
Основной поток 1. Программа записывает в регистры разрядов значения сегментов, соответствующие цифрам «1», «2», «3», «4». 2. При каждой записи вызывается emit scheduleUpdate(). 3. Виджет перерисовывается, отображая «1234».
Альтернативные потоки А1. Программа записывает значение с установленным битом точки (бит 7) - отображается цифра с десятичной точкой (например, «12.34»).
Постусловия Дисплей визуально показывает записанное число.

UC-SS-02: Изменение количества разрядов во время работы

Поле Описание
Название Динамическое изменение числа разрядов
Акторы Пользователь (преподаватель)
Предусловия Устройство создано с 4 разрядами, программа остановлена.
Основной поток 1. Пользователь меняет параметр «# Digits» на 6 в панели параметров. 2. Вызывается parameterChanged(). 3. Регистровая карта пересчитывается (m_regDescs), emit regMapChanged(). 4. Виджет обновляет layout, теперь отображает 6 индикаторов. 5. Экспортированные символы обновляются (SEVENSEG_N_DIGITS = 6).
Альтернативные потоки А1. Пользователь уменьшает количество разрядов - лишние регистры и виджеты удаляются.
Постусловия Устройство корректно работает с новым числом разрядов.

UC-SS-03: Отображение отрицательного числа

Поле Описание
Название Отображение минуса
Акторы Эмулируемая программа, пользователь
Предусловия Дисплей с ≥ 2 разрядами, программа запущена.
Основной поток 1. Программа записывает в старший разряд значение 0x40 (только сегмент g - горизонтальная полоса, т.е. знак «−»). 2. В младший разряд записывает код цифры «5». 3. Дисплей отображает «−5».
Альтернативные потоки Нет.
Постусловия Дисплей корректно визуализирует минус и цифру.

4.3. Мышь

UC-MS-01: Чтение координат курсора

Поле Описание
Название Получение координат мыши эмулируемой программой
Акторы Пользователь, эмулируемая программа
Предусловия Устройство Mouse создано, программа запущена.
Основной поток 1. Пользователь перемещает курсор в области виджета мыши. 2. Виджет обрабатывает mouseMoveEvent, обновляет внутренние значения X и Y. 3. Программа читает регистры MOUSE_X и MOUSE_Y, получает текущие координаты. 4. Виджет отрисовывает перекрестие в позиции курсора.
Альтернативные потоки А1. Курсор вне виджета - координаты сохраняют последнее валидное значение.
Постусловия Программа получила актуальные координаты.

UC-MS-02: Обработка нажатия кнопки мыши

Поле Описание
Название Нажатие и отпускание кнопки мыши
Акторы Пользователь, эмулируемая программа
Предусловия Устройство Mouse активно, программа выполняется.
Основной поток 1. Пользователь нажимает левую кнопку мыши в области виджета. 2. Бит 0 регистра BUTTONS устанавливается в 1. 3. Программа читает регистр BUTTONS, обнаруживает нажатие. 4. Пользователь отпускает кнопку - бит 0 сбрасывается в 0.
Альтернативные потоки А1. Одновременное нажатие нескольких кнопок - соответствующие биты устанавливаются одновременно (бит 0 + бит 1 = левая + правая).
Постусловия Регистр кнопок отражает актуальное состояние.

UC-MS-03: Обработка скролла

Поле Описание
Название Чтение значения скролла
Акторы Пользователь, эмулируемая программа
Предусловия Устройство Mouse активно, курсор над виджетом, программа выполняется.
Основной поток 1. Пользователь прокручивает колёсико мыши вверх. 2. Значение delta записывается в регистр SCROLL (положительное). 3. Программа читает регистр SCROLL, получает значение. 4. После чтения значение регистра сбрасывается в 0.
Альтернативные потоки А1. Скролл вниз - значение отрицательное (signed 32-bit). А2. Множественные скроллы без чтения - значения накапливаются (суммируются).
Постусловия Значение скролла прочитано и сброшено.

5. Макеты UI

Макет UI - Клавиатура

Макет UI - Семисегментный дисплей

Макет UI - Мышь

Clone this wiki locally