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

Jul 31, 2020 17:04

Вот он:



Увесистая хреновина получилась: сейчас, при длине буфера на вход и на выход по 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, а ещё собрать "генератор тестового изображения" для симуляции - и попробовать всё это запустить. Как раз в пятницу вечером в спокойной обстановке можно попробовать, тут нужна некоторая отрешённость.

странные девайсы, ПЛИС, программки, работа

Previous post Next post
Up