nabbla (nabbla1) wrote,
nabbla
nabbla1

Categories:

Видеопроцессор "в сборе"

Вот он:
Vidoproc_whole.png

Увесистая хреновина получилась: сейчас, при длине буфера на вход и на выход по 4 элемента, всё это дело синтезируется в 439 ЛЭ. Timing Analyzer показывает максимальную частоту 47,39 МГц - на сейчас сойдёт, когда мы рассчитывали на тактовую частоту 25 МГц. Когда-нибудь захочется разогнаться до 50 МГц (исключительно чтобы побыстрее считывать информацию с отечественной 1205ХВ014 и снизить эффект Rolling Shutter), а может и того больше, но паниковать раньше времени не будем, на 25 МГц бы освоиться как следует!

Модуль QuatCoreFullGPUOut мы пока здесь не рассматривали, хотя ничего шибко интересного в нём нет.


Вот его код:
//буфер FIFO, через который результаты работы видеопроцессора поступают в QuatCore. Также здесь логика общения по шине
//резервируем аж 4 команды:
//GPUL (luminance):   	1000_100x
//GPUH (horiz. coord):	1000_101x
//GPUPL (Product Low):	1000_110x
//GPUPH (Product High): 1000_111x
//т.е на каждую из них выделено по 2 адреса, чтобы поменьше декодировать
//GPUL остановится, если данные ещё не поступили, равно как и GPUH 
//между тем, GPUL не трогает буфер (только читает из него),
//а GPUH выталкивает последние значения из него

//GPUPL и GPUPH также останавливаются, но не выталкивают, считываем их пораньше

module QuatCoreFullGPUout(input clk, input [PixSumWidth-1:0] D, input [PixMulWidth-1:0] Prod, input wrreq, input sclr, input [7:0] SrcAddr, input SrcStall, output DestStallReq, output [15:0] Q, output OFLO);

	parameter PixSumWidth = 22;	//сколько отводится на совместное хранение координаты и яркости или на хранение суммы всех яркостей на отрезке
	parameter PixWidth = 12;	//разрядность АЦП по сути
	parameter XregWidth = 10;	//сколько бит на координату. Теоретически могли бы сократить до 8, но довольно муторно, пока не жадничаем...
	parameter PixMulWidth = 26;	//сколько бит на "вторую сумму"
	parameter ElemCount = 4;
	parameter LongClr = 1'b1;	//1: сигнал sclr достаточно долгий, чтобы тупо "вытолкнуть" элементы по одному, или считаем что по одному лишнему оттуда выпихивать вполне хватит
								//0: обнуление за один такт

	wire IsOurAddr = (~SrcStall)&(SrcAddr[7:3] == 5'b1000_1); 	//используем при формировании Stall
	
	wire i_sclr = (~LongClr) & sclr;	//наша жадность не знает границ!
	wire L_sclr = LongClr & sclr;		//"длинный" сброс
	
	wire rdreq = (IsOurAddr & (~SrcAddr[2]) & SrcAddr[1]) | L_sclr;			//выталкиваем только по GPUH
	
	
	wire empty;							//нужен для формирования stall
	wire [PixWidth-1:0] LumOut;			//"широкий" выход буфера
	wire [XregWidth-1:0] HorOut;
	wire [15:0] ProdOutL;				//предполагаем, что 16 бит нужно как минимум
	wire [PixMulWidth-17:0] ProdOutH;	//всё, что осталось

	FIFO_on_LE buff (.clk(clk),
			 .D({Prod, D}),
			 .rdreq(rdreq),
			 .wrreq(wrreq & (~L_sclr)),
			 .sclr(i_sclr),
			 .empty(empty),
			 .nfull(),
			 .Q({ProdOutH, ProdOutL, HorOut, LumOut}),
			 .wr_stall(OFLO),	//для начала "защёлкнем" и выведем на светодиод, чтобы посмотреть, не возникает ли переполнения
			 .rd_stall()		//у нас логика чуть сложнее, сами сделаем на основе empty
					 );
	defparam
		buff.DataWidth = PixSumWidth+PixMulWidth,
		buff.ElemCount = ElemCount;				//пока не можем сообразить, сколько их надо
	
	wire [1:0] cmd = SrcAddr[2:1];
	assign Q = 	(cmd == 2'b11)?	ProdOutH	:
			(cmd == 2'b10)? ProdOutL	:
			(cmd == 2'b01)? HorOut		: LumOut;
	
	assign DestStallReq = empty & IsOurAddr;	//т.е когда запрашиваем любую из частей, а выдать нечего
	
endmodule


Уширили ещё сильнее, для задач сопровождения, а так ничего принципиально не поменялось. Да, теперь 4 команды: GPUL (Luminance / Low) - узнать яркость самой яркой точки на отрезке / младшие биты суммы всех пикселей на отрезке, GPUH (Horizontal coord / High) - узнать X-координату самой яркой точки на отрезке / старшие биты суммы всех пикселей на отрезке, GPUPL (Product Low) и GPUPH (Product High) - взять по частям взвешенную сумму пикселей для вычисления яркостного центра.


Теперь осталось соединить его с QuatCore, а ещё собрать "генератор тестового изображения" для симуляции - и попробовать всё это запустить. Как раз в пятницу вечером в спокойной обстановке можно попробовать, тут нужна некоторая отрешённость.
Tags: ПЛИС, программки, работа, странные девайсы
Subscribe

Recent Posts from This Journal

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

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

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

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

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

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

  • Post a new comment

    Error

    Anonymous comments are disabled in this journal

    default userpic

    Your IP address will be recorded 

  • 1 comment