реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Параметризируемый pipline
Alexey_Rostov
сообщение Jan 4 2018, 12:10
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 228
Регистрация: 28-06-13
Из: Минск, Беларусь
Пользователь №: 77 312



Добрый день! Подскажите пожалуйста, как наиболее компактней описать следующий алгоритм: есть 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 блоков?

Go to the top of the page
 
+Quote Post
doom13
сообщение Jan 4 2018, 13:26
Сообщение #2


Профессионал
*****

Группа: Свой
Сообщений: 1 401
Регистрация: 11-03-11
Из: Минск, Беларусь
Пользователь №: 63 539



Код
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];
Go to the top of the page
 
+Quote Post
Alexey_Rostov
сообщение Jan 5 2018, 20:06
Сообщение #3


Местный
***

Группа: Свой
Сообщений: 228
Регистрация: 28-06-13
Из: Минск, Беларусь
Пользователь №: 77 312



Цитата(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);

Go to the top of the page
 
+Quote Post
dvladim
сообщение Jan 9 2018, 20:24
Сообщение #4


Знающий
****

Группа: Свой
Сообщений: 652
Регистрация: 24-01-07
Из: Воронеж
Пользователь №: 24 737



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

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 14th August 2018 - 10:04
Рейтинг@Mail.ru


Страница сгенерированна за 0.00996 секунд с 7
ELECTRONIX ©2004-2016