[X]关闭
1

06uifdma_vbuf实现HDMI输入采集(AXI4 FDMA数据缓存篇)

摘要: 06uifdma_vbuf实现HDMI输入采集(HDMI)软件版本:vitis2019.2(vivado2019.2)操作系统:WIN10 64bit硬件平台:适用XILINX A7/K7/Z7/ZU/KU系列FPGA(本文使用米联客(milianke)MK7160FA硬件平台)登录“米联客”FPGA社区-w ...

软件版本:vitis2019.2(vivado2019.2)

操作系统:WIN10 64bit

硬件平台:适用XILINX A7/K7/Z7/ZU/KU系列FPGA(本文使用米联客(milianke)MK7160FA开发板)

登录"米联客"FPGA社区-www.uisrc.com视频课程、答疑解惑!

6.1概述

通过前文中实验的学习,相信读者已经掌握了fdma读写bram或者ddr的基本使用,本文使用米联客编写的uivbuf ip 配合uifdma ip 实现摄像头图像的多缓存方法。

本文实验目的:

1:熟悉ADV7611 HDMI输入芯片的硬件参数

2:掌握通过米联客iic控制器实现对ADV7611寄存器的配置。

3:掌握uivbuf程序设计方法

4:掌握图像处理中最常用的三缓存设计,如何实现3帧图形缓存,确保图形不撕裂

6.2ADV7611介绍

6.2.1参数概述

ADV7611采用先进的CMOS工艺制造,提供64引脚、10 mm × 10 mm LQFP_EP表贴封装,符合RoHS标准,是一款高质量、单输入HDMI®接收器, 内置HDMI兼容型接收器,支持HDMI 1.4a规定的所有强制性3D电视格式, 和最高UXGA 60 Hz、8位的分辨率。它集成一个CEC控制器,支持能力发现和控制(CDC)特性。并且提供汽车级、专业级(无HDCP)和工业级三种版本, 工作温度范围为−40 ℃至+85 ℃。

具有一个音频输出端口,用于输出从HDMI流提取的音频数据。 HDMI接收器具有高级静音控制器,可消除音频输出中的外来声频噪声。

可以访问下列音频格式:

1、来自I2S 串行器的音频流(两个音频通道)

2、来自S/PDIF串行器的音频流(两个未压缩通道或N个压缩通道,例如AC3)

3、DST音频流

HDMI端口具有专用的5 V检测和热插拔(Hot Plug™)置位引脚。 该HDMI接收器还集成一个均衡器,用于确保与长电缆的接口具有鲁棒的工作性能。

6.2.2ADV7611寄存器配置

ADI官方网站只给出了C代码的寄存器配置方案,我们使用FPGA配置,需要完成从C到FPGA的移植,这个比较简单,因为我们米联客前面编写的I2C控制器可以非常方便的用于寄存器的读写配置。我们这里给出配置部分的关键代码,I2C控制的代码如何编写,以及相关的介绍可以阅读FPGA部分课程关于"I2C总线控制器及读写EEPROM"这一课程内容。

有关ADV7611的寄存器配置可以阅读配套工程uisrc/06_doc路径下的技术手册。

1:uicfg7611.v

此文件里面有寄存器的配置表,以及调用米联客的i2c控制器把寄存器的配置信息写入到ADV7611,以下配置实现了ADV7611输入的视频信号以RGB888的格式输出。这里我们没有给出ADV7611每个寄存器的功能说明,读者如果觉得有必要可以自己登录ADI的官网搜索相关资料。

这里重点是看下状态机部分代码,因为这里是我们利用米联客的I2C控制器实现寄存器的配置,这个方法在FPGA里面配置HDMI芯片的寄存器,或者摄像头的寄存器,都非常使用,状态代码如下。代码中我们设置三个关键参数,iic_en/wr_cnt/ wr_data就可以完成对I2C总线设备的配置。

//state machine write one byte and then read one byte

always@(posedge clk_i) begin

if(!rst_cnt[8])begin

REG_INDEX<= 9'd0;

iic_en <= 1'b0;

wr_data <= 32'd0;

cfg_done<= 1'b0;

TS_S <= 2'd0;

end

else begin

case(TS_S)

