FPGA驱动silicon9011和silicon9134完成HDMI收发,提供工程源码和技术支持

目录

  • 1.HDMI输入输出设计框架
  • 2.silicon9011/9013芯片详解及配置
  • 3.silicon9134芯片详解及配置
  • 4.FPGA工程介绍
  • 5.上板调试验证
  • 6.福利:工程源码获取

1.HDMI输入输出设计框架

在实际项目中,有HDMI输入输出需求时,常用到silicon9011和silicon9134作为珠联璧合搭配使用,因为芯片设计简单,性能稳定,但很多新手不会看芯片技术手册,不会配置,本文介绍FPGA的驱动和采集输出;
本设计采用silicon9011作为HDMI输入解码器,FPGA接收到HDMI视频后存入DDR3做三帧缓存,再输出给silicon9134作为编码器,silicon9134输出连接显示器;
设计框图如下:
FPGA驱动silicon9011和silicon9134完成HDMI收发,提供工程源码和技术支持_第1张图片

2.silicon9011/9013芯片详解及配置

silicon9011和9013大同小异,数据手册可以用同一个,这里介绍silicon9011即可;
silicon9011数据手册一共72页,做不同工作的工程师关注点不同,就FPGA逻辑工程师而言,需要关注的其实很少;
芯片结构如下:
FPGA驱动silicon9011和silicon9134完成HDMI收发,提供工程源码和技术支持_第2张图片
FPGA逻辑工程师只需要知道三点,视频通路、音频通路、i2c配置,至于其他,可以不看,没用;
视频通路:
这里只需要知道视频输入格式和输出格式以及中间的处理过程即可,因为你最终需要的仅是芯片输出给你的视频;
这部分框图如下:
FPGA驱动silicon9011和silicon9134完成HDMI收发,提供工程源码和技术支持_第3张图片
很明显,silicon9011可以输出不同格式的视频,至于你需要什么格式,在寄存器中配置即可,中间也有处理,你需要处理就配置为处理,不需要处理就配置为跳过(bypass);够简单了吧?
音频通路:
无非就是配置为i2s格式的音频流,输出采样率可以配置,当然,也是通过寄存器配置,本工程没有用到音频,所以没有配置;
i2c配置:
这是重点,首先,silicon9011有两个i2c配置接口,一个叫DI2C,一个叫CI2C,DI2C是和HDMI连接器相连,用于外部设备,比如遥控器配置silicon9011,这个我们可以不用管,CI2C是FPGA配置silicon9011的接口,是我们需要的,两个i2c配置接口的从机地址如下:
FPGA驱动silicon9011和silicon9134完成HDMI收发,提供工程源码和技术支持_第4张图片
这里需要注意:silicon9011有两个i2c最高只支持400Khz;
根据数据手册,两个i2c配置接口的从机地址由CI2CA这个引脚的电平决定,我这边的原理图设计如下:
FPGA驱动silicon9011和silicon9134完成HDMI收发,提供工程源码和技术支持_第5张图片
由于我这里CI2CA接地,所以silicon9011的i2c从机地址为0x60;
i2c配置寄存器映射表如下:
FPGA驱动silicon9011和silicon9134完成HDMI收发,提供工程源码和技术支持_第6张图片
寄存器很多,但大多数保持默认即可,默认是RGB888输入,需要改变时参考具体的寄存器不改变即可;
这里需要注意以下几个寄存器:
0x05:这里可设置为自动软件复位;
0x08:这里涉及输出视频细节,以及掉电模式,默认是24bit像素;
0x09:这里要开启TMDS接口,默认是关闭的;

3.silicon9134芯片详解及配置

silicon9134数据手册一共56页,做不同工作的工程师关注点不同,就FPGA逻辑工程师而言,需要关注的其实很少;
芯片结构如下:
FPGA驱动silicon9011和silicon9134完成HDMI收发,提供工程源码和技术支持_第7张图片
FPGA逻辑工程师只需要知道三点,视频通路、音频通路、i2c配置,至于其他,可以不看,没用;
视频通路:
这里只需要知道视频输入格式和输出格式以及中间的处理过程即可,因为你最终需要的仅是芯片输出给你的视频;
这部分框图如下:
FPGA驱动silicon9011和silicon9134完成HDMI收发,提供工程源码和技术支持_第8张图片
很明显,silicon9134可以输出不同格式的视频,至于你需要什么格式,在寄存器中配置即可,中间也有处理,你需要处理就配置为处理,不需要处理就配置为跳过(bypass);够简单了吧?
无非就是配置为i2s格式的音频流,输出采样率可以配置,当然,也是通过寄存器配置,本工程没有用到音频,所以没有配置;
i2c配置:
这是重点,首先,silicon9011有两个i2c配置接口,一个叫DI2C,一个叫CI2C,DI2C是和HDMI连接器相连,用于外部设备,比如遥控器配置silicon9011,这个我们可以不用管,CI2C是FPGA配置silicon9011的接口,是我们需要的,两个i2c配置接口的从机地址如下:
FPGA驱动silicon9011和silicon9134完成HDMI收发,提供工程源码和技术支持_第9张图片
这里需要注意:silicon9134有两个i2c最高只支持400Khz;
根据数据手册,两个i2c配置接口的从机地址由CI2CA这个引脚的电平决定,我这边的原理图设计如下:
FPGA驱动silicon9011和silicon9134完成HDMI收发,提供工程源码和技术支持_第10张图片
由于我这里CI2CA接地,所以silicon9011的i2c从机地址为0x72;
i2c配置寄存器映射表如下:
FPGA驱动silicon9011和silicon9134完成HDMI收发,提供工程源码和技术支持_第11张图片
寄存器很多,但大多数保持默认即可,默认是RGB888输出,需要改变时参考具体的寄存器不改变即可;
这里需要注意以下几个寄存器:
0x08:输入视频行场极性和掉电选择;

