August 28th, 2020

QuatCore

QuatCore+GPU: всё чудесатее и чудесатее

Вот на чём мы пока остановились:


После того, как на строке обнаружили яркую точку, следующую строку мы разбили на 3 отрезка, первый из них оказался пустым, на втором нашли более яркую точку, чем в прошлый раз, поэтому её координаты скорректировали, и тут же заказали два отрезка для следующей строки. На третьем отрезке тоже нашли яркую точку, подтвердили, что достаточно разнесена от соседей, и запущена процедура по её добавлению в список.

Тем временем, идёт обратный ход, после которого начнётся следующая строка.

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


Collapse )

В целом, происходящее весьма осмысленно. Мы увидели "в работе" все строчки кода, кроме 9 (из 83), то есть "покрытие" составило 89%.

Сейчас нарастим длину выходного буфера GPU - и можно продолжить.

PS. Считаю абсолютно верным решением "разогнать" QuatCore до 25 МГц. Когда я понял, что всё взаимодействие будет идти через FIFO - немного взгрустнул: они вполне могли бы обеспечить Crossing clock domains, когда GPU работал бы на 25 МГц, а QuatCore на 4..6 МГц. Но сейчас вижу: он даже на 25 МГц на удивление долго ковыряется, а на 6 МГц, да ещё с цепями "защиты от метастабильности" (они нужны, когда работаем с несколькими тактовыми частотами) - совсем абзац...

Так что месяц, ушедший на "разгон", ушёл не зря.
QuatCore

QuatCore+GPU, строка 8

Увеличил размер выходного буфера GPU с 4 до 5 элементов и синтезировал схему по-новой. Её размер вырос с 1004 до 1055 ЛЭ. Увы, выходной буфер штука здоровенная: 12 бит для пикселя, ещё 10 бит для X-координаты, и ещё 26 бит на "вторую сумму", которую мы пока не использовали совсем, она для субпиксельной точности. Итого 48 ЛЭ только на память, ещё 1 ЛЭ - для расширения "унарного счётчика", и ещё 2 ЛЭ - логика (тут у нас есть вход flush, сброс, или скорее "слив", стало на 1 ЛЭ больше из-за него).

Похоже, ничего не изменилось, кроме того, что исчез сигнал OFLO, и последний отрезок на строке тоже нашёл себе место.

Мы пока здесь:


Видеопроцессор убежал немного вперёд и уже обработал все 5 отрезков, сейчас ждёт начала новой строки (синхроимпульс+238 тактов "back porch"), а QuatCore только-только закончил обработку прошлой строки и готовится прочитать результаты по текущей...

Collapse )

Ни дня без ошибок, но всё-таки потихоньку продвигаемся. Осталось всего 5 строк из 83, где мы "не были", т.е "покрытие 94%". Хотя это не касается "покрытия" некоторой логики, заложенной в модули на verilog, как-то: работу с "переполнениями" по X-координате (как в плюс, так и в минус), работу со строками, когда все "полезные" строки уже закончились, возможно, и ещё о чём-то забыл.

И ещё я почти уверен, что придётся дорабатывать код, обрабатывающий "слияние" пятен в одно огромное пятно. То, что написано сейчас, сделано с оглядкой "на шаг вперёд", но если глянуть на два шага вперёд, станет видна прореха...

UPD. Всё-таки промотал "осциллограмму" чуть-чуть назад - и тут же нашёл корректное завершение этой длинной строки. Мы отправили ACQ 0x12 и 0x18, затем прочитали яркость последнего отрезка, яркость оказалась нулевой. Мы поняли, что отрезок последний, переместились в @@FinalRange, где начали отправлять ACQ WholeRow, но застряли, поскольку в буфере уже 5 заданий. Так что мы корректно обработали строку по восьмую включительно. Осталось проверить, как эти два "верхних" пятна будут перемещаться из списка активных точек ActivePoints в список обработанных точек AllPoints, ну и слияние тоже неплохо бы, но не на этой картинке.