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


10

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

矫kill过正-使用整台机器跳舞一些LED ... 我想修改兔子的NeTV以处理未加密的HDMI视频输入并驱动某些LED。我知道NeTV是为其他目的而设计的,但我认为可以对其进行修改以实现我的目标。我不在乎底层的Linux子系统,I2C欺骗,视频覆盖等。目前,我不关心使用HDCP加密流。

NeTV原理图

NeTV源代码

FPGA框图 NeTV框图
这是Bunnie演示幻灯片之一的框图。幻灯片
其余部分在这里

幻灯片显示HSYNC,VSYNC,PIXCLK
这张幻灯片似乎暗示着实际上对视频像素进行了解码(不一定是解密

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

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

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

  3. 我已经研究了源代码,以了解应在何处“访问”视频数据。
    这看起来像是合适的位置:
    DVI解码器框图
    我知道,此图像很长-这是我在清楚阅读时可以做的最好的事情。怪罪的Xilinx的工具!
    这似乎吸收了TMDS数据并为每种颜色输出8位。

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

抱歉,如果这是罗word的或冗长的-我正在尝试透彻...我只需要一些帮助就可以启动了。这是我对FPGA项目的首次尝试-有些人可能说这对初学者来说太难了,但我说...必须从某处开始:)感谢您的阅读。


1
NeTV不会解码HDMI流。它遵循HDCP协商过程,并对新流进行加密以进行匹配;我认为您将无法从中获取视频信息。
akohlsmith

您能否张贴(链接至)相关原理图?同样,声明相关的HDL模块也会有所帮助。
drxzcl 2012年

1
@AndrewKohlsmith,那么叠加是在电视端完成的吗?哇,我不知道HDMI可以做到这一点!
drxzcl 2012年

1
我不确定您是否可以在不使用外部存储帧缓冲区的情况下完成所需的一切,但是无论如何,您打算使用哪种颜色分析?如果是FFT,则将花费一些时间,我不确定环境光是否不会太晚于视频颜色。我先说一下,尝试从HDMI获取数据并检查是否可以分析它。例如,做一个低通滤波器并输出结果。
苏格拉底

1
我记得当NeTV出来时读过这篇文章。根据该帖子,Bunnie使用了一种棘手的覆盖方案,该方案不需要解密源HDMI。他只是在必要时重新加密它。没有对加密流进行解码。
mng 2012年

Answers:


7

我的答案完全基于dvi_decoder模块的代码和文档,并假定它实际上如广告所示那样工作。该文件似乎是应用笔记IP中的IP的(已修改?)副本。Spartan-3A FPGA中使用TMDS I / O和/或Spartan-6 FPGA中实现TMDS视频接口的视频连接。这些应用笔记充斥着重要的细节,我建议您仔细阅读它们。

正如您在问题中指出的那样,我将假定您正在处理未加密的流,即非HDCP流。我非常确定,NeTV项目中的信息可以进行修改以解密HDCP,但这将涉及大量琐碎的额外工作,并且取决于您的司法管辖区具有可疑的法律依据。

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

您将需要一些基本逻辑来转换hsyncvsync并将像素时钟转换到(X,Y)位置。只需实例化两个计数器,一个用于X,另一个用于Y。增量X在每个像素时钟。在重置X为零hsyncY每增加一个hsyncY每次重置为零vsync

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

因为我们要在进行累积时驱动显示,所以我们需要进行双重缓冲。因此,每个组件每个盒需要两个寄存器。如果您使用的是25位主导的字符串,这意味着您将需要25 * 3 * 2 = 150个寄存器。相当多,所以您可能要使用块ram而不是寄存器。这完全取决于您的确切要求,进行实验!

我认为您将像在adafruit项目工具包中使用的那样驱动led 灯串。您应该能够弄清楚如何使用SPI从寄存器中的值驱动它。

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

另外,如果您尚未购买用于该项目的NeTV,我建议您也看看Digilent的Atlys板。具有两个HDMI输入和两个HDMI输出,它似乎是为此类项目量身定制的。


NP,谢谢您的精彩提问。如果您在此项目中遇到任何特定问题,请随时发表。
drxzcl 2012年

顺便说一句,(这超出了问题的范围)您是否考虑过从相对强大的微控制器系统中驱动事物?RaspberryPi之类的东西便宜约6倍,应该能够驱动LED并同时显示视频。
drxzcl 2012年

仍在等待我的JTAG工具出现,因此我可以使用ChipScope进行调试...去接受这个答案;它提出了解决此问题的基本方法。@drzxcl我已经拥有了netv。RaspPi是一个有趣的建议,但是不可能将hdmi用作视频源。
dext0rb

你有没有得到这个工作?我希望看到剧本/视频!
drxzcl

不,不是。:| 我做了一个半定的LED驱动器,但还没有时间深入研究它。希望不久。
dext0rb
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.