Image 如何使用verilog最有效地将rgb图像输入FPGA

Image 如何使用verilog最有效地将rgb图像输入FPGA,image,verilog,fpga,vga,quartus,Image,Verilog,Fpga,Vga,Quartus,我试图为FPGA编程编写一个verilog代码,在这里我将实现一个VGA应用程序。我使用Quartus II和Altera DE2 目前,我的目标是在编译过程中获得640x480 rgb图像,只要它有效,这种方法就无所谓。我想到的最好的解决方案是使用matlab将图片转换为rgb十六进制文件,并使用$readmemh将它们放入寄存器 但正如这里所讨论的: 这需要太多的时间,显然用这种方法是没有办法的。如果只是时间问题就好了,但也存在尺寸问题,640x480占用了大部分可用空间 我所希望的是一些系

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

目前,我的目标是在编译过程中获得640x480 rgb图像,只要它有效,这种方法就无所谓。我想到的最好的解决方案是使用matlab将图片转换为rgb十六进制文件,并使用$readmemh将它们放入寄存器

但正如这里所讨论的:

这需要太多的时间,显然用这种方法是没有办法的。如果只是时间问题就好了,但也存在尺寸问题,640x480占用了大部分可用空间

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

200x200 readmemh尝试的编译报告:

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

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

另一方面,块RAM是一种专用的两端口内存,包含数千位,具体取决于您的设备和RAM的制造商。这就是为什么大容量内存应该使用块RAM,而FIFO或小容量内存应该使用分布式RAM。DE2-115中提供的Cyclone IV EP4CE115F29具有432个M9K内存块3981312内存位

重要的一点是,读取操作是异步的,因为分布式RAM数据是在给定地址后立即从内存中读取的,不等待时钟边缘,而是块RAM的同步

单端口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

再一次:你能用你的编译报告ctrl+r显示屏幕截图而不是错误/警告消息吗?在这里,很抱歉误解,你可以在运行时加载图像。DE2板上有存储卡插槽。而且,据我所知,Terasic至少为DE2-115提供了一个例子//200x200图像初始开始$readmemmaneur.txt,mem\u R;最后,可能如您所建议的那样使用RAM,这非常有意义。但是你能告诉我你的例子中哪一部分决定了ROM和RAM之间的区别吗?除了ROM示例被声明为模块之外,我找不到结构上的差异。这真的能产生如此显著的差异吗?您需要确保使用了同步读取和一些用作addr的信号。如果你忘记了,Quartus合成器不会推断RAM/ROM内存。只是设法得到了一个图像,这正是我需要的。谢谢!