verilog $readmemh 为 50x50 像素 rgb 图像花费太多时间

verilog $readmemh takes too much time for 50x50 pixel rgb image

我正在尝试为 FPGA 编程编译 verilog 代码,我将在其中实现 VGA 应用程序。我使用 QuartusII 和 Altera。我正在尝试正确使用 readmemh 逐像素获取图片。

目前,我已经使用 matlab 将图片转换为 rgb 文本。每个都有以下格式,没有别的(示例): 03 A0 15 B7 ...

目前我没有收到任何语法错误,但是我必须定义三个寄存器,每个寄存器有 50x50 = 2500 位,而且编译速度很慢,我收到 "Timing requirements are not met" 警告。

当我想使用分辨率更高的文件时(640x480 会很好,但它似乎不受限制),情况要糟糕得多。获得 200x200 像素图像需要 15 分钟,.sof 文件大约 6MB。

没有办法使用 readmemh 进行大输入吗?

这就是我阅读的内容

...
reg [7:0] mem_R[0:2499];
reg [7:0] mem_G[0:2499];
reg [7:0] mem_B[0:2499];

initial begin

...

$readmemh("menuR.txt", mem_R);
$readmemh("menuG.txt", mem_G);
$readmemh("menuB.txt", mem_B);

end

我按如下方式访问它

if( mem_R[total_current-127510] > 0)
begin
menu_red   = 1;
end

首先,一些背景:

您可能会得到 "Timing requirements not met" 因为图像的大小 - 50x50x8x3 是相当多的存储位,如果它试图将它们存储到逻辑而不是片上 RAM 中,则更是如此。

一张 640x480 的图像是 900 kB,因此只有最大的 FPGA 才能存储它们,即使是在片上 RAM 中也是如此——例如,最大的 Cyclone IV 只有 810 kB 的嵌入式存储器。如果您打算使用这种大小的图像,请考虑连接片外 RAM。

您在启动时看到的图像很可能是存储在 EPCS 中的图像 - 一个 2MB 到 16MB 的闪存,用于在启动时加载默认配置。它加载配置(就像通过 USB 对其进行编程一样)和任何片上存储器。如果您使用的是 Altera DE 系列板之一,则启动图像不会存储为 640x480 - 它会被硬件放大到该分辨率。

另外,你说的15分钟是指编译时间还是加载.sof到芯片所需的时间?请注意,HDL 编译并非不合理,如果这就是您所指的。 Quartus 不仅需要编译您的 HDL,还需要确定它需要哪些逻辑元件、将它们放置在芯片上的什么位置以及如何连接它们。构建大型设计可能需要数小时或更长时间。

最后,关于您的问题,您可能还想查看 .mif(内存初始化文件)and/or .hex 文件与 on/off-chip RAM IP 核的组合,因为它们可能是更适合您的需求。参见:http://quartushelp.altera.com/14.1/master.htm#mergedProjects/reference/glossary/def_mif.htm