Перейти к содержанию

Параметризируемый pipline

Добрый день! Подскажите пожалуйста, как наиболее компактней описать следующий алгоритм: есть N dsp блоков, которые создаются через generate. На каждый блок умножает суммирует 4 умножения.
Далее необходимо просуммировать выходы всех блоков. Структура алгоритма приведена на рисунке:
[attachment=110503:data.jpg]
Описание 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 блоков?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
Код
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];

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
Цитата(doom13 @ Jan 4 2018, 16:26) <{POST_SNAPBACK}>
Код
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 выглядит:
[attachment=110525:data.png]

При этом 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);

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
Вообще-то лучше сделать суммирование без pipeline, а по выходу поставить нужное количество регистров.
А их перераспределение по дереву сумматоров оставить на откуп софту (register retiming).
PS. Если это FIR фильтр какой-нибудь, то лучше использовать не дерево сумматоров, а каскадирование сумматоров. В доках Xilinx красиво и понятно разрисовано. Это, конечно, если DSP блок позволяет.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти
Авторизация