第1步:材料
完成此项目您将需要:
-任何具有HDMI和以太网的ZYNQ板都可以正常工作/我正在使用Digilent Zybo
-USB A到micro B USB电缆
-HDMI电缆
-以太网电缆
-带有HDMI输入的显示器
软件
-Xilinx Vivado
-Xilinx SDK
步骤2:输出-VGA控制器第1部分
我们将使用开发板上的HDMI端口输出视觉数据。 HDMI端口连接到ZYNQ的PL(可编程逻辑= FPGA)端,我们将需要为其设计VHDL控制器。如果您曾经设计过VGA控制器,您会发现它非常相似。 HDMI和VGA的时序实际上是相同的,实际上您可以在现有的VGA控制器上构建以获得HDMI控制器。
为更好地了解实际情况,我们将首先设计一个VGA控制器
我们要以1920x1080的分辨率显示。
VGA控制器负责将像素数据(RGB格式)依次逐像素传输到显示器。在1920x1080的实际显示区域之外,还有一些“边界”区域,即:前沿,后沿和回扫。这些区域的像素大小是标准的,并针对每种分辨率。这些区域实际上并没有出现在屏幕上,但是它们是必需的,并且该区域中像素的颜色必须为黑色。一个有效的问题是,为什么需要这些额外的区域。这个问题违背了这个可指导性的目的,但是如果您好奇的话,我鼓励您在线进行进一步研究。
这是一个很好的视频,解释了VGA接口https://goo.gl/vfSw6o
在我们的情况下,我们希望以1920 * 1080的分辨率进行显示,这些时间是:
水平显示区域= 1920像素
水平Fron门廊= 88像素
水平后沿= 148像素
水平回扫= 44像素
垂直显示区域= 1080像素
垂直前沿= 4像素
垂直后沿= 36像素
垂直回扫= 5像素
(您可以在此处找到其他分辨率的时间http://goo。 gl/hFNRVb)
因此,我们的实际分辨率为2200 x1125。我们希望60 fps(每秒帧数),因此我们的像素时钟将为60 * 2200 * 1125 = 148.5 MHz。在Zybo板上,提供了125 Mhz的时钟。我们将使用MMCM IP生成所需的148.5 MHz像素时钟。
步骤3:输出-VGA控制器第2部分
《在上一步的理论背景下,您应该可以设计自己的VGA控制器。我将为您提供一个Vivado项目,但我建议您至少尝试自己尝试一下。
大多数VGA端口不会为每个像素的每个颜色通道提供8位(参见上图),因此您需要使设计适应开发板提供的每种颜色的引脚数(尽管这对于HDMI来说不是问题)。
设计会将整个屏幕涂成蓝色,除了左上方的像素将变为红色。应当指出,该项目使用了ZYBO董事会的约束条件。因此,如果要在另一个开发板上运行该项目,则应更新约束文件并调整每种颜色的引脚数。
请看图nr。 2.请记住,尽管我们的VGA控制器在每种颜色下输出5/6位,但是在通过电缆之前,这些位会针对每种颜色通道(红色,绿色和蓝色)转换为一个模拟信号。
第4步:输出-HDMI控制器第1部分
现在,我们知道了VGA控制器的工作原理,并且我们有一个可行的设计,我们可以继续使用HDMI控制器。 HDMI控制器实际上将使用我们在VGA控制器中开发的所有代码。 HDMI和VGA使用相同的时序和相同的信号。差异出现在输出引脚上。
虽然VGA每种颜色使用一根线并传输一条模拟信号,但HDMI每次每种颜色以1位数字方式传输数据并使用差分信号。差分信号意味着HDMI的每一位都有2个引脚,而另一个则相反。因此,如果我们要传输信号“ 1”,我们将在一根线上传输“ 1”,而在另一根线上传输“ 1”。这样可以确保信号的完整性,您可以在https://goo.gl/6CPCzB上了解更多信息。对于每种颜色(红色,绿色和蓝色),我们都有一个通道,对于时钟,我们有一个通道。由于差分信号的特殊性,我们通过HDMI发送的信号必须经过DC平衡处理,这意味着1和0的数量必须在特定的时间范围内大致相等。为了实现这一点,我们将使用8b/10b编码。您可以从DVI规范(http://goo.gl/hhh8Ge,DVI和HDMI使用相同的视频信号)上了解很多有关差分信号和8b/10b编码的工作原理。
第5步:输出-HDMI控制器第2部分
足够的理论,让我们进入我们的项目。在VGA控制器中,我们获得了148.5 MHz的时钟,但是在这里,我们将不得不提供10倍的频率,因为我们要为每种颜色传输8位,并使用8b/10b编码转换为每个像素10位和10 * 148.5MHz = 1485MHz。这是Zybo板上无法获得的巨大频率。幸运的是,我们掌握了一些技巧。我们可以管理5 * 148.5MHz = 742.5MHz,我们将使用OSERDES(串行器)IP在742.5Mhz时钟的上升沿和下降沿都传输数据,因此实际上我们将以1485MHz传输数据。 Vivado会给我们一些时间警告,您可以始终使用较小的时钟来获得较低的分辨率,但是由于它可以正常工作,因此我们暂时不介意(警告与时钟缓冲区未正式存在有关
因此,我们需要做的是将来自VGA控制器输出的数据编码为8b/10b格式,然后如上所述进行序列化。我们还需要在项目中添加另一个MMCM,以生成用于序列化的742.5MHz时钟。
我在编码器和序列化器的vhdl文件下面附加了该文件。您必须首先对RGB通道进行编码,然后对其进行序列化。
红色通道示例:
TMDS_encoder_RED:TMDS_encoder
端口图(clk148,red_channel_8bits,c_red,video_on ,encode_red_10bits);
Serialiser_RED:Serialiser10_1
端口映射(clk148,clk742,encoded_red_10bits,重置,red_serial_1bit);
TMDS_encoder的“ c”输入是红色和绿色的“ 00”,蓝色是“ vsync&hsync”(这是DVI规范http://goo.gl/hhh8Ge)。
步骤6:从RAM显示图像
HDMI控制器的目的是显示处理后的图像。现在,在实现控制器并准备就绪后,我们应该考虑为该控制器提供数据。鉴于很多图像增强过程将在PS中进行(处理系统= ARM处理器),并且生成的图像将驻留在DDR RAM中。因此,我们需要一种从RAM到HDMI控制器获取数据的方法。
要实现此目的,您需要3个IP:
1)VDMA(视频直接内存访问) )
2)VTC(视频定时控制器)
3)流到视频输出(从现在开始我们将其称为S2VO)
S2VO实际上将提供输出的RGB 24BIT信号以及所需的HSYNC和VSYNC信号。因此,我们可以省去HDMI控制器的那一部分。
您应该将这些IP添加到设计中,进行配置并进行正确的连接。
最后,您应该得到类似于
步骤7:输出-SDK END
所有硬件均已设置好并准备就绪,我们现在必须在PS中构建软件。我们将导出硬件和比特流并启动SDK。
1)文件-》导出-》导出硬件-》选中包括比特流,然后按确定
2)文件-》启动SDK
在SDK中创建一个新的应用程序项目。
3)文件-》新建-》应用程序项目
4)为您的项目选择一个名称,然后按下一步
5)选择“ Hello World”模板然后按Finish
SDK中的应用程序将需要对VDMA进行编程。为了完成此操作,使用了一些标准功能(我会在有空的时候进行详细介绍)。
为了测试我们的设计,我们将使用SDK Restore(Xilinx工具-》转储/还原) )功能可将图像放入DDR RAM内存并使用我们的HDMI控制器显示。您可以将图像加载到所需的任何位置(内存开头的一些较小的受限区域除外)。在我们的示例中,我们选择了地址16777216,文件大小为8294400 = 1920 * 1080 * 4(4个通道= RGB + alpha)。
责任编辑:wv
-
HDMI
+关注
关注
32文章
1676浏览量
151680 -
usb
+关注
关注
60文章
7903浏览量
264042
发布评论请先 登录
相关推荐
评论