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