forked from mortbopet/Ripes
-
Notifications
You must be signed in to change notification settings - Fork 0
Home
Kuznetsov Nikolai edited this page Feb 23, 2026
·
5 revisions
Ripes - визуальный симулятор компьютерной архитектуры RISC-V, предназначенный для обучения и экспериментов. Подсистема Memory-Mapped I/O (MMIO) позволяет эмулировать взаимодействие процессора с периферийными устройствами. На данный момент в Ripes реализованы три устройства:
- LED Matrix - матрица светодиодов с поддержкой RGB (24-bit цвет на пиксель).
- Switches - набор переключателей (toggle), состояние которых читается процессором через регистр.
- D-Pad - четырёхнаправленный джойстик (Up/Down/Left/Right), управляемый кнопками или клавишами WASD.
Этих устройств недостаточно для полноценной демонстрации взаимодействия процессора с типовой периферией. Отсутствуют:
- Устройство текстового ввода (клавиатура) - нет возможности передать символьный ввод в эмулируемую программу. D-Pad даёт лишь 4 дискретных направления и не заменяет полноценную клавиатуру.
- Числовой дисплей (семисегментный индикатор) - LED-матрица подходит для произвольной графики, но неудобна для отображения числовых значений. Семисегментный дисплей - каноническое устройство embedded-систем, знакомство с которым важно для обучения.
- Устройство позиционного ввода (мышь) - нет механизма для передачи координат указателя и состояния кнопок мыши в эмулируемую программу.
Реализация этих трёх устройств расширит возможности Ripes как учебной платформы и закроет ключевые пробелы в моделировании ввода-вывода.
- Изучают принципы работы MMIO, регистровые карты, взаимодействие «процессор ↔ периферия».
- Важно: простота использования, наглядность виджетов, наличие примеров кода (ассемблер и C), понятная документация.
- Используют Ripes для демонстраций и лабораторных работ.
- Важно: конфигурируемость устройств (количество цифр дисплея, параметры мыши), воспроизводимость результатов, возможность предложить студентам задания с использованием новых устройств.
- Прототипируют алгоритмы обработки ввода (клавиатура, мышь) или отображения (семисегментный дисплей) без реального оборудования.
- Важно: реалистичная регистровая модель, поддержка polling, предсказуемые адреса в memory map.
- Будут расширять или модифицировать реализацию.
- Важно: соответствие архитектуре проекта (
IOBase,IORegistry,IOManager), чистый код, тесты, документация.
| 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, сброс. |
| 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_0…SEVENSEG_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, изменение числа разрядов. |
| 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-тестами: чтение координат, кнопок, скролла, сброс. |
| Поле | Описание |
|---|---|
| Название | Ввод символа с клавиатуры |
| Акторы | Пользователь (студент/преподаватель), эмулируемая программа |
| Предусловия | Устройство Keyboard создано во вкладке I/O, программа загружена и запущена, виджет клавиатуры в фокусе. |
| Основной поток | 1. Пользователь нажимает клавишу (например, A) на хостовой клавиатуре. 2. Виджет перехватывает событие, ASCII-код символа помещается в FIFO-буфер. 3. Бит готовности в регистре статуса устанавливается в 1. 4. Эмулируемая программа читает регистр статуса, обнаруживает готовность. 5. Программа читает регистр данных, получает ASCII-код 0x61 ('a'). 6. Бит готовности сбрасывается (или указывает на следующий символ в буфере). |
| Альтернативные потоки | А1. Буфер пуст - программа читает статус, бит готовности = 0, программа продолжает polling. А2. Буфер переполнен - новые нажатия игнорируются до освобождения места. |
| Постусловия | Символ прочитан программой, буфер обновлён. |
| Поле | Описание |
|---|---|
| Название | Быстрый набор нескольких символов |
| Акторы | Пользователь, эмулируемая программа |
| Предусловия | Устройство Keyboard активно, программа выполняется. |
| Основной поток | 1. Пользователь быстро набирает строку «Hi». 2. Символы H, i помещаются в FIFO в порядке нажатия. 3. Программа в цикле вычитывает символы из регистра данных, пока статус показывает наличие данных. |
| Альтернативные потоки | А1. Программа читает медленнее, чем пользователь вводит - буфер накапливает символы. При переполнении - см. UC-KB-01/А2. |
| Постусловия | Все символы прочитаны в правильном порядке. |
| Поле | Описание |
|---|---|
| Название | Отображение десятичного числа |
| Акторы | Эмулируемая программа, пользователь (наблюдатель) |
| Предусловия | Устройство Seven-Segment Display создано, параметр «количество разрядов» = 4. Программа загружена. |
| Основной поток | 1. Программа записывает в регистры разрядов значения сегментов, соответствующие цифрам «1», «2», «3», «4». 2. При каждой записи вызывается emit scheduleUpdate(). 3. Виджет перерисовывается, отображая «1234». |
| Альтернативные потоки | А1. Программа записывает значение с установленным битом точки (бит 7) - отображается цифра с десятичной точкой (например, «12.34»). |
| Постусловия | Дисплей визуально показывает записанное число. |
| Поле | Описание |
|---|---|
| Название | Динамическое изменение числа разрядов |
| Акторы | Пользователь (преподаватель) |
| Предусловия | Устройство создано с 4 разрядами, программа остановлена. |
| Основной поток | 1. Пользователь меняет параметр «# Digits» на 6 в панели параметров. 2. Вызывается parameterChanged(). 3. Регистровая карта пересчитывается (m_regDescs), emit regMapChanged(). 4. Виджет обновляет layout, теперь отображает 6 индикаторов. 5. Экспортированные символы обновляются (SEVENSEG_N_DIGITS = 6). |
| Альтернативные потоки | А1. Пользователь уменьшает количество разрядов - лишние регистры и виджеты удаляются. |
| Постусловия | Устройство корректно работает с новым числом разрядов. |
| Поле | Описание |
|---|---|
| Название | Отображение минуса |
| Акторы | Эмулируемая программа, пользователь |
| Предусловия | Дисплей с ≥ 2 разрядами, программа запущена. |
| Основной поток | 1. Программа записывает в старший разряд значение 0x40 (только сегмент g - горизонтальная полоса, т.е. знак «−»). 2. В младший разряд записывает код цифры «5». 3. Дисплей отображает «−5». |
| Альтернативные потоки | Нет. |
| Постусловия | Дисплей корректно визуализирует минус и цифру. |
| Поле | Описание |
|---|---|
| Название | Получение координат мыши эмулируемой программой |
| Акторы | Пользователь, эмулируемая программа |
| Предусловия | Устройство Mouse создано, программа запущена. |
| Основной поток | 1. Пользователь перемещает курсор в области виджета мыши. 2. Виджет обрабатывает mouseMoveEvent, обновляет внутренние значения X и Y. 3. Программа читает регистры MOUSE_X и MOUSE_Y, получает текущие координаты. 4. Виджет отрисовывает перекрестие в позиции курсора. |
| Альтернативные потоки | А1. Курсор вне виджета - координаты сохраняют последнее валидное значение. |
| Постусловия | Программа получила актуальные координаты. |
| Поле | Описание |
|---|---|
| Название | Нажатие и отпускание кнопки мыши |
| Акторы | Пользователь, эмулируемая программа |
| Предусловия | Устройство Mouse активно, программа выполняется. |
| Основной поток | 1. Пользователь нажимает левую кнопку мыши в области виджета. 2. Бит 0 регистра BUTTONS устанавливается в 1. 3. Программа читает регистр BUTTONS, обнаруживает нажатие. 4. Пользователь отпускает кнопку - бит 0 сбрасывается в 0. |
| Альтернативные потоки | А1. Одновременное нажатие нескольких кнопок - соответствующие биты устанавливаются одновременно (бит 0 + бит 1 = левая + правая). |
| Постусловия | Регистр кнопок отражает актуальное состояние. |
| Поле | Описание |
|---|---|
| Название | Чтение значения скролла |
| Акторы | Пользователь, эмулируемая программа |
| Предусловия | Устройство Mouse активно, курсор над виджетом, программа выполняется. |
| Основной поток | 1. Пользователь прокручивает колёсико мыши вверх. 2. Значение delta записывается в регистр SCROLL (положительное). 3. Программа читает регистр SCROLL, получает значение. 4. После чтения значение регистра сбрасывается в 0. |
| Альтернативные потоки | А1. Скролл вниз - значение отрицательное (signed 32-bit). А2. Множественные скроллы без чтения - значения накапливаются (суммируются). |
| Постусловия | Значение скролла прочитано и сброшено. |
Макет UI - Клавиатура

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

Макет UI - Мышь
