加班猫

如果我那天发财了,我会告诉你,我比你强的地方就是,我知道你不知道,你知道的都是废话。

AC701板子的ADV7511的HDMI输出测试

0
阅读(4291) 评论(5)

      第一次拿到开发板,看了板子上有HDMI输出,所以第一个想办法点亮HDMI的输出数据。

参考网上的《VESA Monitor Timing Standard》,该实例中是参考1024*768@60Hz,时钟为65MHz的时序标准设计。

SAA7121-220426.jpg

SAA7121-220501.jpg

       对于该时序表,输出一个基本VESA时序是使用两个行计数和列计数器,根据计数器的位置来输出对应VSYNC,HSYNC,DE信号。在HDMI必须有该三种信号才有图像显示。

SAA7121-220806.jpg

SAA7121-220814.jpg


SAA7121-220831.jpg

有人问什么时候选择VSYNC正向,什么时候选择HSYNC反向。其实你写任何分辨率时序的时候,都可以正向,就是跟DE有效的时候,HSYNC和VSYNC也是高电平。所以不用担心输出。只是HDMI输入的时候,得去检测DE有效的状态,VSYNC和HSYNC是否同相位。

     写完该程序以后,然后在调用XILINX的iP核心,设置锁相环时钟。注意一个问题。那就是AC701是差分系统时钟输入。所以必须使用IBUFGS去明示该时钟引脚是差分时钟。导入XDC约束引脚问题。生成bit文件。

IBUFGDS CLK_U(

 .I(clk_p),

          .IB(clk_n),

           .O(clk)

);

    通过上述的IBUFGDS来把差分时钟变成单时钟,然后转换后的时钟利用PLL锁相环配置成输出65M。记住输入时钟是200MHz。

    出人意料的事情,AC701板子并没有显示HDMI数据。我原本认为差分时钟是否没约束好,导致没有时钟,实际用DEBUG工具发现时钟是有的。

    百度之后才发现ADV7511这个芯片必须配置才能运行工作。

    看AC701的原理图发现I2C总线是通过I2C切换器PCA79548A这个芯片切换I2C。注意官方的资料I2C地址是错误的,我调试到两眼发晕才发现地址是E8。而且告诉你们一个技巧,因为没有设备寄存器的。所以为了兼容后面ADC7511程序,可以写两次数据,都是会返回ACK信号。也就是寄存器是FF,数据也是FF。这样不需要大的改动。

    xilinx的很多板子都是PCA7954x这种恶心的芯片来做i2c 切换器,所以每次都要设定PCA7954这类芯片的数据。还有记住一点记住每次设定PCA7954芯片都是要进行复位,复位时间必须满足500ns,恢复I2C的功能也得100ns。

    通过I2C总线切换器打开所有的数据通道后,就可以跟ADV7511芯片进行通信。ADV7511的I2C设置地址为0x72。

    打开https://ez.analog.com/docs/DOC-1740, 这个网站是ADV7511所有的资料。在官方的datasheet根本没讲述太多寄存器的设置问题。

    在《ADV7511_Programming_Guide.pdf》这个pdf文件中,我们需要去了解ADV7511的基本设置要求。

SAA7121-223448.jpg

SAA7121-223455.jpg

      在set up the video input mode 黑体字上面的寄存器,我们是不需要关注的。关注是输入的输入模式。

SAA7121-224042.jpg

     根据AC701的原理图,ADV7511的总线输入D0-D3,D12-D15,D24-D27是没有输入,也就是RGB4:4:4,每位数据是8位的模式。直接设置0x15 [3:0]) to 0x0数据,0x16的【3:2】数据对其模式也不需要设置了。把0X16的[5:4]设置11,为8位数据,其他的位数的值都是默认的。0x17【1】是指图像的长和宽的比率,可以设置为0或者1,在实际的液晶屏幕也不会根据该数据变化,而是根据液晶自己的设置,自动拉伸满屏模式。0x18【7】是开启色彩范围拉伸的方式,我们做的设计是RGB直接映射成RGB,所以直接禁用就可以。0X18[6:5]这个时候也无效使用了。在0XAF【1】是设定HDMI或者DVI模式,HDMI比DVI最直接的一点是HDMI可以发送数字音频数据和加密数据内容。这次我们是不需要,直接设置成DVI模式,值就是0。对于0XAF[7],设定为0,关闭HDMI加密功能。

   由于GC CD ,深度色彩加密数据我们不适用的,所以关闭掉GC选项。0xAF【7】设置为0,关闭GC CD的数据。当然这个时候也不需要对0x4c的寄存器设定了。

    其他的声音数据,因为设置为DVI输出方式,所以不用关心设定。

    写完这些寄存器以后,图像可以显示出来的。


    对于代码,这类简单的玩意,就不用我给了吧。如果有偿方式,我估计愿意哈哈。下一篇怎么读写DDR3。请各位期待。


  1. 请教一下,我的ZC706,也是用PCA75948作为IIC switch芯片,地址也是E8,ADV7511在第1bit位置。发送S, E8, ACK,02,ACK , 02 ,ACK ,P .   S , 72, NACK   这是什么情况啊? 

    1,翻开板子背面用示波器测芯片,发现PCA 75948 的 1bit位置 72 地址是发过去了,证明IIC switch芯片是正常通路了,可是ADV7511 就是不回ACK。

    2,官方例子—— 写得太复杂没法看。下板子用示波器看,发给ADV7511   72 回了ack。

    3,我把IIC switch芯片通路换到eeprom,读eeprom正常。

    真是黔驴技穷,不知道哪里的问题?

    第一想到的是复位的问题,可是adv7511又没有复位脚在FPGA上。再说上电到发IIC指令中间都是秒级别的延时了。


  2. 另外还有个问题,IIC地址不可能是0xE8的,IIC地址只有7位,除非考虑读写位才有可能,请问您是考虑读写位后说是0xE8的吗?如果不是的话,能否让我了解到具体的情况。

  3. 您好,我现在也在调试Xilinx一块板子(ZC706)上的adv7511,寄存器是按照您博客上的来配置的,从仿真结果来看,我的配置和显示(1080p@60Hz)都是正确的,但是显示器就是没接收到信号,可以请教一下这是为什么吗?留个联系方式?


    关于您博客中的“每次设定PCA7954芯片都是要进行复位,复位时间必须满足500ns,恢复I2C的功能也得100ns”,可否更详细地解释一下,我虽然找到了复位引脚,但是复位引脚跟FPGA的链接却没办法约束,想问一下你是怎么约束的。

  4. 您好,我想问下关于ADV7511寄存器配置的问题。具体您是如何配置的呢?因为我现在在用ADV7511做HDMI输出,但是不知道寄存器配置操作的具体实现,我查了很多资料,都是只给出需要配置的地址和相应的值,但是如何将这些值配置到ADV7511上去呢?我现在使用的开发工具是vivado,或者需要用其他的工具来单独配置寄存器吗?烦请指点一二,多谢!!

  5. 顶顶顶顶顶