nabbla (nabbla1) wrote,
nabbla
nabbla1

Categories:

Ошибка в доработанном видеопроцессоре

Разумеется, с первого раза он заработать не мог. Если вчера просто ошибся с чётностью, то сегодня уже при правильной чётности он успешно обработал первые 38 строк изображения, а как только началось что-то хоть отдалённо интересное - вдруг выкинул все результаты работы!

Дело в этих строках:
reg ParityRequired = 1'b0;
always @(posedge clk) if (IsOurAddr & SrcAddr[0])
	ParityRequired <= ~ParityRequired;
	
wire outOdd;	
	
wire WrongParity = (ParityRequired ^ outOdd ^ SrcAddr[0]) & (~empty);
wire rdreq = IsOurAddr & (((~SrcAddr[2]) & SrcAddr[1]) | WrongParity );	


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


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

Можно сделать так:
always @(posedge clk) if (IsOurAddr & SrcAddr[0] & (~empty))
	ParityRequired <= ~ParityRequired;


Менять чётность только когда очередь не пуста. Как только в ней появляется элемент, мы наконец-то выходим из ожидания.

А можно оставить как есть, но гарантировать, что данная команда будет выполнена ровно за 1 такт, т.е отключить "ожидание появления данных", всё равно мы их здесь не используем! Т.е строку

assign DestStallReq = empty & IsOurAddr;


заменить на:
assign DestStallReq = empty & IsOurAddr & (~SrcAddr[0]);


В результате "старые" команды GPUL = 0x88, GPUH = 0x8A, GPUPL = 0x8C и GPUPH = 0x8E (у них у всех младший бит 0) не будут завершаться, пока не появятся реальные данные, так и всегда и было. А вот "новая" команда BGPUL = 0x89 ничего ждать не будет. Если в момент её прихода в очереди что-то уже лежало, притом неверной чётности - оно будет вытолкнуто. А если пока очередь была пуста, а значение пришло позже - оно также будет потихоньку "выталкиваться" командой GPUL, которая вообще не должна выталкивать данные из очереди (ведь мы ещё не все части прочитали!), а здесь вытолкнет.


Сейчас дождёмся окончания симуляции - и посмотрим, работает ли оно.

Всё-таки этот алгоритм мне пока кажется более предпочтительным, чем "нейросети", они же оптимальное обнаружение. Для начала, он жрёт меньше памяти, ему не нужно перебирать размеры пятен, перестраивая фильтры, и вообще он использует железо "на сдачу". QuatCore у нас по-любому есть, пущай работает. А видеопроцессор в первую очередь был заточен под измерение центров пятен с субпиксельной точностью, но с помощью небольших доработок удалось заставить его "по совместительству" искать максимум и его координату :) А если сделать отдельно фильтры, нужен интерфейс для их перестройки, и каким-то образом выдавать в процессор свои результаты работы,координаты X и Y всех найденных пятен.

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

  • Нахождение двух самых отдалённых точек

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

  • Слишком общительный счётчик

    Вчера я чуть поторопился отсинтезировать проект,параметры не поменял: RomWidth = 8 вместо 7, RamWidth = 9 вместо 8, и ещё EnableByteAccess=1, чтобы…

  • Балансируем конвейер QuatCore

    В пятницу у нас всё замечательно сработало на симуляции, первые 16 миллисекунд полёт нормальный. А вот прошить весь проект на ПЛИС и попробовать "в…

  • Огари разговаривают

    Сегодня по пути на работу встретил огарей прямо в Лосином острове, на берегу Яузы. Эти были на удивление бесстрашны, занимались своими делами, не…

  • Мартовское велосипедное

    Продолжаю кататься на работу и с работы на велосипеде, а также в РКК Энергию и на дачу. Хотя на две недели случился перерыв, очередная поломка,…

  • Обнаружение на новом GPU - первые 16 мс

    Закончилась симуляция. UFLO и OFLO ни разу не возникли, что не может не радовать. За это время мы дошли до строки 0x10F = 271. Поглядим дамп памяти:…

  • Post a new comment

    Error

    Anonymous comments are disabled in this journal

    default userpic

    Your IP address will be recorded 

  • 0 comments