基于Xilinx ZYNQ和7 Serises FPGA的MIPI DPHY 接口实现分享

2023-11-03 04:00

本文主要是介绍基于Xilinx ZYNQ和7 Serises FPGA的MIPI DPHY 接口实现分享,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

                                                                                   作者:Hello,Panda

这次分享一个在Xilinx FPGA实现MIPI DPHY接口的案例(包括CIS协议层)。截止目前为止,Xilinx仅在Ultrascale+及其以上版本的FPGA IO可直接支持MIPI 电平输入,其他的,都需要转换成LVDS来接收。在软件支持上,Xilinx在高版本的Vivado(Vitis)上开放了MIPI DPHY IP,但是这个IP可能用起来有诸多的限制,比如说,不可以动态切换Lane速率、比如说必须是Gated的时钟、比如说所有时钟通道和数据Lane的LP信号都必须接进来占用很多IO等等。所以,熊猫君在这里分享手动撸代码的途径,根据自己的需求想做成啥样就啥样,哪管它格式千奇百怪,另外给大家分享的是,撸这个代码不用怕,真的很简单,熟练一些的三天就成,不太熟练的也就一个星期,毕竟咱们不需要把协议栈的每个边边角角都整出来,够咱用就可以了。好了,不说废话了,咱们以MIPI DPHY CSI为例预备开始,搭建一个MIPI RX摄像头数据的案例!

一、硬件上的考虑

之前咱不是介绍过,Xilinx低版本的FPGA上并不能直接支持MIPI DPHY电平标准,因此不能直接就把摄像头接到FPGA的Select IO上,咱得想办法把它变成可以认识的LVDS电平。

1.1.速率的考虑

为什么说要考虑速率呢?这里一个是和FPGA内部的资源相关,另外一个是和信号完整性相关。

FPGA内部的资源是怎么个说法呢?因为是要用到Select IO的Iserdes,因此受IO时钟速率的影响,可以布线到IO的最高时钟在7系列器件里面是BUIO,可以达到800MH(Spartan-6的BUFPLL可能低一些,记得好像是600MHz来着的,有需要的可以自行查证),那么就意味着在7系列FPGA上接MIPI进来最大的Lane速率只能到1600Mbps。

另外,信号完整性是怎么一个说法呢?咱们这个毕竟是高速信号,对眼图采样窗口什么很看重的,这方面Xilinx很有经验,它给画了一条线:800Mbps,lane速率低于800Mbps的,可以通过电阻网络用很低的成本就把事儿给办了;但是速度高了可不行,采样可能就不正确了,那怎么办呢?就得用专门的level shift芯片将MIPI信号转成LVDS了。

1.2.使用电阻网络

这种方法尤其简单,说白了,对接收端来说尤其简单,说白了,就是说你MIPI电平的摆幅很低,那好啊,我把终端电阻加大(150Ω,需要注意的是内部的DIFF_TERM要False掉)一点儿,可以确保差分终端电阻两端的电压够LVDS的裁决门限就行了,这个Xilinx还专门有一个xapp的参考设计,具体编号没有记,有需要可以自行去找DoCNav要。至于低速LP信号,分出来以后要是BANK富裕可以专门搞一个1.2V的bank,如果不富裕,也可以加一个输入阻抗很大的电平转换芯片(比如74LVC1T45)把它转成任意你想要的电平标准,比如1.8V、2.5V或3.3V。那么,整个输入的网络结构就变成了图1这个样子的了。

 

                                                                                   图1 电阻网络结构图

至于哪些信号要接进来,如果引脚足够多,那么所有LP信号和HS信号都可以接进来,如果不富裕且不需要用到嵌入的低速数据的话,因为咱们的Lane已知,除了HS信号外,将lane0的LP信号接进来用于状态判断就行了。

低速的适用于大多数分辨率/帧率在1080P60及以下的,比如几乎所有的内窥镜用Sensor,如最常用OV9734;大部分的Sony和安森美的2M监控芯片。

1.3.使用专门的电平Level shift芯片

因为基本上MIPI还是用于手机和监控类居多,一般的SoC都支持MIPI直接输入。这方面的电平转换不多,基本上停留在连个方案层次上一个是使用专用芯片,比如说国外的MC20901之类的芯片,另外国内的龙迅也有类似的。

另外一种就是采用高速的信号buffer/repeater芯片转成LVDS信号,TI有很多种这样的芯片,比如说性能顶尖的DS25BR100(足以满足2.5Gbps MIPI,带均衡和加重的),当然这个性能好意味着高价格,对于速度没有那么高的应用,选稍次一档的也很香,电路结构和图1类似,就是把150Ω电阻的位置换成这个buffer/repeater芯片,输出就直接是LVDS到FPGA了,标标准准的。

