Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Параметризируемый pipline
Форум разработчиков электроники ELECTRONIX.ru > Программируемая логика ПЛИС (FPGA,CPLD, PLD) > Языки проектирования на ПЛИС (FPGA)
Alexey_Rostov
Добрый день! Подскажите пожалуйста, как наиболее компактней описать следующий алгоритм: есть N dsp блоков, которые создаются через generate. На каждый блок умножает суммирует 4 умножения.
Далее необходимо просуммировать выходы всех блоков. Структура алгоритма приведена на рисунке:
Нажмите для просмотра прикрепленного файла
Описание N блоков DSP тривиально:
CODE
/*
* generate multiply and accummulate for layer
*/
genvar i;
generate
for (i = 0; i < N; i = i + 1)//H_layer_size
begin: DSP
DSPkernel i0(
.CLK(CLK),
.RST(RST),
.EN(EN),
.DI(DATA_IN[(i+1)*64 - 1 : i*64]),
CI(CI[(i+1)*64 - 1 : i*64]),
.D_VALID(DSP_VALID[i]),
.DO(DO[i]));
end
endgenerate


Каким образом можно описать параметризируемый pipline для сложения выходов DSP блоков?

doom13
Код
wire  [W-1:0] sum [0:N-1];
wire  [W-1:0] sum_out;

genvar i;
generate
   for (i = 0; i < N; i = i + 1)//H_layer_size
   begin: DSP
      DSPkernel i0(
         .CLK(CLK),
         .RST(RST),
         .EN(EN),
        .DI(DATA_IN[(i+1)*64 - 1 : i*64]),
        .CI(CI[(i+1)*64 - 1 : i*64]),
        .D_VALID(DSP_VALID[i]),
        .DO(DO[i]));

       assign sum[i] = (i) ? sum[i  - 1] + DO[i] : DO[i];
   end
endgenerate

assign sum_out = sum[N-1];
Alexey_Rostov
Цитата(doom13 @ Jan 4 2018, 16:26) *
Код
wire  [W-1:0] sum [0:N-1];
wire  [W-1:0] sum_out;

genvar i;
generate
   for (i = 0; i < N; i = i + 1)//H_layer_size
   begin: DSP
      DSPkernel i0(
         .CLK(CLK),
         .RST(RST),
         .EN(EN),
        .DI(DATA_IN[(i+1)*64 - 1 : i*64]),
        .CI(CI[(i+1)*64 - 1 : i*64]),
        .D_VALID(DSP_VALID[i]),
        .DO(DO[i]));

       assign sum[i] = (i) ? sum[i  - 1] + DO[i] : DO[i];
   end
endgenerate

assign sum_out = sum[N-1];


спасибо, только совсем не pipeline))

получилось так
CODE
reg [7 : 0] sum [0 : N - 1];
integer k;
initial
begin
for (k = 0; k < N; k = k + 1)
begin
sum[k] = 0;
end
end
assign DATA = sum[N-2];

genvar i;
generate
for(i = 0; i < N; i = i + 2)begin
always@(posedge CLK)begin
sum[i >> 1] <= DO[i] + DO[i + 1];
sum[(i >> 1) + N/2] <= sum[i] + sum[i + 1];
end
end
endgenerate


например для N = 16 rtl выглядит:
Нажмите для просмотра прикрепленного файла

При этом N рассчитывается:
CODE


function integer clogb2 (input integer depth);
begin
depth = depth - 1;
for(clogb2=0; depth>0; clogb2=clogb2+1)
depth = depth >> 1;
end
endfunction

localparam N = clogb2 (M);

dvladim
Вообще-то лучше сделать суммирование без pipeline, а по выходу поставить нужное количество регистров.
А их перераспределение по дереву сумматоров оставить на откуп софту (register retiming).
PS. Если это FIR фильтр какой-нибудь, то лучше использовать не дерево сумматоров, а каскадирование сумматоров. В доках Xilinx красиво и понятно разрисовано. Это, конечно, если DSP блок позволяет.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2024 Invision Power Services, Inc.