Как я могу улучшить свой код, чтобы сократить время синтеза?
Я написал некоторый код в verilog для медианного фильтра, используя метод кумулятивной гистограммы. Когда я пытаюсь синтезировать мой код в xilinx, он обрабатывает до 1 часа и, наконец, выдает ошибку "программе не хватило памяти".
Мой код:
//***** MEDIAN FILTER BY USING CUMULATIVE HISTOGRAM METHOD******//
module medianfilter(median_out,clk,a1,a2,a3,a4,a5,a6,a7,a8,a9);
output median_out;
input [7:0]a1,a2,a3,a4,a5,a6,a7,a8,a9;
integer i,j;
reg[7:0]b[255:0];
reg [7:0]buff[0:8];
input clk;
reg [7:0]median_out;
always@(negedge clk)
begin
//**************************************************************************//
for(i=0;i<256;i=i+1) // initilize the memory bins with zeros
b[i]=0;
//*************************************************************************//
buff[0]=a1;
buff[1]=a2;
buff[2]=a3;
buff[3]=a4;
buff[4]=a5;
buff[5]=a6;
buff[6]=a7;
buff[7]=a8;
buff[8]=a9;
for(i=0;i<9;i=i+1) // this loop is for cumulative histogram method
begin
b[buff[i]]=b[buff[i]]+1; // incrementing the value in b[i]th memory address
for(j=0;j<256;j=j+1)
if(j>buff[i])
b[j]=b[j]+1; // incrementing the bins below b[i]th bin
end
//**************************************************************************//
for(i=0;i<256;i=i+1) // loop for finding the median
begin
if(b[i]>4) ///////// condition for checking median
begin
b[i]=1;
median_out=i;
i=256; // loop breaks here
end
end
//*************************************************************************//
end
endmodule
Как я могу сделать код синтезируемым?
2 ответа
Сколько сумматоров генерируется вашим кодом? Я вижу как минимум 2100 8-битных сумматоров, которые работают в одном цикле.
Вы должны переосмыслить свой алгоритм: медианный фильтр нуждается в упорядоченном списке значений пикселей, поэтому сначала вам следует подумать об эффективном упорядочении чисел на ПЛИС.
Хороший подход к сортировке сетей, таких как:
- Нечетно-четное слияние или
- Битоновый вид.
Сортировка 9 чисел не может быть выполнена за один цикл, поэтому вам нужно конвейерную обработку. (Вы можете сделать это, но на очень низкой тактовой скорости.)
Наша PoC-библиотека содержит конвейерные сортировочные сети, но я никогда не тестировал эти сети с мощностью не более двух входных данных!
Я согласен со всем, что @Paebbels должен был сказать здесь. Однако есть некоторые дополнительные соображения. Как быстро поступают данные. Получаете ли вы новый набор из 10 значений для сортировки каждого тактового цикла? Если нет, вы могли бы выполнить конвейерную операцию и использовать намного меньше сумматоров и меньше этапов регистрации, даже до точки использования одного сумматора и сохранения результатов в ОЗУ блока (хотя это было бы намного медленнее). Кроме того, вы не упомянули, какую FPGA вы используете (хотя я предполагаю, что она небольшая). Любой дизайн FPGA должен учитывать доступные ресурсы на целевом устройстве. Вы также можете напрямую создать экземпляры накопителей-множителей DSP48 для сумматоров, если они не используются где-либо еще в вашем проекте, еще раз в зависимости от того, сколько вам нужно и сколько доступно на устройстве.