我在下面有一些代码:
wire [WIDTH_PIXEL-1:0] x_vector [0:36];
wire [6-1:0] x_sample [0:511]; // 0 <= x_sample <= 36
reg [WIDTH_PIXEL-1:0] rx_512 [0:511];
genvar p;
generate
for(p=0;p<=511;p=p+1) begin: PPP
always@(posedge clk) begin
if(x_sample[p] == counter2) begin
rx_512[p] <= x_vector[x_sample[p]];
end
end
我想保存512个x_vector元素,其地址是x_sample [p]的值。问题是当我在Quartus上合成时,总LC组合超过50000.我知道问题出在线上
rx_512[p] <= x_vector[x_sample[p]];
那么有没有办法改善访问内存?谢谢。
答案 0 :(得分:1)
请记住,Verilog是一种硬件仿真语言。 这使得您必须学习编写两种不同类型的代码:
前者有更多限制。正如您所注意到的那样,您将获得512个比较器,每个比较器比较6位,每个比较有条件地选择37个PIXELWIDTH值中的一个,并将其分配给512个PIXELWIDTH目的地之一。我的猜测很容易就是百万门。
你必须使用分治法。正如邱所说,使代码顺序:每个时钟周期一次操作。这需要更多的时钟周期,但逻辑要少得多。很遗憾,您可能会发现自己没有足够的时间来处理处理整个图像(帧?)时间。然后选择每个周期进行两次或四次操作 你必须不断权衡速度与门数和门数之间的关系。功率。也许您发现使用所选硬件无法完成操作。 (没有人说写Verilog很容易!)
我不知道它是否有帮助,但如果使用的话,你可以让编译器/优化器的生活更轻松:
rx_512[p] <= x_vector[counter2];