您也可以在 VHDL 中执行此操作,但这需要大量的编码工作,因为没有任何现成的解决方案可用于解码压缩图像。更好的解决方案是手动将测试输入图像转换为像 BMP 这样的位图格式,或者将其合并到启动测试平台的脚本中。
BMP 文件格式在 Wikipedia 上有详细记录。这种格式有许多不同的变体,但我们将就一些特定设置达成一致,这将使我们更容易。为了创建我们的输入图像,我们在 Windows 预装的 Microsoft Paint 中打开它们。然后,我们点击文件→另存为 , 选择另存为类型:24-bit Bitmap (*bmp; *.dib) .将文件命名为以 .bmp 后缀结尾的名称,然后单击保存。
通过确保像这样创建文件,我们可以假设标题始终是 54 字节长的 BITMAPINFOHEADER 变体,像素格式为 RGB24,在维基百科页面上提到。此外,我们只关心标题中的几个选定字段。下表显示了我们将要读取的标题字段。
标记为绿色的值是我们真正需要查看的唯一值,因为我们知道在其他标头字段中期望哪些值。如果您同意每次只使用预定义的固定尺寸的图像,您可以跳过整个标题并从 BMP 文件中的字节偏移数 54 开始读取,这就是像素数据所在的位置。
尽管如此,我们将检查其他列出的值是否符合预期。这并不难,因为我们已经在阅读标题了。如果您或您的同事将来随时向测试平台提供错误编码的图像,它还可以防止用户错误。
这篇博客文章是关于如何在 VHDL 测试平台中从文件中读取图像,但为了完整起见,我提供了一个示例 DUT。在读取图像时,我们将通过 DUT 流式传输像素数据。最后,我们将结果写入另一个输出 BMP 文件,该文件可以在您喜欢的图片查看器中查看。
上面的代码显示了我们 DUT 的实体。灰度模块将一个像素的 24 位 RGB 数据作为输入,并将其转换为在输出上呈现的灰度表示。请注意,输出像素表示仍在 RGB 颜色空间内的灰色阴影,我们不会将 BMP 转换为不同格式的灰度 BMP。
该模块是纯组合的,没有时钟或复位输入。当某些东西被分配给输入时,结果会立即出现在输出上。为简单起见,根据 ITU-R BT.2100 RGB 到亮度编码系统,向灰度的转换使用亮度(亮度)值的定点近似值。
您在下面看到的波音 747 的图片将是我们的示例输入图像。也就是说,这不是嵌入在这篇博文中的实际 BMP 图像,这是不可能的。这是我们将在测试平台中读取的 BMP 图像的 JPEG 表示。您可以通过在上面的表格中留下您的电子邮件地址来索取原始 BMP 图片,您将立即在收件箱中收到它。