0:if(cfg_done == 1'b0)

TS_S <= 2'd1;

1:if(!iic_busy)begin//write data

iic_en <= 1'b1;

            wr_data[7 :0] <= REG_DATA[23:16];

            wr_data[15 :8] <= REG_DATA[15: 8];

            wr_data[23:16] <= REG_DATA[7 : 0];

end

else

TS_S <= 2'd2;

2:begin

iic_en <= 1'b0;

if(!iic_busy)begin

            REG_INDEX<= REG_INDEX + 1'b1;

            TS_S <= 2'd3;

end

end

3:begin//read rtc register

if(REG_INDEX == REG_SIZE)begin

                cfg_done <= 1'b1;

            end

            TS_S     <= 2'd0;

end

endcase

end

end

以下给出完整代码:

`timescale 1ns / 1ps

//////////////////////////////////////////////////////////////////////////////////

/*

Company : Liyang Milian Electronic Technology Co., Ltd.

Brand: 米联客(milianke)

Technical forum:uisrc.com

taobao: osrc.taobao.com

Create Date: 2019/12/17

Module Name: uicfg7611

Description:

Configure the uicfg7611 register.

Copyright: Copyright (c) msxbo

Revision: 1.0

Signal description

1) _i input

2) _o output

3) _n activ low

4) _dg debug signal

5) _r delay or register

6) _s state mechine

*/

////////////////////////////////////////////////////////////////////////////////

module uicfg7611#(

parameter     CLK_DIV = 16'd499

)

(

input clk_i,

input rst_n,

output adv_scl,

inout adv_sda,

output reg cfg_done

);    

//reset counter for delay time

reg [8 :0] rst_cnt = 9'd0;

always@(posedge clk_i) begin

if(!rst_n)

rst_cnt <= 9'd0;

else if(!rst_cnt[8])

rst_cnt <= rst_cnt + 1'b1;

end

 

reg iic_en;

wire ic_busy;

reg [31:0] wr_data;

reg [1 :0] TS_S = 2'd0;

reg [8 :0] byte_cnt = 9'd0;

wire [23:0] REG_DATA;

wire [8 :0] REG_SIZE;

reg [8 :0] REG_INDEX;

//state machine write one byte and then read one byte

always@(posedge clk_i) begin

if(!rst_cnt[8])begin

REG_INDEX<= 9'd0;

iic_en <= 1'b0;

wr_data <= 32'd0;

cfg_done<= 1'b0;

TS_S <= 2'd0;

end

else begin

case(TS_S)

0:if(cfg_done == 1'b0)

TS_S <= 2'd1;

1:if(!iic_busy)begin//write data

iic_en <= 1'b1;

            wr_data[7 :0] <= REG_DATA[23:16];

            wr_data[15 :8] <= REG_DATA[15: 8];

            wr_data[23:16] <= REG_DATA[7 : 0];

end

else

TS_S <= 2'd2;

2:begin

iic_en <= 1'b0;

if(!iic_busy)begin

            REG_INDEX<= REG_INDEX + 1'b1;

            TS_S <= 2'd3;

end

end

3:begin//read rtc register

if(REG_INDEX == REG_SIZE)begin

                cfg_done <= 1'b1;

            end

            TS_S     <= 2'd0;

end

endcase

end

end

 

uii2c#

(

.WMEN_LEN(4),

.RMEN_LEN(1),

.CLK_DIV(CLK_DIV)//499 for 50M 999 for 100M

)

uii2c_inst

(

.clk_i(clk_i),

.iic_scl(adv_scl),

.iic_sda(adv_sda),

.wr_data(wr_data),

.wr_cnt(8'd3),//write data max len = 4BYTES

.rd_data(), //read not used

.rd_cnt(8'd0),//read not used

.iic_mode(1'b0),

.iic_en(iic_en),

.iic_busy(iic_busy)

);

//7611reg

ui7611reg ui7611reg_inst(.REG_SIZE(REG_SIZE),.REG_INDEX(REG_INDEX),.REG_DATA(REG_DATA));

 

endmodule

2:ui7611reg.v

`timescale 1ns / 1ps

//////////////////////////////////////////////////////////////////////////////////

/*

Company : Liyang Milian Electronic Technology Co., Ltd.

Brand: 米联客(milianke)

Technical forum:uisrc.com

taobao: osrc.taobao.com

Create Date: 2019/12/17

Module Name: ui5640reg

Description:

Configure the ui5640reg register. video format rgb 565

Copyright: Copyright (c) msxbo

Revision: 1.0

Signal description?

1) _i input

2) _o output

3) _n activ low

4) _dg debug signal

5) _r delay or register

6) _s state mechine

*/

////////////////////////////////////////////////////////////////////////////////

module ui7611reg

(

input [8 :0] REG_INDEX,

output reg [31:0] REG_DATA,

output [8 :0] REG_SIZE

);

assign    REG_SIZE = 9'd182;

 

//-----------------------------------------------------------------

/////////////////////    Config Data REG     //////////////////////////    

always@(*)

case(REG_INDEX)

//write Data Index

0 : REG_DATA    =    {8'h98,8'hF4, 8'h80};    //Manufacturer ID Byte - High (Read only)

1 : REG_DATA    =    {8'h98,8'hF5, 8'h7c};    //Manufacturer ID Byte - Low (Read only)

2 : REG_DATA    =     {8'h98,8'hF8, 8'h4c};    // BIT[7]-Reset all the Reg

3 : REG_DATA    =     {8'h98,8'hF9, 8'h64};    //DC offset for analog process

4 : REG_DATA    =     {8'h98,8'hFA, 8'h6c};    //COM10 : href/vsync/pclk/data reverse(Vsync H valid)

5 : REG_DATA    =     {8'h98,8'hFB, 8'h68};    //VGA :    8'h22;    QVGA :    8'h3f;

6 : REG_DATA    =     {8'h98,8'hFD, 8'h44};    //VGA :    8'ha4;    QVGA :    8'h50;

7 : REG_DATA    =    {8'h98,8'h01, 8'h05};    //VGA :    8'h07;    QVGA :    8'h03;

8 : REG_DATA    =     {8'h98,8'h00, 8'h13};    //VGA :    8'hf0;    QVGA :    8'h78;

9 : REG_DATA    =     {8'h98,8'h02, 8'hF7};    //HREF    / 8'h80

10 : REG_DATA =     {8'h98,8'h03, 8'h40};    //VGA :    8'hA0;    QVGA :    8'hF0

11 : REG_DATA =     {8'h98,8'h04, 8'h42};    //VGA :    8'hF0;    QVGA :    8'h78

12 : REG_DATA    =    {8'h98,8'h05, 8'h28};    //

13 : REG_DATA    =     {8'h98,8'h06, 8'ha7};    //

14 : REG_DATA    =     {8'h98,8'h0b, 8'h44};    //BIT[6] :    0 :VGA; 1;QVGA

15 : REG_DATA    =     {8'h98,8'h0C, 8'h42};    //

16 : REG_DATA    =     {8'h98,8'h15, 8'h80};    //

17 : REG_DATA    =     {8'h98,8'h19, 8'h8a};    //

18 : REG_DATA    =     {8'h98,8'h33, 8'h40};    //

19 : REG_DATA    =     {8'h98,8'h14, 8'h4c};    //

20 : REG_DATA    =     {8'h44,8'hba, 8'h01};    //

21 : REG_DATA    =     {8'h44,8'h7c, 8'h01};    //    

22 : REG_DATA    =     {8'h64,8'h40, 8'h81};    //DSP_Ctrl4 :00/01 : YUV or RGB; 10 : RAW8; 11 : RAW10        

23 : REG_DATA    =    {8'h68,8'h9b, 8'h03}; //ADI recommanded setting

24 : REG_DATA    =    {8'h68,8'hc1, 8'h01};    //ADI recommanded setting

25 : REG_DATA    =    {8'h68,8'hc2, 8'h01};    //ADI recommanded setting

26 : REG_DATA    =    {8'h68,8'hc3, 8'h01};    //ADI recommanded setting

27 : REG_DATA    =    {8'h68,8'hc4, 8'h01};    //ADI recommanded setting

28 : REG_DATA    =    {8'h68,8'hc5, 8'h01};    //ADI recommanded setting

29 : REG_DATA    =    {8'h68,8'hc6, 8'h01};    //ADI recommanded setting

30 : REG_DATA    =    {8'h68,8'hc7, 8'h01};    //ADI recommanded setting


路过

雷人

握手

鲜花

鸡蛋
发表评论

最新评论

引用 uisrc 2021-8-12 20:30
本章节源码下载地址链接:https://pan.baidu.com/s/1NT-ArWeJuLTtPX-Fv1oGFA 提取码1111

查看全部评论(1)

本文作者
2021-8-12 09:45
  • 7
    粉丝
  • 3250
    阅读
  • 1
    回复
  • 1
  • 2
  • 3
热门评论
排行榜