Блог страдающего Лиса
Lorem ipsum hello dolor sit world amet

04 мар 2023 Сб Наконец-то синтезировал в ПЛИС проект

У меня этот проект с Award Modular уже длится довольно давно, потому что я делаю его иногда, и вот сегодня я сделал наконец, синтез в DE0 девборде, чтобы показалось, наконец, на реальном железе. Работает вполне прилично, все хорошо и четко выводит, без искажений. Скриншот что ли приложить... но думаю, что не стоит, потому что я так уже заспамил как только мог этими скриншотами. Еще сегодня доделал якобы "отсчет" памяти, где отсчитывается 8 Мб, хотя он вообще ничего не отсчитывает на самом деле, просто так работает, от балды. Что-то выложить видео не могу, не поддерживается браузером.
Что вообще могу я сделать?
  • Первая задача, которую надо обязательно сделать, так это показ биоса, а точнее, его муляжа, чтобы было ощущение, как будто из под биоса сидишь пентиумского
  • Второе, это выдача на экран характеристик "компа"
  • Поддержка SD-карты
  • Поддержка памяти SDRAM
  • Мини-дос
  • Микро-Бейсик
Это слишком много хотелок. Самое важное, ради чего вообще все это затевалось, это конечно, фейковый биос.

03 мар 2023 Пт Доделал этот Award Modular

Или, проще говоря, Energy Star EPA POLLUTION PREVENTER наконец-то готов.
Snimok_ekrana_ot_2023-03-03_21-47-35.png
Сколько же я пытался разобраться в этом, сколько страдал. Сегодня еще сделал функцию деления 16-битного числа HL на DE, с результатом в HL и остатком в DE. Потребовалось дополнительные 2 байта памяти для этого действия.
Позже попробую сделать вывод на экран прогресса проверки "памяти", так сказать, а далее хочу сделать так, чтобы можно было легко запустить синий экран великого Биоса и не париться сильно с этим вопросом, сделать все этим менюшки там фейковые. Все это только для того, чтобы у меня был вывод биоса и ощущение того, что наконец-то доделал то что хотел.
Прошло ровно 2 месяца как я каждый день что-то записываю в блоге, не пропуская ни одного дня. Начал 4 января, а сейчас уже 3 марта. Это меня радует, хоть я и обещал, что писать могу не всегда, но мне пока что есть о чем писать.

02 мар 2023 Чт Особо ничего нового

Сегодня день, в котором ничего такого не произошло, просто работал, что-то делал, выполнял определенные задачи. Часто размышляю о том, что бы мне хотелось сделать на ПЛИС, и даже если и думаю, то все эти проекты довольно сложные для их реализации. К примеру думал о том, чтобы сделать нейросеть. Как можно вспомнить, искусственная нейросеть опирается на нейроны, реализованные через сигмоиду, то есть вот такую функцию
P(t) = \frac{1}{1 + e^{-t}}
Она сложна по двум причинам для своей реализации. Во-первых, тут требуется найти экспоненту дробного числа, что уже само по себе непростое дело, и, во-вторых, требуется разделить число. Сложность вычисления очень велика для каждого нейрона.
Как вообще вычислять это дело? К примеру, экспонента может быть разложена следующим образом:
e^{1.75} = e^1 e^{0.5} e^{0.25}
Для нейронной сети хорошо бы использовать float-point, но вполне даже может пригодиться число половинной точности, так что количество умножении может быть к примеру, 10 или 11, по количеству двоичных чисел в мантиссе. Значит, 11 тактов придется потратить на то, чтобы возвести экспоненту в степень. Однако, это не все! Как минимум, надо сделать деление, и на деление тоже тратится 11 тактов (длина мантиссы). Кстати, в случае с отрицательной экспонентой, то есть, при возведении в степень отрицательного значения, можно лишь взять другой набор значений.
Получается, чтобы вычислить один нейрон, потребуется минимально 22 такта + то количество тактов, которое нужно для сложения и умножения весов на входящие значения. Допустим, что мы даже так, тратим 50 тактов на вычисление одного нейрона, то сколько нейронов можно будет вычислить в секунду? На частоте 25 мгц это будет 500 тыс нейронов. Это в целом, неплохо, если нейросеть не делать очень большой.
У меня постоянный запар какой-то идет по оптимизации, чем бы ни занимался, хочется сделать все с максимальной скоростью. В итоге же я ничего не делаю! Да сколько можно то! Надо просто брать и делать и вообще на все плевать, хоть медленно, но сделать, чтобы работало.
Теги: Дневник