4.FPGA工程介绍

工程结构如下:
FPGA驱动silicon9011和silicon9134完成HDMI收发,提供工程源码和技术支持_第12张图片
笔记本电脑模拟输入HDMI;
FPGA硬件采用i2c模块配置silicon9011,silicon9011将HDMI解码为RGB视频流;
FDMA负责将RGB视频流送入DDR3做三帧缓存,关于FDMA请参考我之前的文章点击查看:FDMA视频三帧缓存方案
FPGA硬件采用i2c模块配置silicon9134,silicon9134将RGB视频流编码为HDMI输出;
显示器显示图像验证输出;
工程DB部分如下:
FPGA驱动silicon9011和silicon9134完成HDMI收发,提供工程源码和技术支持_第13张图片
工程代码结构如下:
FPGA驱动silicon9011和silicon9134完成HDMI收发,提供工程源码和技术支持_第14张图片
顶层代码如下:

module top(  
//ddr3  
  output [14:0]DDR3_0_addr,
  output [2:0]DDR3_0_ba   ,
  output DDR3_0_cas_n     ,
  output [0:0]DDR3_0_ck_n ,
  output [0:0]DDR3_0_ck_p ,
  output [0:0]DDR3_0_cke  ,
  output [0:0]DDR3_0_cs_n ,
  output [3:0]DDR3_0_dm   ,
  inout [31:0]DDR3_0_dq   ,
  inout [3:0]DDR3_0_dqs_n ,
  inout [3:0]DDR3_0_dqs_p ,
  output [0:0]DDR3_0_odt  ,
  output DDR3_0_ras_n     ,
  output DDR3_0_reset_n   ,
  output DDR3_0_we_n      , 
  
  input        CLK_IN1_D_0_clk_n,
  input        CLK_IN1_D_0_clk_p,
  output       ddr3_ok          ,  
//hdmi_in
  output       hdmi_in_nreset   ,     //9011/9013 reset
  input        vin_clk          ,            //clock for 9111/9013
  input        vin_hs           ,             //horizontal synchronization for 9011/9013
  input        vin_vs           ,             //vertical synchronization for 9011/9013
  input        vin_de           ,             //data valid for 9011/9013
  input[23:0]  vin_data         ,           //data for 9011/9013   
  inout        hdmi_scl         ,           //HDMI I2C clock
  inout        hdmi_sda         ,           //HDMI I2C data
  output       hdmi_nreset      ,        //9134 reset
//hdmi_out  
  output       vout_hs          ,            //horizontal synchronization for 9134
  output       vout_vs          ,            //vertical synchronization for 9134
  output       vout_de          ,            //data valid for 9134
  output       vout_clk         ,           //clock for 9134
  output[23:0] vout_data                   //data for 9134
);

wire	    clk_200m  ;
wire        clk_hdmi  ;
wire        pll_resetn;
wire [0:0]  resetn;
wire        ud_r_0_ud_rclk;
wire [31:0] ud_r_0_ud_rdata;
wire        ud_r_0_ud_rde;
wire        ud_r_0_ud_rvs;
wire        ud_w_0_ud_wclk;
wire [31:0] ud_w_0_ud_wdata;
wire        ud_w_0_ud_wde;
wire        ud_w_0_ud_wvs;
wire        ui_clk_100m;

wire [9:0]   lut_index;
wire [31:0]  lut_data; 

