如何改进代码以缩短合成时间?

时间:2016-04-24 09:15:22

标签: verilog xilinx synthesize

我使用累积直方图方法在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 个答案:

答案 0 :(得分:3)

您的代码生成了多少个加法器?我看到至少2,100个8位加法器在同一个循环中工作。

你应该重新考虑你的算法:中值滤波器需要一个有序的像素值列表,所以首先你应该考虑在FPGA上有效的数字排序。

一种好的方法是分类网络,如:

  • 奇数偶数合并排序或
  • Bitonic排序。

在一个周期内无法对9个数字进行排序,因此您需要进行流水线操作。 (你可以这样做,但时钟速度非常低。)

我们的PoC-Library包含流水线sorting networks,但我从未使用两个输入大小的非幂来测试这些网络!

答案 1 :(得分:0)

我同意@Paebbels在这里所说的一切。但是,还有一些额外的考虑因素。数据进入的速度有多快。您是否获得了一组新的10个值来对每个时钟周期进行排序?如果没有,您可以管理操作并使用更少的加法器和更少的寄存器阶段,甚至可以使用单个加法器并将结果存储在块RAM中(尽管这会慢很多)。此外,您还没有提到您正在使用哪种FPGA(尽管我猜这是一个很小的FPGA)。任何FPGA设计都需要考虑目标器件上的可用资源。您还可以直接为加法器实例化DSP48乘法器 - 累加器(如果它们未在您的设计中的其他位置使用),再次取决于您需要多少以及设备上可用的数量。