01 мар 2023 Ср Сегодня 1 марта

Продолжил делать программу для того, чтобы получить полноценный экран с Award Modular, но пока что сегодня смог сделать совсем немного.
Snimok_ekrana_ot_2023-03-01_19-58-45.png
Что смог сделать, так это нарисовать вот этого человечка, выложив плитку из 6 символов. Следующая задача будет в том, чтобы наавардить да намодулярить еще Energy Star, и это не так просто будет. Всего он занимает 102 символа, среди них уникальных 76, поэтому, займет 76*16 + 102 = 1318 байта в памяти. Очень много памяти тратится, но я знаю, что делаю, потому что делаю совсем немного, так что все нормально.
И еще, может быть я даже перестану каждый день сюда писать, но это неточно. Пока будет интересно, буду писать, потому что хочу, чтобы у меня была полная история жизни, чтобы потом было что читать.
Теги: Дневник

28 фев 2023 Вт Дорабатываю модуль KR580

Модуль этот я начал делать много лет назад и как обычно, тысячу раз делал и делал, и кое-как доделал. В чем замес модуля процессора? Он должен быть довольно простой и не содержать большого количества ненужных инструкции. Нет префиксированных команд. Сегодня я оптимизировал исполнение некоторых инструкции, например LD r,r сделал за 1 такт и также ADD HL,Reg16 тоже за 1 такт. Переработал обработчик прерываний. Там еще есть что оптимизировать и я этим буду постепенно заниматься.
Также пишу код для создания "муляжа" биоса, это для того, чтобы установить эту программу и наслаждаться чистым биосом. Что-то можно делать в нем, настраивать, даже инициализировать диски, которых нет, но самое интересное в том, что ничего этого сохраняться не будет. Просто биос, который ничего не значит. Это сложный код, несмотря ни на что.
Modularo.png
Такой вот экран мне пока что удалось нарисовать. Этого немного. Тут надо еще подцепить клавиатуру, пробросить порты, целая масса дел, а мне лень. И ради только того, чтобы этот экран появлялся.
Допустим, если я смогу сделать биос, стану ли я после этого делать какую-нибудь, пусть даже очень простую, операционную систему? Большой вопрос, и пока я не сделаю экран биоса, ни о какой ОС и думать даже не буду.
Теги: Процессор

27 фев 2023 Пн Треугольное чтиво

Короче, решил я делать треугольники не такими, как ранее. Я думал, что буду хранить их в кеш-памяти, но так не пойдет, потому треугольники будут храниться в памяти SDRAM и рисоваться по следующему алгоритму:
  • Получаем треугольники из последовательности
  • Применяем матрицу преобразования камеры
  • Проверяем треугольник на видимость — если вообще невидим, не добавляется в очередь. Если видим — добавляется он один. Если треугольник разрезается на части — режем его и добавляем 2 треугольника.
  • Рендерим очередь треугольников, если заполнилась
  • Если еще есть что сканировать, возвращаемся к 1
Это приблизительный план того, что будет делаться. По мере разработки я буду уточнять. Сам треугольник в памяти будет занимать 32 байта: (x,y,z,u,v) — это ровно 8 байт, так как на x,y,z будет требоваться всего лишь 16 бит в формате half precision float point. Хотя, можно сделать и signed shoft, где занимаемый диапазон значений будет от -32768 до 32767, целочисленно. Я пока что не знаю, стоит ли так делать. Три точки по 8 байт это 24 байта, остальные 8 байт под параметры самого треугольника, например, номер текстуры или шейдерной программы.
Теги: Графика

