Aleksei_Rostov 0 4 января, 2018 Опубликовано 4 января, 2018 · Жалоба Добрый день! Подскажите пожалуйста, как наиболее компактней описать следующий алгоритм: есть N dsp блоков, которые создаются через generate. На каждый блок умножает суммирует 4 умножения. Далее необходимо просуммировать выходы всех блоков. Структура алгоритма приведена на рисунке: Описание 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 блоков? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
doom13 0 4 января, 2018 Опубликовано 4 января, 2018 · Жалоба 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]; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Aleksei_Rostov 0 5 января, 2018 Опубликовано 5 января, 2018 · Жалоба 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 выглядит: При этом 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); Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dvladim 0 9 января, 2018 Опубликовано 9 января, 2018 · Жалоба Вообще-то лучше сделать суммирование без pipeline, а по выходу поставить нужное количество регистров. А их перераспределение по дереву сумматоров оставить на откуп софту (register retiming). PS. Если это FIR фильтр какой-нибудь, то лучше использовать не дерево сумматоров, а каскадирование сумматоров. В доках Xilinx красиво и понятно разрисовано. Это, конечно, если DSP блок позволяет. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться