verilog中的快速数组内部访问

时间:2018-03-23 08:20:28

标签: verilog fpga

我在下面有一些代码:

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]];

那么有没有办法改善访问内存?谢谢。

1 个答案:

答案 0 :(得分:1)

请记住,Verilog是一种硬件仿真语言。 这使得您必须学习编写两种不同类型的代码:

  • 转换为硬件的代码
  • 测试台代码

前者有更多限制。正如您所注意到的那样,您将获得512个比较器,每个比较器比较6位,每个比较有条件地选择37个PIXELWIDTH值中的一个,并将其分配给512个PIXELWIDTH目的地之一。我的猜测很容易就是百万门。

你必须使用分治法。正如邱所说,使代码顺序:每个时钟周期一次操作。这需要更多的时钟周期,但逻辑要少得多。很遗憾,您可能会发现自己没有足够的时间来处理处理整个图像(帧?)时间。然后选择每个周期进行两次或四次操作 你必须不断权衡速度与门数和门数之间的关系。功率。也许您发现使用所选硬件无法完成操作。 (没有人说写Verilog很容易!)

我不知道它是否有帮助,但如果使用的话,你可以让编译器/优化器的生活更轻松:

rx_512[p] <= x_vector[counter2];