Jump to content

    
Sign in to follow this  
Aleksei_Rostov

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

Recommended Posts

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

 

 

Share this post


Link to post
Share on other sites
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];

Share this post


Link to post
Share on other sites
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);

 

Share this post


Link to post
Share on other sites

Вообще-то лучше сделать суммирование без pipeline, а по выходу поставить нужное количество регистров.

А их перераспределение по дереву сумматоров оставить на откуп софту (register retiming).

PS. Если это FIR фильтр какой-нибудь, то лучше использовать не дерево сумматоров, а каскадирование сумматоров. В доках Xilinx красиво и понятно разрисовано. Это, конечно, если DSP блок позволяет.

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this