В каком виде представлены 3D данные?
Я нарисовал домик в блендере, экспортировал в fbx и написал
скрипт
для конвертации в свой ассемблер (
3д данные домика
).
Отдельно хранится список треугольников (v1, v2, v3, цвет) и список вершин (x, y, z, u, v). Получается по 8 байт на треугольник и по 10 байт на вершину.
Есть ли возможность передавать 3D модели с компьютера по виртуальному последовательному порту?
Есть. По пропускной способности -- с большим запасом.
Но если нужно получать новую 3Д модель на каждом кадре одновременно с рисованием, то придется ухищряться: нет механизма прерываний, а буфер последовательного порта -- всего 8 байт. Поэтому нужно будет вставлять чтение внутрь цикла рисования.
На картинке помимо домика есть текст. Расскажите об API для вывода текста.
Текст и графика выводятся независимо.
Символы имеют размер 6х12 пикселов. С таким размером они хорошо выглядят и очень удачно влезают во внутреннюю память ПЛИС.
Выводится 40 строк по 106 символов. Каждый символ кодируется одним 16-битным словом (байт на код и байт на цвет). Сейчас есть только ASCII, но при желании можно легко добавить кириллицу.
Чтобы вывести надпись, нужно записать её в оперативную память (адрес видеопамяти настраивается, так что можно делать двойную буферизацию).
В загрузчике удалось помимо, собственно, загрузчика уместить функцию форматирования текста, похожую на printf. Любая программа может её использовать без дополнительного кода.
Пример (вывод числа в разных системах счисления):
CCMOV [r15], 0 // адрес в кэше для форматированного текста
CCMOV [r15+1], multiline_str // шаблон форматирования
CCMOV [r15+2], 0xff00 // color|flags белый цвет, форматирование включено
MOV [r15+3], r1 // 1-ый подставляемый параметр
MOV [r15+4], r1 // 2-ой подставляемый параметр
MOV [r15+5], r1 // 3-ий подставляемый параметр
DCALL printf_func // вызов функции форматирования
CMOV MEM_ADDR_LO, LO(TEXT_ADDR) // адрес в оперативной памяти, на который настроена видеопамять текстового режима
CMOV MEM_ADDR_HI, HI(TEXT_ADDR)
WRITE r0, 128*3 // запись 384-x (3 строки) ячеек из кэша в оперативную память
// ***
multiline_str: .ascii "Timer Decimal: %u\n Hex: 0x%x\n Binary: %b\n" // вывод числа в разных системах счисления
usb_status: .ascii "[USB] Vendor: 0x000%X\n Product: 0x000%X\n Device: 0x000%X\n" // вывод в 16-ричной системе с фиксированной шириной числа (4 цифры) и ведущими нулями
Если соединить USB-порт платы расширения Марсохода с другим Марсоходом. Допустим, ваш usb_controller.sv запустится на USB Full-speed (12 Мбит/с), хватит ли этой скорости чтобы передавать 3D данные по этому интерфейсу между Марсоходами?
Хватит. Особенно если учесть, что отрисовать больше двухсот треугольников за раз вряд ли получится по производительности.
Не думали ли об эмуляции терминала VT-102?
Т.е. что-то вроде
этого
?
В miksys это сделать достаточно легко (особенно если взять одноцветный фон и обойтись без мигающих символов), но у меня пока не появлялось такого желания.
Простаивают ли арифметические устройства при выполнении обычного кода, не относящегося к графике?
Смотря как программу написать. Если заморочиться, то не простаивают.
Там нет больших блоков, нацеленных исключительно на графику.