关于基于Lattice Crosslink-NX系列FPGA用于图像采集、桥接和处理的应用总结分享

作者:Hello,Panda

Lattice Crosslink-NX系列FPGA的定位仍然还是主要面向接口桥接类的应用,虽然它的逻辑已经到了39K的规模,但其处理能力仍然偏弱,特别是存在以下几个很大的短板:

(1)对存储器的支持偏弱:可以支持DDR,但是速率太低,带宽无法满足大带宽应用的要求。但是做一些医疗的软镜应用比如说OV6946/OV6948之类的案子还是十分合适,无论是从功耗、封装和成本上考虑都比较合适。

(2)缺少一个硬核:Crosslink-NX FPGA提供RISC-V处理器硬核,这个硬核在逻辑占用比较大的情况下,能跑个50MHz的主频,而且RISC-V指令集的执行效率又很低,这就实际上是个鸡肋,如果能有一个硬核,哪怕是Cortex-M3/M4这个级别的,主频能跑到150MHz以上就十分Nice了,在控制领域将大有所为,在图像领域也可以作为一个单独的处理SoC来用了。

(3)主频支持偏低:Crosslink-NX的最佳逻辑运行频率是200MHz以下(以18位乘法器)和LUT加法器为例,对一些大靶面的相机接入往往为了降主频而增加位宽,降低了时序收敛性。但是作为低功耗应用,主频支持偏低也是为了降功耗。

(4)频繁涨价:虽然现在涨价是常态,但是一年内发三次还是四次涨价函,这个操作多多少少有些不好看。

熊猫君主要用Lattice Crosslink-NX FPGA做了以下几个应用:

一、低分辨图像处理单元,主要是用到:第一类是医用内窥镜方面,比如OV6946/OV6948/OH0TA10此类小靶面传感器。第二类是特定的需要FPGA进行快速低延时处理的特殊应用Camera。以下视频是OV6946的FPGA处理实际效果图。

基于ZYNQ SoC和单FPGA平台的OV6946医用内窥镜应用

视频1: FPGA接入OV6946成像效果视频

二、接口桥接

(1)MIPI的MUX和Demux:利用MIPI的最多支持四个虚拟通道(VC)的特性,做MIPI输入的4个低带宽MIPI物理通道(CSI)合成1个高速的4-VC通道物理链路或做反向处理进行分发显示到屏(DSI)。

MIPI 4-MUX-1视频合成传输应用案例分享

视频2: LIFCL-40-7MG121I进行4输入Sensor MUX处理

(2)SLVS转MIPI:这种用法主要是Sony的Sensor,MIPI的电平其实就是SLVS-400,但是Sony那种支持SLVS和SLVS-EC的Sensor虽然是用了SLVS电平,但是协议仍然走的是LVDS那种,因此需要转接为标准的MIPI D-PHY CSI协议和后端的处理SoC进行对接。

SLVS转MIPI+IMX429项目实例

视频3: LIFCL-40将IMX429 SLVS输出转为标准MIPI应用

(3)LVDS/subLVDS:LVDS和subLVDS在工业和监控领域用得十分普遍,但是它的速率很低,往往需要占用很多的IO差分对,因此通常也需要用FPGA去接收和处理。随着SoC技术普及,大家为了减少开发时间和难度,往往选用海思、瑞芯微、全志、高通、英伟达的相关SoC来做图像ISP和AI视觉应用,所以前端要一个FPGA将其转为标准的MIPI便于接入采集。

Sony LVDS输出Sensor转标准MIPI D-PHY

视频4:LIFCL-40将IMX117输出的10-ch LVDS信号转为标准MIPI

熊猫君用Crosslink-NX系列器件两年多,总共就做了以上的几类应用,当然还有点个屏啥的也非常的好用,属于一些附加工作,毕竟熊猫君主要还是面向于做视频的采集和处理的。

更好的应用,希望各位大牛读者们能多多开发分享。

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
Lattice Diamond中,首先需要创建一个新的工程,选择对应的FPGA器件型号,然后添加适当的约束文件和设计文件。以下是一个基于iCE40UP5K器件的频率和相位差测量的简单示例设计。 约束文件 仅需要约束输入时钟信号和输出数据信号的引脚。 ``` # Clock constraints set_location_assignment PIN_35 -to clk_i set_io clk_i !PIN_35 # Output data constraints set_location_assignment PIN_45 -to data_out set_io data_out !PIN_45 ``` 设计文件 设计包括一个简单的计数器和两个相位差测量器件来测量两个不同频率的输入信号之间的相位差。该设计在每个时钟周期内将输入信号的触发点作为相位参考,并将其与前一个周期的触发点进行比较,从而计算相位差值。 ``` module freq_phase_meter( input wire clk_i, input wire [1:0] data_i, output reg [15:0] data_out ); reg [15:0] count_reg1; reg [15:0] count_reg2; wire trigger1; wire trigger2; wire[31:0] phase_delta1; wire[31:0] phase_delta2; // Divide input clock by 2 and 3 assign trigger1 = (count_reg1 == 32767); assign trigger2 = (count_reg2 == 21845); always @(posedge clk_i) begin if (trigger1) count_reg1 <= 0; else count_reg1 <= count_reg1 + 1; if (trigger2) count_reg2 <= 0; else count_reg2 <= count_reg2 + 1; end // Phase measurement freq_phase_detector #( .WIDTH(32), .PERIOD1(32767), .PERIOD2(21845) ) phase_detector1 ( .clk_i(clk_i), .trigger_i(trigger1), .phase_delta_o(phase_delta1) ); freq_phase_detector #( .WIDTH(32), .PERIOD1(32767), .PERIOD2(14563) ) phase_detector2 ( .clk_i(clk_i), .trigger_i(trigger2), .phase_delta_o(phase_delta2) ); // Output phase difference between input signals always @(posedge clk_i) begin data_out <= phase_delta1[15:0] - phase_delta2[15:0]; end endmodule module freq_phase_detector( input wire clk_i, input wire trigger_i, output wire [$clog2(WIDTH)-1:0] phase_delta_o // $clog2(WIDTH) is the number of bits needed to represent WIDTH ); reg [31:0] phase_reg; always @(posedge clk_i) begin if (trigger_i) phase_reg <= 0; else phase_reg <= phase_reg + 1; end // Output phase difference between last two trigger points assign phase_delta_o = (phase_reg - WIDTH); endmodule ``` 以上代码可以将两个不同频率的输入信号连接到data_i[1:0] 引脚上,输出测量的相位差值将在每个时钟周期下更新到data_out[15:0] 引脚上。 注意:在实际应用中,需要针对特定的输入信号频率和初始相位设置PERIOD1、PERIOD2参数,以便进行准确的相位差测量。 最后,使用Lattice Diamond中的“Build”选项将设计合成并生成位文件,然后将位文件烧录到FPGA器件上即可进行测试。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

_Hello_Panda_

你的鼓励将是我创作的最大动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值