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 自述文件尝试的编译报告:
根据您的编译报告,我建议您使用块 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 |