如何使用verilog最有效地将rgb图片导入FPGA

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

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

目前,我的目标是在编译过程中得到一个 640x480 rgb 图像(方法无所谓,只要它有效并且有效)。我想出的最佳解决方案是使用 matlab 将图片转换为 rgb hex 文件,并使用 $readmemh 将它们放入寄存器中。

但正如这里所讨论的:

这太花时间了,而且显然没有办法用这种方法解决它。如果只是时间就好了,但还有尺寸问题,640x480 几乎花费了大部分免费 space。

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

200x200 readmemh 尝试的编译报告:

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

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

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

重要一点,分布式RAM的READ操作是异步的(地址一给定就从内存中读取数据,不等待时钟边沿),但是block是同步的内存.

单口ROM存储器实例(Quartus II Verilog模板):

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