关于图像:如何最有效地将 rgb 图片导入 FPGA,使用 verilog

How to get a rgb picture into FPGA most efficiently, using verilog

我正在尝试为 FPGA 编程编写一个 verilog 代码,我将在其中实现一个 VGA 应用程序。我使用 Quartus II 和 Altera DE2。

目前,我的目标是在编译期间获得 640x480 rgb 图像(方法无关紧要,只要它有效且有效)。我想出的最佳解决方案是使用 matlab 将图片转换为 rgb 十六进制文件,并使用 $readmemh 将它们放入寄存器中。

但正如这里所讨论的:verilog $readmemh 对于 50x50 像素 rgb 图像需要太多时间

这需要太多时间,而且显然没有办法用这种方法解决它。如果只是时间问题就好了,但也有尺寸问题,640x480 几乎占用了大部分可用空间。

我希望的是一些系统函数或可变类型的verilog,它们将以不同的方式获取和存储图片,这样大小就不再是问题了。我已经检查了 verilog 和 quartus 网页的解决方案,但我相信应该有一种更快的方法来完成这项一般任务,而不是从头开始编写一些东西。

200x200 自述文件尝试的编译报告:
200x200


根据您的编译报告,我建议您使用块 ROM(或 RAM)内存,而不是寄存器来存储图像。

此时您正在使用分布式 RAM,即 FPGA 的每个小逻辑块内可用的内存。这使得分布式 RAM 成为小型存储器的理想选择。但是当涉及到大内存时,这可能会导致额外的连线延迟并增加合成时间(合成器需要连线所有这些模块)。

另一方面,块 RAM 是专用的两端口内存,包含几千位(取决于您的设备和制造商)的 RAM。这就是为什么您应该将块 RAM 用于大型存储器,而将分布式 RAM 用于 FIFO 或小型存储器。 Cyclone IV EP4CE115F29(在 DE2-115 中可用)有 432 个 M9K 内存块(3981312 个内存位)。

有一点很重要,分布式 RAM 的 READ 操作是异步的(一旦给出地址就从内存中读取数据,不等待时钟沿),但对于块 RAM 是同步的。

单口ROM存储器示例(Quartus II Verilog Template):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
module single_port_rom
#(parameter DATA_WIDTH=8, parameter ADDR_WIDTH=8)
(
    input [(ADDR_WIDTH-1):0] addr,
    input clk,
    output reg [(DATA_WIDTH-1):0] q
);

    // Declare the ROM variable
    reg [DATA_WIDTH-1:0] rom[2**ADDR_WIDTH-1:0];

    initial
    begin
        $readmemh("single_port_rom_init.txt", rom);
    end

    always @ (posedge clk)
    begin
        q <= rom[addr];
    end

endmodule