wire [23:0] i_rgb;  
wire 	    o_hs ;  
wire 	    o_vs ;  
wire 	    o_de ;  
wire [23:0] o_rgb;  
wire hdmi_clk_rstn;
assign hdmi_nreset   =pll_resetn;  
assign hdmi_in_nreset=pll_resetn;
assign ud_w_0_ud_wclk =vin_clk ;
assign ud_w_0_ud_wvs  =vin_vs  ;
assign ud_w_0_ud_wde  =vin_de  ;
assign ud_w_0_ud_wdata=vin_data;
assign ud_r_0_ud_rclk=clk_hdmi;
assign ud_r_0_ud_rvs=o_vs;
assign ud_r_0_ud_rde=o_de;
assign i_rgb=ud_r_0_ud_rdata[23:0];
assign vout_clk=clk_hdmi;
assign vout_hs=o_hs;
assign vout_vs=o_vs;
assign vout_de=o_de;
assign vout_data=o_rgb;

i2c_config i2c_config_m0(
.rst            (~pll_resetn    ),
.clk            (clk_200m       ),
.clk_div_cnt    (16'd500        ),
.i2c_addr_2byte (1'b0           ),
.lut_index      (lut_index      ),
.lut_dev_addr   (lut_data[31:24]),
.lut_reg_addr   (lut_data[23:8] ),
.lut_reg_data   (lut_data[7:0]  ),
.error          (               ),
.done           (               ),
.i2c_scl        (hdmi_scl       ),
.i2c_sda        (hdmi_sda       )
);

lut_hdmi lut_hdmi_m0
(
.lut_index (lut_index),
.lut_data  (lut_data )
);

design_1_wrapper u_design_1_wrapper
   (
    .CLK_IN1_D_0_clk_n(CLK_IN1_D_0_clk_n),
    .CLK_IN1_D_0_clk_p(CLK_IN1_D_0_clk_p),
    .DDR3_0_addr      (DDR3_0_addr      ),
    .DDR3_0_ba        (DDR3_0_ba        ),
    .DDR3_0_cas_n     (DDR3_0_cas_n     ),
    .DDR3_0_ck_n      (DDR3_0_ck_n      ),
    .DDR3_0_ck_p      (DDR3_0_ck_p      ),
    .DDR3_0_cke       (DDR3_0_cke       ),
    .DDR3_0_cs_n      (DDR3_0_cs_n      ),
    .DDR3_0_dm        (DDR3_0_dm        ),
    .DDR3_0_dq        (DDR3_0_dq        ),
    .DDR3_0_dqs_n     (DDR3_0_dqs_n     ),
    .DDR3_0_dqs_p     (DDR3_0_dqs_p     ),
    .DDR3_0_odt       (DDR3_0_odt       ),
    .DDR3_0_ras_n     (DDR3_0_ras_n     ),
    .DDR3_0_reset_n   (DDR3_0_reset_n   ),
    .DDR3_0_we_n      (DDR3_0_we_n      ),
    .clk_200m         (clk_200m         ),
	.clk_hdmi         (clk_hdmi         ),
    .ddr3_ok          (ddr3_ok          ),
    .pll_resetn       (pll_resetn       ),
    .resetn           (resetn           ),
    .ud_r_0_ud_rclk   (ud_r_0_ud_rclk   ),
    .ud_r_0_ud_rdata  (ud_r_0_ud_rdata  ),
    .ud_r_0_ud_rde    (ud_r_0_ud_rde    ),
    .ud_r_0_ud_rempty (ud_r_0_ud_rempty ),
    .ud_r_0_ud_rvs    (ud_r_0_ud_rvs    ),
    .ud_w_0_ud_wclk   (ud_w_0_ud_wclk   ),
    .ud_w_0_ud_wdata  (ud_w_0_ud_wdata  ),
    .ud_w_0_ud_wde    (ud_w_0_ud_wde    ),
    .ud_w_0_ud_wfull  (ud_w_0_ud_wfull  ),
    .ud_w_0_ud_wvs    (ud_w_0_ud_wvs    ),
    .ui_clk_100m      (ui_clk_100m      )
	);	

video_timing_control vga(
	.i_clk  (clk_hdmi   ),	
	.i_rst_n(pll_resetn ), 
	.i_rgb  (i_rgb      ),
	.o_hs   (o_hs       ),
	.o_vs   (o_vs       ),
	.o_de   (o_de       ),
	.o_rgb  (o_rgb      ),
	.o_x_pos(),
	.o_y_pos()
);	
endmodule

5.上板调试验证

开发板:Xilinx Artix7-35T开发板;
开发环境:vivado2019.1;
输入:HDMI,1080P,silicon9011解码;
输出:HDMI,1080P,silicon9134编码;
板子连接:

输出结果:
笔记本电脑原画:

FPGA采集后出书显示器画面如下:

6.福利:工程源码获取

福利:工程代码的获取
代码太大,无法邮箱发送,以某度网盘链接方式发送,
资料如下:获取方式:私。
FPGA驱动silicon9011和silicon9134完成HDMI收发,提供工程源码和技术支持_第15张图片

你可能感兴趣的:(菜鸟FPGA图像处理专题,fpga开发)