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

    

Параметризируемый 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 блок позволяет.

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


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

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

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

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

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

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

Войти

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

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