26 фев 2023 Вс Придумал интересную историю

Это сценарий, а не рассказ. Запишу чтобы не забыть. Вдруг я смогу написать настоящий рассказ по этому? Вряд ли, но мало ли что.
Очень-очень далекое будущее, спустя миллионы лет, люди сумели колонизировать другие планеты, заселяя космос. С планеты, ну допустим, Геанцит (условно говоря) по командировке на Землю прилетает житель новой планеты. Эти люди уже не похожи на обычных и облик уже изменился из-за мутации.
Начинается все с космического корабля, который должен прибыть на Луну через 30 минут. В это время герой просыпается ото сна и ждет прилета, попутно зайдя в пищевой блок, пройдясь по коридорам, лифтам, знакомясь с разными историями, записанные в бортовые компьютеры и общаясь с другими пассажирами
Герой прилетает в Космопорт на Луне. Это величественное сооружение, захватывающее дух, высотой чуть ли не в целый километр. Он проходит осмотр, регистрацию и ожидает прилета корабля-челнока на Землю, осматривает, общается с людьми, роботами, андроидами, другими расами. Для этого ему выдаются специальные очки, где можно посмотреть перевод с любого языка.
Однако, случается непредвиденное. На Луне происходит колоссальное лунотрясение и Космопорт частично обрушивается. Никто не знает, почему это произошло.
Герою предстоит выбраться в безопасное место, спасти людей по пути. По мере того, как вокруг паника и неразбериха, просачиваются слухи о том, что это было не простое лунотрясение, появляется некоторая информация, что это взрыв термоядерного реактора в недрах Луны.
С Земли отправляются спасательные челноки и забирают пострадавших. Однако герою не удается сесть на них из-за вторичного удара и приходится уезжать в более безопасную зону на Луне. Над поверхностью виднеются взлетевшие вверх огромные осколки. Ведя луноход, он уклоняется от летящих осколков и укрывается в бункере.
Теги: Рассказ

25 фев 2023 Сб Делал упрощенный z80

Я как-то откопал один свой недоделанный проект по упрощенному z80 и стал его доделывать сегодня с утра, добавил верилятор, поправил код, передал довольно много вообще в самом ядре, чтобы все работало без always @*, потому что верилятор как-то плоховато понимает это дело. У меня вообще есть идея сделать загрузочный экран (симулятор экрана), для биоса. Сегодня решил посмотреть, какой там экран загружается и оказалось, что не все так как я думал раньше.
award.png
Если обратить внимание, то размер экрана будет 640 на 350 точек! Да, именно так, самое низкое разрешение VGA из возможных. Меня это немного не устраивает, ведь тогда шрифты тоже будут размером 8x14 точек, чтобы вместить 25 строк. Обычно я рассчитываю размер экрана на 640 x 400 точек, а тут высота 350. При переходе в настройки BIOS, правда, высота меняется на обычную, 16 точек на символ.
Интересная деталь в том, что якобы графика, где написано Epa Pollution Preventer и сверху Energy Star, все это нарисовано через знакоместа и в текстовом режиме, просто здесь изменен знакогенератор, чтобы рисовались символы из дополнительного набора (128-255), не ASCII. Раньше я голову ломал, как же так, вроде текстовый режим, а наложили графику. Оказывается, никогда из текстового режима эта графика и не уходила. Просто текстовые символы имеют такое начертание.
Теги: Процессор

24 фев 2023 Пт Треугольник на верилоге

