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

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

Добрый день! Подскажите пожалуйста, как наиболее компактней описать следующий алгоритм: есть N dsp блоков, которые создаются через generate. На каждый блок умножает суммирует 4 умножения.

Далее необходимо просуммировать выходы всех блоков. Структура алгоритма приведена на рисунке:

post-77312-1515067493_thumb.jpg

Описание N блоков DSP тривиально:

/*
     * 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];

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


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

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))

 

получилось так

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 выглядит:

post-77312-1515182626_thumb.png

 

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


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 блок позволяет.

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


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

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...