nabbla (nabbla1) wrote,
nabbla
nabbla1

Categories:

QuatCore начинает фурычить (финал!)

Часть 1, часть 2, часть 3, часть 4

Пора заканчивать этот Hello, World, точнее, FindMDD3 - программу для нахождения самой отдалённой точки из четырёх. Мы уже видим, что она считает нечто осмысленное - находит суммы квадратов длин от каждой точки до всех остальных, и записывает индекс точки, для которой эта сумма максимальна. Проверим, правильно ли завершается работа?


В прошлый раз мы увидели, как посчиталась сумма квадратов длин до 3-й точки (0x33), а затем до второй точки (0x2B).

На очередной итерации у нас должна получиться сумма:

((53-480)2+(-7-(-30))2+(-539-480)2+(-302-(-30))2+(400-480)2+(-997-(-30))2)/2 = 34,13 = 0x22

Взглянем, что получилось у процессора:

С вашего позволения, не вписываю в скриншот мнемонические имена команд - я уже окончательно сошёл с ума и вижу всё в машинных кодах :) (точнее, по скачкам адресов PC, изменениям i,j,k и разной длительности исполнения разных инструкций практически не думая нахожу в этой "простыне" нужные места)

Слева команда [SP] Acc (FC 80) заносит на стек сумму квадратов длин для 1-й точки, а именно 0x22 - в этот раз даже всё правильно посчитали. Затем успешно выходим из двух внутренних циклов, вычитаем текущий максимум 0x33, и решаем максимум не менять (прыжок с адреса 0x13 сразу на 0x17), и тут же начинаем финальную итерацию, для точки под номером ноль.

Для неё мы должны получить сумму

((480-53)2+(-30-(-7))2+(-539-53)2+(-302-(-7))2+(400-53)2+(-997-(-7))2)/2 = 26,26 = 0x1A.

Финальная "осциллограмма":


Действительно, мы получили значение 0x1A, которое мы положили в [SP], после чего вышли из двух внутренних циклов (kLOOP -5 и iLOOP -7), сравнили это значение с текущим максимумом 0x33 и решили не заменять его, прыгнув сразу на выход из внешнего цикла (jLOOP -15). Фух! Из внешнего цикла также вышли, наконец-то добравшись до адреса 0x18.

i Y - всё сработало, индекс самой отдалённой точки, 3, мы переместили в индексный регистр i.
k 1 - ещё один небольшой цикл аж на 2 итерации (от 1 до 0).
C [X+k] - эффективный адрес 0x18+0x1=0x19, верно, это Y-координата нулевой точки.
Acc [X+2i+k] - эффективный адрес 0x18+0x6+0x1=1F, верно, это Y-координата 3-й точки (т.е самой отдалённой).

[X+k] Acc - по адресу 0x19 положили координату 3-й точки,
[X+2i+k] C - по адресу 1F положили координату 0-й точки, т.е ПОМЕНЯЛИ ИХ МЕСТАМИ. Из-за запрета на прямую пересылку из памяти в память (исключительно из жадности, вообще двухпортовая память ПЛИС это позволяет) пришлось использовать два регистра, а единственные регистры, куда заведомо поместится 16 бит - это регистры АЛУ.

kLOOP -4 - уменьшили k на единичку и вернулись к началу цикла.
Снова повторяется 4 команды, чтобы поменять местами 2 значения, после чего мы выходим из цикла.

JMP [--SP] - мы обращаемся по адресу 5F, т.е действительно у нас "всю дорогу" было SP=60, а сейчас мы предварительно вычли единичку, а там нас дожидался адрес возврата: 4. На него-то мы и прыгнули!

JMP 4 - бесконечный цикл. Видно, как "застопорились" все значения. В новых ПЛИС есть коммутаторы тактовых импульсов - там можно было бы вообще прекратить подачу clk на ядро, но в 5576ХС6Т такого нет, насколько мне известно. Так что убрать тактовые импульсы нельзя, но по крайней мере, зафиксировав все логические уровни, можно существенно сократить энергопотребление, так что этот бесконечный цикл - самое близкое ко "сну", что можно придумать.

УРА ТОВАРИЩИ! Наша программа корректно исполнилась от начала до конца. И немедленно выпил.

Это не значит, что QuatCore доказал свою корректность - мы использовали далеко не все команды. Есть ещё много команд умножения - с накоплением и без, знаковые, беззнаковые и смешанные, есть треугольная адресация для симметричных и треугольных матриц, умножения с хитрыми знаками, адресации через XOR.

Ещё данная реализация QuatCore достаточно медленная: из-за отсутствия конвейера, за один такт сигнал со счётчика инструкций PC должен добраться до ПЗУ, оттуда поступить команда, пройти через формирователь эффективного адреса, поступить в ОЗУ, из ОЗУ выйти слово данных, скоммутироваться на шину данных, возможно сложиться с PC и только после этого защёлкнуться в регистре. В итоге, на 5576ХС6Т нельзя будет подавать на QuatCore тактовую частоту свыше 5 МГц. Как ни странно, этого вполне может хватить - вот сейчас я "подавал" 4 МГц, и первый шаг алгоритма был выполнен за 262 мкс, тогда как на весь алгоритм целиком отводится 200 мс. Но всё-таки можно относительно легко ускориться в 2-4 раза, если ввести конвейер и его сброс (pipeline stall), если был совершён переход. Но это, наверное, чуточку позже. Сначала проверю всю "бортовую программу" и допишу алгоритм сопровождения, запущу это на реальном железе.

Но начало положено, и я доволен как слон. Вся эта безумная связка - от алгоритма к ассемблеру, от него к машинным кодам, от них к аппаратной реализации на ПЛИС - вполне работоспособна и заработала практически в пол-пинка.
Tags: ПЛИС, математика, программки, работа, странные девайсы
Subscribe

  • О вытягивании себя из болота по методу Мюнхгаузена

    Всё готовлюсь к встрече с представителями РКК Энергия, нужно убедить их в моём способе определения положения ВидеоИзмерителя Параметров Сближения на…

  • Ремонт лыжных мостиков

    Вернулся с сегодняшнего субботника. Очень продуктивно: отремонтировали все ТРИ мостика! Правда, для этого надо было разделиться, благо народу…

  • Гетто-байк

    В субботу во время Великой Октябрьской резни бензопилой умудрился петуха сломать в велосипеде. По счастью, уже на следующий день удалось купить…

  • Post a new comment

    Error

    Anonymous comments are disabled in this journal

    default userpic

    Your IP address will be recorded 

  • 1 comment