Наконец-то я смог сделать это! Да, треугольник на верилоге получился не так легко и быстро, но я и не рассчитывал на то, что это получится быстро, но мне удалось. Возможно, не полностью все смог сделать правильно и оптимально, но то что есть, тоже уже не так плохо.
Сегодня отнес в свою комнату мощную плис на 150к элементов, Циклон 4, и сумел настроить квартус, чтобы он с ней смог работать. Программатор работает не очень быстро и даже с первого раза не получилось запрограммировать, был какой-то странный сбой, но потом все удалось.
Однако, то, что я нарисовал, меня не устраивает, потому что это не трехмерная графика, а чисто двухмерный зарисованный треугольник. Существует и другой алгоритм, который можно реализовать, но делать его буду сначала на Си++, а уже потом на верилоге, если получится. Трехмерная графика не такая простая, даже простой рендерер сделать на верилоге непросто.
Какие планы на то, чтобы сделать трехмерную сцену? Что на ней будет? Сам не знаю, может, простой трехмерный куб допустим, только вот одна интересная штука есть, этого всего мало. Передвижение в трехмерном мире может, и отличная идея, но сам этот мир должен тоже как-то меняться и чего-то там надо делать. Все это слишком примитивно получается.
Я хотел бы попробовать поделать сначала "биос", или такой, эмулятор его, который задумывал ранее. Тоже, хочется его сделать. Посмотрим, что получится...

23 фев 2023 Чт Про то, как я хочу сделать треугольники

У меня давным-давно есть одна мысль, которая называется "трехмерный рендерер на верилоге", о котором я часто думаю и не знаю, насколько результативно. Мне хочется сделать пусть даже небольшой, но код для плис, где автоматически из буфера могли бы рисоваться трехмерные треугольники. Это крайне непростая задача, хоть и рисование обычного треугольника не так сложно, но полноценный вывод трехмерного изображения на экран потребует довольно крупных усилий.
Как все это работает? Существует несколько буферов в памяти:
  • Буфер вершин (vertex), где хранятся все исходные вершины для рендерера
  • Буфер индексов (indicied), там хранится номер вершины
  • Текстурный буфер для треугольников
Что будет делать видеоускоритель.
  • Просматривается буфер вершин, к каждой вершине применяется матрица камеры, то есть, умножается на эту матрицу (она задана float или half-precision значениями). На самом деле для матрицы камеры вполне достаточно даже и half-precision, я думаю.
  • Просматривается буфер индексов, проверяя то, где находится та или иная вершина. Если все вершины находятся впереди проецирующей плоскости, то такой треугольник добавляется в буфер очереди на рисование. Если все вершины вне пределов проецирующей плоскости, то треугольник вообще в очередь не добавляется. В случае частичного попадания за плоскость, треугольник разбивается на 2 части и добавляется в очередь как два треугольника. В очередь добавляются уже готовые вершины, не привязанные к vertex/indicies
  • Происходит вычисление параметров треугольников для текстурирования и записывается в отдельный буфер. Тут очень много умножений.
  • Для каждой точки вычисляется проекция. Здесь уместно использование конвейерного деления для ускорения.
  • Все полученные точки треугольников сортируются пирамидальной сортировкой по возрастанию спроецированного Y. Причем сортируется только самая высокая вершина (которая имеет наименьший Y). Также, сортируются именно индексы новых точек. Это нужно для того, чтобы не перемещать большие объемы данных внутри буфера рендеринга, а только лишь индексы. Каждая вершина имеет индекс принадлежности к определенному треугольнику
  • И последний этап, это рендер.
При рендере происходит проверка и вовлечение новых треугольников по мере их добавления. К примеру, если будет отсортированный индекс указывать на вершину A треугольника 4, то номер треугольника добавляется в очередь, причем он добавится в очередь только тогда, когда достигнет того же самого Y, что имеет вершина A. Добавляя эту вершину, потребуется узнать также и все остальные его параметры, такие как высота между вершиной A и C, чтобы знать, когда закончить рисование треугольника и удалить его из очереди.
По мере построчного рисования, будет рисоваться буфер из треугольников, интегрально прибавляя значения, формируя точку на текстуре и точку глубины, записывая эти данные в однострочный буфер глубины. Каждый раз после того, как будет нарисована одна линия, этот буфер очищается для новой линии.
Другими словами, на каждой линии будет отрисовываться несколько текущих рисуемых треугольников за раз. После того, как это будет сделано, из полученного буфера размером в одну строку будут скопированы и вычислены текстуры, итоговый цвет записан в видеобуфер и сам строчный буфер очищен для новой строки.
Вот такая вот сложная система.