这种方案适合800Mbps~1600Mbps应用场景,除了一些极大靶面或者极高帧率的Sensor外,大多数的一般sensor都包含在内了。

1.4.超过1.6Gbps怎么办

还有一种情况,就是必须要用到lane速率超过1.6Gbps,这种情况怎么办呢?那就得用到高速serdes了GTP、GTH、GTY了,针对这种情况,Xilinx专门出了一个应用指南,这个比较特殊,熊猫君记得编号是XAPP1339,名字叫做“Implementing 2.5G MIPI D-PHY Controllers”,前提是FPGA需要带高速Serdes,成本要高一些,Xilinx官网有参考设计,在安富利可以买到评估板,如下图2所示,本文按下不表。

 

                                                                                               图2 安富利使用高速Serdes的参考板

二、软件设计

这里的软件设计只考虑介绍手撸的,对Xilinx官方IP和参考设计不做表述。这里面主要的关键点是考虑使用什么样的时钟网络拓扑。

2.1两种时钟拓扑的考量

这里面有种时钟架构可供选择,各有优缺点,根据实际情况选择之。

第一种是使用锁相环(PLL):这种方案的有点是时钟稳定、抖动小,外部偶尔有个小毛刺可能影响不大,缺点一个是需要考虑失锁的问题,这个对连续时钟输出的没啥影响,但是对Gated时钟就比价致命,如果低功耗间隔太长,重新转到高速模式时间又太短,很有可能锁相环就失锁了,导致丢掉了HS帧前面的一部分数据找不到同步头接收失败;另一个是只能支持一种固定速率。因此,在选用这种方案的时候要特别注意。

第二种方案是直接使用时钟BUFER这种方案无需知道进来的时钟速率是多少,所以可以很方便的通过配置sensor的寄存器来切换MIPI通道lane速率(这种对大靶面的传感器应用尤为常见,拍照和视频流采用不同的输出速率)。缺点是容易受外界干扰,对信号完整性和干扰屏蔽处理要求较高。

这个两种时钟方案的结构如下图3所示。

 

                                                                                                 图3 两种时钟拓扑结构

对MIPI而言,数据并串转换的最小单位是字节,DDR采样方式,因此byte_clk频率是bit_clk的1/4。

2.2物理层的接收

咱们一般而言不考虑双向通信和ESCAPE信号处理,那么MIPI  D-PHY物理层的主要工作就是采样LP状态信号和将高速串行数据恢复成按字节排序的并行数据,不管多少个Lane,方法都一个样。这个工作被称作解串,只需要用到IDELAY和ISERDES原语就行。MIPI标准默认是时钟相对数据的相位是90°,DDR采样方式,也就是说,时钟的上升沿和下降沿刚好在数据的中间,因此在PCB Layout的时钟,时钟和数据最好是需要等长的,这样保证到达时间是一样的。IDELAY的作用是将PCB布线和内部路径的延时找回来使之满足最佳采样要求,这在直接使用时钟BUFER的时钟拓扑设计中尤为重要,另外,因每次布局布线后都会存在一些路径差异,最好是约束Fixed布线路径。ISERDES的作用是串转并,将数据转为并行的,这里的串并比设为1:8就好,至于这俩源语怎么用,可以参照Xilinx的Select IO手册或者参照我上一篇分享文章《Zynq高速串行CMOS接口设计与实现》。

恢复成字节数据的第二步就是找同步头B8’H,这里千万不要用Iserdes自带的bitslip功能,因为同步字每一个HS帧就一个字节,而且每一个HS帧都要搜索同步字节。一次这里需要手撸一小段代码自己来截取为最好。

2.3CSI层的实现

CSI层主要就是将1lane,或多lane的数据按照协议规定解析出来并将图像数据拼接输出,有的可能会存在多个虚拟通道,需要注意一下。MIPI 一般会分为长短帧,长帧为数据帧,一帧一般就是一行数据;短帧为标志帧,用于指示帧行的开始结束,这个我们可以根据自己的Sensor实现一种就行了,没有必要像标准那样把所有的数据类型都囊括进来。

这里需要注意一下的是,MIPI DPHY和CPHY的长帧的帧头排列方式不一样,CPHY是固定的每个通道都有6个word的的帧头信息。但是DPHY的帧头信息排布和数据一样,都是根据实际的通道数分散到各通道。

