nabbla (nabbla1) wrote,
nabbla
nabbla1

Categories:

QuatCore: финал аффинного алг - дополнение

Проверим случай, когда берётся обратная величина от 16384, что должно дать 65536, но они не умещаются в 16 бит (это уже НОЛЬ, что не есть хорошо), а также подведём небольшие итоги.


Для проверки, введём в конце процедуры FindScale дополнительные две строки:

;вот эти
        X           OneHalf
        Acc         [X+i]
;перед тем, как положить "масштаб" в [SP]
        [SP]        UAC

То есть, взамен реально посчитанного масштаба, мы заносим в аккумулятор значение 16384, самое маленькое из возможного диапазона 16384..32768.

И смотрим, что будет дальше.


После первой итерации значение 58226.



После второй итерации значение 64721.



После третьей итерации значение 65526.

И теперь начинается веселье:


Действительно, на четвёртой итерации значение приближается к 65536 - и "достигает его", мы получаем ноль. Его мы успешно заносим в регистр C, затем выходим из цикла. Наконец, условный переход JGE (прыгнуть, если число в аккумуляторе больше или равно нуля) НЕ ПРОИЗВОДИТСЯ, т.е ноль нулём, но в аккумуляторе есть дополнительный бит, в который произошёл перенос, так что число считается отрицательным. Так что мы выполняем всё, что положено - увеличиваем "экспоненту" на единицу, до 10, а в аккумулятор заносим "минус единичку", то бишь 32768, и её беззнаково оттуда вытаскиваем.

То есть, "недоступное" значение 65536/32768 × 29 мы превратили в
32768/32768 × 210.

Успех!


В итоге, программа "захвата" (аффинного алгоритма) занимает 182 слова кода (364 байта), тогда как первая версия занимала 158 слов, но работала на несуществующем процессоре, не делала округления при вычислении масштаба, каждый четвёртый раз ошибалась в младшем разряде при нахождении обратной величины, хранила стек в легкодоступном месте, не сильно заботясь, что это место лучше выделить под глобальные массивы, а стек убрать куда подальше, т.к его один раз инициализировать - и больше проблем не будет.

Для той программы я подсчитал, что она исполнится за 4000 тактов. Теперь могу посмотреть на симуляторе, сколько реально требуется при текущей реализации - 1,15 мс на частоте 4 МГц, то есть 4600 тактов - не так уж плохо.

Timing Analysis показывает максимально допустимую тактовую частоту 6 МГц ровно, так что мы даже работаем с 1,5-кратным запасом. Все вычисления мы обязаны завершить за 200 мс, а завершили за 1,15 мс - это не обещанный ранее запас в 375 раз, но в 174 раза - тоже неплохо.

Таблица вызова процедур пока содержит всего 4 записи из доступных 16, это процедуры
AffineAlgorithm
NormSiCo
ShiftOrigin
SwapPoints


Всего в программе используется 30 непосредственных (Imm) значений из 128 возможных, самое частое - единица (22 раза), затем тройка (10 раз), на третьем месте нолик (9 раз).

Также используется 29 других адресов источников (SrcAddr), из 128 теоретически возможных, и 47 из 256 возможных адресов получателей (DestAddr).

В дальнейшем количество используемых адресов немного увеличится, но предполагаю, что незначительно.

Наконец, процессор QuatCore при данных настройках (шина адреса как в ROM, так и в RAM по 8 бит, доступны адреса i++/j++/k++, но недоступны ijk, ширина аккумулятора 32 бита) синтезируется в 448 ЛЭ, из доступных в моей нынешней ПЛИС 9984 ЛЭ, а в "целевой" - 2880 ЛЭ. Это без оптимизации таблицы адресов и отключения неиспользуемых в данной программе команд.

В целом, очень компактно, как мне кажется, удалось "распределить обязанности" между программной и аппаратными частями, так что программный код получается очень близок к железу, но на удивление ёмким.

Poll #2098550 Чем дальше заняться

Чем заняться в первую очередь?

Реализовать алгоритм сопровождения
1(33.3%)
Написать модуль обработки видео
2(66.7%)
Кардинально поменять род деятельности
0(0.0%)
Tags: ПЛИС, математика, программки, работа, странные девайсы
Subscribe

  • Мышки плакали, кололись,

    но продолжали смотреть Доктора Кто... Что-то не то, всё-таки. Какая-то бессмыссленность происходящего, простые сюжеты. Расизм - это плохо, экология…

  • И ещё о 13-й докторе

    В воскресенье вышла первая серия, посмотрел это дело. Да в общем, нормально, вполне себе "Доктор Кто". Вот она, компаньон моей мечты - ЯЯЯЯЗЬ!…

  • Великая Октябрьская резня бензопилой

    Сегодня прокатился прочистить Абрамцевскую просеку. Как обычно, с приключениями. Выезжал на велосипеде, а вернулся на самокате. Первый раз по этим…

  • Post a new comment

    Error

    Anonymous comments are disabled in this journal

    default userpic

    Your IP address will be recorded 

  • 5 comments