Verilog合成时间太长

Verilog合成时间太长,verilog,Verilog,我正在尝试编写一个verilog代码,在640X480像素的图像上实现人口普查转换。我以行为形式编写了完整的代码。但是代码合成的时间太长了。我知道原因可能是长寄存器数组和循环,但我不确定如何处理。 这是我的密码: module test(in,clk,out ); input clk; input [7:0] in; output [119:0]out; reg [7:0]matrix[0:639][0:479]; //reg [119:0]wi

我正在尝试编写一个verilog代码,在640X480像素的图像上实现人口普查转换。我以行为形式编写了完整的代码。但是代码合成的时间太长了。我知道原因可能是长寄存器数组和循环,但我不确定如何处理。
这是我的密码:

module test(in,clk,out
    );
    input clk;
    input [7:0] in;
    output  [119:0]out;
    reg [7:0]matrix[0:639][0:479];
    //reg [119:0]win[0:10][0:10];
    reg [9:0] i = 0;
    reg [8:0] j = 0;
    reg [12:0] count = 0;
    integer p,q = 6;
    integer a,b = -6;
    reg [119:0]censusTransformedImage;
    reg [119:0]census=0;
    always@ (posedge clk)
    begin
        if(count<=6411)
            count = count+1;
    end
    always @ (posedge clk )
    begin
        if(i<=639)
        begin
            matrix[i][j]=in;
            i=i+1;
        end
        else if(i==639 && j<=479)
        begin
            i=0;
            j=j+1;
        end
        //end
    end

    always @ (posedge clk)
    begin
        if(count > 6411)
        begin
            if(p<=634)
            begin
                if(q<=479)
                begin
                    //census = 0;
                    if(a<=6)
                    begin
                        if(b<=6)
                        begin
                            if(~(a==0 && b==0))
                            census=census<<1;
                            if (matrix[p+a][q+b] > matrix[p][q])
                        census=census+1;
                                b = b+1;
                        end
                        else
                        begin
                            b=-6;
                            a=a+1;
                        end 
                    end
                    else
                    begin
                        censusTransformedImage=census;
                        census=0;
                        a=-6;
                        q=q+1;
                    end
                end
                else
                begin
                    q=0;
                    p=p+1;
                end
            end
        end
    end
   assign out = censusTransformedImage;
endmodule
模块测试(输入、时钟、输出
);
输入时钟;
在中输入[7:0];
输出[119:0]输出;
reg[7:0]矩阵[0:639][0:479];
//注册[119:0]赢[0:10][0:10];
reg[9:0]i=0;
reg[8:0]j=0;
reg[12:0]计数=0;
整数p,q=6;
整数a,b=-6;
reg[119:0]审查Transformedimage;
reg[119:0]普查=0;
始终@(posedge clk)
开始

如果(count合成器可能尝试将您的矩阵实现为分布式内存。也就是说,使用从FPGA片中取出的触发器。必须避免这种情况,因为您将耗尽FPGA设备的几乎所有资源,仅实现该内存块

相反,将矩阵内存设计为一个独立的模块,具有一个输入地址(坐标i,j)、一个8位输出数据和一个8位输入数据。类似于:

module matrix (
  input clk,
  input wire [9:0] i,
  input wire [8:0] j,
  input write_enable,
  input wire [7:0] din,
  output reg [7:0] dout
  );

  reg [7:0] M[0:307199]; // your 640x480 matrix
  wire [18:0] addr;

  assign addr = i*640+j; // let's hope the synthesizer is able to
                         // implement this without having to use
                         // an actual multiplication engine
                         // (it shouldn't need to)
  always @(posedge clk) begin
    if (write_enable == 1'b1)
      M[addr] <= din;
    dout <= M[addr];
  end
endmodule
模块矩阵(
输入时钟,
输入线[9:0]i,
输入线[8:0]j,
输入write_enable,
输入线[7:0]din,
输出调节器[7:0]dout
);
reg[7:0]M[0:307199];//您的640x480矩阵
导线[18:0]地址;
分配addr=i*640+j;//希望合成器能够
//实现这一点而不必使用
//实际乘法引擎
//(应该不需要)
始终@(posedge clk)开始
如果(写入启用==1'b1)

M[地址]人口普查的窗口大小是11X11。你真的模拟过这个代码吗?它不可能真正做到你想要的。有这么多问题,首先是:
矩阵
的每个元素在每个时钟点上都将等于
中的
。thanx@nguthire,这是我的一个错误,我已经相应地编辑了代码。但是问题仍然存在。合成时间太长。您可能违反了合成工具中的一些编码准则。请参阅您应该使用非阻塞分配(
如果合成器无法以最佳方式处理与常数相乘,则可以手动执行。
i*640+j
可以写成
{i,9'h000}+{i,7'h00}+j
。它没有直接工作,但我将RAM更改为手动阻止RAM。现在它工作了,但不幸的是它占用了100%以上的资源。我想我必须想些别的。您可能必须在算法中保留一些并行性,然后首先尝试使用更传统的方法实现它(如顺序)方法。有关如何将算法编写为硬件模块的详细信息,请参见本SO问题: