如何创建基于 FPGA 的流光溢彩克隆?

电器工程 FPGA hdmi
2022-01-22 09:58:18

一些快速背景:
流光溢彩是一些飞利浦电视上的系统,它分析屏幕上的颜色信息,然后在显示器背面设置一些 LED 以将屏幕颜色投射到墙上。这是一个非常漂亮的效果。现在有该系统的克隆版本,它们使用 PC 来处理视频和控制 LED。我觉得这有点矫枉过正 - 使用整台机器来跳舞一些 LED ......

我想修改bunnie 的 NetTV来处理未加密的HDMI 视频馈送并驱动一些 LED。我知道 NetTV 是为其他目的而设计的,但我觉得可以对其进行修改以实现我的目标。我不关心底层的 Linux 子系统、I2C 欺骗、视频覆盖等。此时,我不关心使用 HDCP 加密流。

网络电视原理图

网络电视源代码

FPGA 框图 网络电视框图
这是来自 bunnie 演示幻灯片之一的框图。
幻灯片的其余部分在这里

幻灯片显示 HSYNC、VSYNC、PIXCLK
这张幻灯片似乎暗示视频像素实际上是经过解码的(不一定是解密的)

最后......我的一些想法和问题:

  1. 这可以在我想要的硬件上完成吗?如果“是”,请继续!如果“否”,请告诉我我还需要什么!

  2. 我可以在没有任何外部存储器的情况下处理视频信息吗?据我所知,没有 FPGA 可以直接访问的内存。这可能取决于我用来处理视频数据的算法 - 尽可能少地使用 FPGA Block RAM,我猜我想对进入的像素使用某种“迭代求和”,而不是存储一个整体图片数据帧,然后平均颜色。关于实现这个算法的任何提示?如何开始这是我最大的障碍。

  3. 我已经调查了源代码,以了解我应该在哪里“利用”视频数据。
    这看起来是合适的位置:
    DVI解码器框图
    我知道,这张图片很长 - 这是我能做到的最好的,同时让它清晰易读。责怪 Xilinx 的工具!
    这似乎接收 TMDS 数据并为每种颜色输出 8 位。

  4. 我应该为 LED 驱动器设置某种状态机——每个时钟周期,它都会从我创建的任何模块获取像素信息以处理视频数据。

对不起,如果这是冗长或冗长的 - 我正在努力彻底......我只是需要一些帮助才能开始。这是我对 FPGA 项目的第一次尝试——有些人可能会说这对初学者来说太难了,但我说……必须从某个地方开始 :) 感谢阅读。

1个回答

我的答案完全基于dvi_decoder 模块的代码和文档,并假设它实际上像宣传的那样工作。该文件似乎是应用笔记中 IP 的(修改过的?)副本Video Connectivity Using TMDS I/O in Spartan-3A FPGA和/或Implementing a TMDS Video Interface in the Spartan-6 FPGA这些应用笔记充满了重要的细节,我建议你仔细阅读它们。

正如您在问题中指出的那样,我假设您正在处理未加密的流,即非 HDCP 流。我相当肯定 NetTV 项目中的信息可以用于解密 HDCP,但它会涉及大量的额外工作,并且取决于您所在的司法管辖区,其法律依据存在问题。

看起来您将能够从 dvi_decoder 块的输出中获取所需的数据。该模块使用导线输出 24 位颜色信息redgreenblue与像素时钟同步pclk输出hsyncvsync分别提醒用户一行/屏幕的末尾。通常,您应该能够使用这些输出进行动态平均。

您将需要一些基本逻辑来转换hsyncvsync并将像素时钟转换为 (X,Y) 位置。只需实例化两个计数器,一个 forX和一个 for Y以每个像素时钟递增X在 处重置X为零hsync每递增Y一次hsyncY每次重置为零vsync

使用redgreenblue您可以进行动态平均。通过与和进行比较,您可以确定每个像素应该对哪个框做出贡献(如果有)。将颜色值求和到累积寄存器中。要获得平均值,您需要将寄存器中的值除以像素数。如果你很聪明,你会确保像素数是 2 的幂。然后你可以将寄存器的 MSB 连接到你想驱动的任何东西。XYXY

因为我们想在累积的同时驱动显示器,所以我们需要做双缓冲。因此,每个组件的每个盒子都需要两个寄存器。如果您使用的是 25-led 字符串,这意味着您将需要 25*3*2=150 个寄存器。这是相当多的,所以你可能想使用块内存而不是寄存器。这一切都取决于您的确切要求,实验!

我假设您将驾驶一个与原始 adafruit 项目套件中使用的一样的 LED字符串。您应该能够很容易地弄清楚如何使用 SPI 从寄存器中的值驱动它。

dvi_decoder 模块是一个相当复杂的套件。我建议你详细研究应用笔记。

顺便说一句,如果您还没有购买用于该项目的 NetTV,我建议您也看看Digilent 的 Atlys 板它具有两个 HDMI 输入和两个 HDMI 输出,似乎是为此类项目量身定制的。