CSI层的工作时钟可以使用FPGA内部的一个合适时钟,不和MIPI的像素时钟挂钩,从CSI层出来的数据就是直接的一个一个的像素数据了。

针对特定的Sensor实现CSI层,整个MIPI的接收逻辑框图如下图4所示,整个接收逻辑所占用的Slice资源一般不会大于1K。

 

                                                                                                      图4 MIPI DPHY接收逻辑设计框图

本次的分享到这里就结束了,欢迎加入QQ讨论群或微信公众号讨论交流或获取相关资源。另,博主可提供基于Xilinx、Altera、lattice的相关软硬件方案和产品定制服务,也欢迎大家多多支持!

 

这篇关于基于Xilinx ZYNQ和7 Serises FPGA的MIPI DPHY 接口实现分享的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/335451

相关文章

C++使用栈实现括号匹配的代码详解

《C++使用栈实现括号匹配的代码详解》在编程中,括号匹配是一个常见问题,尤其是在处理数学表达式、编译器解析等任务时,栈是一种非常适合处理此类问题的数据结构,能够精确地管理括号的匹配问题,本文将通过C+... 目录引言问题描述代码讲解代码解析栈的状态表示测试总结引言在编程中,括号匹配是一个常见问题,尤其是在

Java实现检查多个时间段是否有重合

《Java实现检查多个时间段是否有重合》这篇文章主要为大家详细介绍了如何使用Java实现检查多个时间段是否有重合,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录流程概述步骤详解China编程步骤1:定义时间段类步骤2:添加时间段步骤3:检查时间段是否有重合步骤4:输出结果示例代码结语作

使用C++实现链表元素的反转

《使用C++实现链表元素的反转》反转链表是链表操作中一个经典的问题,也是面试中常见的考题,本文将从思路到实现一步步地讲解如何实现链表的反转,帮助初学者理解这一操作,我们将使用C++代码演示具体实现,同... 目录问题定义思路分析代码实现带头节点的链表代码讲解其他实现方式时间和空间复杂度分析总结问题定义给定

Java覆盖第三方jar包中的某一个类的实现方法

《Java覆盖第三方jar包中的某一个类的实现方法》在我们日常的开发中,经常需要使用第三方的jar包,有时候我们会发现第三方的jar包中的某一个类有问题,或者我们需要定制化修改其中的逻辑,那么应该如何... 目录一、需求描述二、示例描述三、操作步骤四、验证结果五、实现原理一、需求描述需求描述如下:需要在

如何使用Java实现请求deepseek

《如何使用Java实现请求deepseek》这篇文章主要为大家详细介绍了如何使用Java实现请求deepseek功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1.deepseek的api创建2.Java实现请求deepseek2.1 pom文件2.2 json转化文件2.2

python使用fastapi实现多语言国际化的操作指南

《python使用fastapi实现多语言国际化的操作指南》本文介绍了使用Python和FastAPI实现多语言国际化的操作指南,包括多语言架构技术栈、翻译管理、前端本地化、语言切换机制以及常见陷阱和... 目录多语言国际化实现指南项目多语言架构技术栈目录结构翻译工作流1. 翻译数据存储2. 翻译生成脚本

如何通过Python实现一个消息队列

《如何通过Python实现一个消息队列》这篇文章主要为大家详细介绍了如何通过Python实现一个简单的消息队列,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录如何通过 python 实现消息队列如何把 http 请求放在队列中执行1. 使用 queue.Queue 和 reque

Python如何实现PDF隐私信息检测

《Python如何实现PDF隐私信息检测》随着越来越多的个人信息以电子形式存储和传输,确保这些信息的安全至关重要,本文将介绍如何使用Python检测PDF文件中的隐私信息,需要的可以参考下... 目录项目背景技术栈代码解析功能说明运行结php果在当今,数据隐私保护变得尤为重要。随着越来越多的个人信息以电子形

使用 sql-research-assistant进行 SQL 数据库研究的实战指南(代码实现演示)

《使用sql-research-assistant进行SQL数据库研究的实战指南(代码实现演示)》本文介绍了sql-research-assistant工具,该工具基于LangChain框架,集... 目录技术背景介绍核心原理解析代码实现演示安装和配置项目集成LangSmith 配置(可选)启动服务应用场景

使用Python快速实现链接转word文档

《使用Python快速实现链接转word文档》这篇文章主要为大家详细介绍了如何使用Python快速实现链接转word文档功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 演示代码展示from newspaper import Articlefrom docx import