赞
踩
FPGA图像采集领域目前协议最复杂、技术难度最高的应该就是MIPI协议了,MIPI解码难度之高,令无数英雄竞折腰,以至于Xilinx官方不得不推出专用的IP核供开发者使用,不然太高端的操作直接吓退一大批FPGA开发者,就没人玩儿了。
本设计基于Lattice的LCMXO3LF-6900C-5BG256C开发板,采集IMX219摄像头的1080P 4Line MIPI视频,IMX219摄像头是专门的摄像头转接板,提供该转接板的原理图和PCB源文件,可以用Altium Designer系列软件打开,甚至可以直接打板批量生产,Lattice FPGA自带MIPI解码源语,直接调用即可完成MIPI解码,这也是Lattice FPGA在做MIPI视频编解码方面的独特优势,MIPI视频进入FPGA后,经过D-PHY解串,Byte对齐,Line对齐,MIPI CSI数据包解码,RAW10转Bayer,Bayer转RGB,RGB转YUV,视频输出矫正,最后的视频数据送入Cypress FX3 USB3.0接口输出;用Cypress官方的USB3.0摄像头上位机接收并显示视频;Lattice FPGA开发板提供该转接板的原理图和PCB源文件,可以用Altium Designer系列软件打开,甚至可以直接打板批量生产;
本文详细描述了设计方案,工程代码编译通过后上板调试验证,可直接项目移植,适用于在校学生做毕业设计、研究生项目开发,也适用于在职工程师做项目开发,可应用于医疗、军工等行业的数字成像和图像传输领域;
提供完整的、跑通的工程源码和技术支持;
工程源码和技术支持的获取方式放在了文章末尾,请耐心看到最后;
关于MIPI协议,请自行搜索,csdn就有很多大佬讲得很详细,我就不多写这块了;
一个字:牛逼,表现如下:
1:Lattice FPGA解码MIPI,该FPGA自带MIPI解码源语,直接调用即可完成MIPI解码,这也是Lattice FPGA在做MIPI视频编解码方面的独特优势,且该FPGA较为小众,使用者和开发者都很少,提供工程源码的更少;
2:移植性还可以,可在Lattice 系列FPGA之间移植;
3:实用性达到天花板,可以做批量的USB摄像头,且我这里不仅提供源码还提供原理图和PCB;
4:支持高达4K分辨率的MIPI视频解码;
我这里目前已有丰富的基于FPGA的MIPI编解码方案,主要是MIPI解码的,既有纯vhdl实现的MIPI解码,也有调用Xilinx官方IP实现的MIPI解码,既有2line的MIPI解码,也有4line的MIPI解码,既有4K分辨率的MIPI解码,也有小到720P分辨率的MIPI解码,既有基于Xilinx平台FPGA的MIPI解码也有基于Altera平台FPGA的MIPI解码,还有基于Lattice平台FPGA的MIPI解码,后续还将继续推出更过国产FPGA的MIPI解码方案,毕竟目前国产化方案才是未来主流,后续也将推出更多MIPI编码的DSI方案,努力将FPGA的MIPI编解码方案做成白菜价。。。
基于此,我专门建了一个MIPI编解码的专栏,并将MIPI编解码的博客都放到了专栏里整理,对FPGA编解码MIPI有项目需求或学习兴趣的兄弟可以去我的专栏看看,专栏地址如下:
点击直接前往专栏
工程设计架构如下:
采集IMX219摄像头的1080P 4Line MIPI视频,IMX219摄像头是专门的摄像头转接板,提供该转接板的原理图和PCB源文件,可以用Altium Designer系列软件打开,甚至可以直接打板批量生产;IMX219摄像头转接板插在Lattice FPGA开发板之上;如下:
下面是IMX219的实物图和PCB截图;
下面是用高速示波器抓取的IMX219输出的MIPI 1920x1080 @30FPS Start of a frame波形,可以看到,这里的IMX219硬件设计师没有问题的,可以借鉴;
Lattice FPGA自带MIPI解码源语,直接调用即可完成MIPI解码,这也是Lattice FPGA在做MIPI视频编解码方面的独特优势,这个模块几乎是直接调用MIPI解码源语,输入是差分的MIPI视频数据,输出为并行视频数据,由于是源语,所以不需要太多解释,你只需要知道怎么用就行,不需要知道为什么,此模块的顶层接口如下:
mipi_rx_ddr (alignwd, buf_clk_lp0i, buf_clk_lp0o, buf_clk_lp0t,
buf_clk_lp1i, buf_clk_lp1o, buf_clk_lp1t, clk, clk_lp0, clk_lp1,
clk_s, init, reset, rx_ready, sclk, oclk, buf_data_lp0i, buf_data_lp0o,
buf_data_lp0t, buf_data_lp1i, buf_data_lp1o, buf_data_lp1t, data_lp0,
data_lp1, datain, q)/* synthesis NGD_DRC_MASK=1 */;
input wire alignwd;
input wire buf_clk_lp0o;
input wire buf_clk_lp0t;
input wire buf_clk_lp1o;
input wire buf_clk_lp1t;
input wire clk;
input wire clk_s;
input wire init;
input wire reset;
input wire [3:0] buf_data_lp0o;
input wire [3:0] buf_data_lp0t;
input wire [3:0] buf_data_lp1o;
input wire [3:0] buf_data_lp1t;
input wire [3:0] datain;
output wire buf_clk_lp0i;
output wire buf_clk_lp1i;
output wire rx_ready;
output wire sclk;
output wire oclk;
output wire [3:0] buf_data_lp0i;
output wire [3:0] buf_data_lp1i;
output wire [31:0] q;
inout wire clk_lp0;
inout wire clk_lp1;
inout wire [3:0] data_lp0;
inout wire [3:0] data_lp1;
数据对齐包括Byte对齐和Line对齐;
Byte对齐模块接收到来自D-PHY模块的原始未对齐位输出对齐的字节,MIPI通道上的字节没有任何定义的字节边界,因此此模块在线路上查找始终恒定的第一个字节0xB8,一旦找到0xB8就确定了字节边界偏移,将输出有效设置为determined,并在数据通道处于MIPI LP状态时开始输出正确的字节保持重置;
Line对齐模块从mipi接收多Line的Byte对齐数据,mipi字节时钟在多Line mipi总线中输出Line对齐的数据,不同Line上的数据可能以不同的偏移量出现,因此该模块将等待,直到所有Line的有效输出开始输出Line对齐数据,因此所有Line的字节以相同的时间刻度输出;这样MIPI视频才完成了真正的数据对齐;
该模块的作用很简单,就是解析丢掉MIPI协议中的控制字符,提取出有效的视频数据,部分源码截图如下:
视频数据格式转换的顺序是:RAW10转Bayer,Bayer转RGB888,RGB888转YUV422;如果要做显示器输出的朋友,只需要做到Bayer转RGB888这一步即可输出了,这里做到了RGB888转YUV422的目的是送Cypress FX3 USB3.0接口输出;每一个模块的顶部都有详细的注释,一看就懂他的作用,以RGB888转YUV422模块为例截图如下:
该模块的作用是做视频数据的位宽转换,将64bit 4个像素时钟的yuv422数据转换为32bit 2个像素时钟的yuv422数据,这样做的目的也是送Cypress FX3 USB3.0接口输出;
Lattice Diamond是Lattice FPGA的开发工具,使用起来很简单,但国内用的很少;
开发板FPGA型号:Lattice的LCMXO3LF-6900C-5BG256C;
开发工具:Lattice Diamond3.12;
输入:IMX219,4Line 1080P分辨率;
输出:Cypress FX3 USB3.0接口输出;
工程源码架构如下:
工程已经编译完成,如下:
综合原理图部分截图如下:
硬件需求:
Lattice FPGA开发板一块;
IMX219摄像头转接板一块;
Cypress FX3 USB3.0转接板一块;
连接,IMX219摄像头转接板作为输入插在Lattice FPGA开发板上;Cypress FX3 USB3.0转接板作为输出插在Lattice FPGA开发板上;如下图:
用Cypress官方的USB3.0摄像头上位机接收并显示视频;如下:
福利:工程代码的获取
代码太大,无法邮箱发送,以某度网盘链接方式发送,
资料获取方式:私,或者文章末尾的V名片。
网盘资料如下:
资料清单如下:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。