FPGA纯逻辑资源解码CameraLink视频,附带工程源码并详解
CameraLink的详细不必深究,作为FPGA数据采集者而言,我们只需关心他的传输时序和传输协议。
CameraLink相机输出分三种模式:
Base模式:称之为基本模式或初级模式,通常配置为一个CameraLink芯片和一根电源线;有1个标准CameraLink接口,对应的是1对时钟差分信号和4对数据差分信号;解码后的数据位宽为281=28位;分为ABC三个Port;
Medium模式:中级模式,配置为两个CameraLink芯片和一根电源线;有2个标准CameraLink接口,对应的是2对时钟差分信号和8对数据差分信号;解码后的数据位宽为282=56位;分为ABCDEF六个Port;
Full模式:高级模式,配置为3个CameraLink芯片,两根电源线;有2个标准CameraLink接口,对应的是3对时钟差分信号和12对数据差分信号;解码后的数据位宽为28*3=84位;分为ABCDEFGH八个Port;
CameraLink差分串行输入转单端并行:以Base模式为例
以Base模式下,CameraLink输出1对时钟差分信号和4对数据差分信号,如下图:
解串的过程可以参考Xilinx给的参考设计,使用Xilinx的ISERDESE2和IDELAYE2实现,由于代码过于复杂,在这里实在说不清楚,只给出解串顶层的端口部分,具体代码“关注并私信我”要源码。
解串部分实现了差分穿行到单端并行的转换,输出像素时钟pixel_clk和数据data_out;
同样,解码部分也只给出解串顶层的端口部分,具体代码“关注并私信我”要源码。
这部分实现了解码CameraLink的功能,输出行、场、de、像素数据;
最后给出整个CameraLink解码代码的顶层如下:
后面还细节地给出了解码后的时序图。
`timescale 1ps/1ps
module helai_CameraLink_rx #(// Parametersparameter integer CAMERALINK_MODE = 3, // Set the CameraLink mode. Base-->1 Medium-->2 Full-->3parameter integer CAMERALINK_CHAL = 4 // Set the number of data lines per channel=4
)
(input delay_clk_200m, // Clock for input delay control: 200MHz or 300Hz clk is neededinput reset_n , // Active low resetinput [CAMERALINK_MODE-1:0] i_clk_in_p , // Input from LVDS clock receiver pininput [CAMERALINK_MODE-1:0] i_clk_in_n , // Input from LVDS clock receiver pininput [CAMERALINK_MODE*CAMERALINK_CHAL-1:0] i_data_in_p , // Input from LVDS data pinsinput [CAMERALINK_MODE*CAMERALINK_CHAL-1:0] i_data_in_n , // Input from LVDS data pins
//decode video_clk and video_data outputoutput o_pixel_clk , // Pixel clock output// Chip X signalsoutput o_xLVAL , // Line Valid, active highoutput o_xFVAL , // Frame Valid, active highoutput o_xDVAL , // Data Valid, active high. Maybe always zero.output [7:0] o_PortA , // Camera Link interface Port A , total 8 portsoutput [7:0] o_PortB , // Camera Link interface Port B , total 8 portsoutput [7:0] o_PortC , // Camera Link interface Port C , total 8 ports// Chip Y signalsoutput o_yLVAL , // Line Valid, active highoutput o_yFVAL , // Frame Valid, active highoutput o_yDVAL , // Data Valid, active high. Maybe always zero.output [7:0] o_PortD , // Camera Link interface Port D , total 8 portsoutput [7:0] o_PortE , // Camera Link interface Port E , total 8 portsoutput [7:0] o_PortF , // Camera Link interface Port F , total 8 ports// Chip Z signalsoutput o_zLVAL , // Line Valid, active highoutput o_zFVAL , // Frame Valid, active highoutput o_zDVAL , // Data Valid, active high. Maybe always zero.output [7:0] o_PortG , // Camera Link interface Port G , total 8 portsoutput [7:0] o_PortH // Camera Link interface Port H , total 8 ports
);wire [CAMERALINK_MODE*CAMERALINK_CHAL*7-1:0] data_out; // Serial to parallel data output
//**********差分转单端,然后串并转换,由Xilinx IDELAYE2 和 ISERDESE2 原语实现**********//
lvds_n_x_1to7_sdr_rx #(// Parameters.N (CAMERALINK_MODE), // Set the number of channels.X (CAMERALINK_CHAL) // Set the number of data lines per channel
)
CameraLink_sdr(.delay_refclk_in(delay_clk_200m), // Clock for input delay control: 200MHz or 300Hz clk is needed.reset_n (reset_n ), // Active low reset.clk_in_p (i_clk_in_p ), // Input from LVDS clock receiver pin.clk_in_n (i_clk_in_n ), // Input from LVDS clock receiver pin.data_in_p (i_data_in_p ), // Input from LVDS data pins.data_in_n (i_data_in_n ), // Input from LVDS data pins.data_out (data_out ), // Serial to parallel data output.pixel_clk (o_pixel_clk ) // Pixel clock output
);
//**********差分转单端,然后串并转换,由Xilinx IDELAYE2 和 ISERDESE2 原语实现**********////*****************根据CameraLink的数据格式,解码出行、场、de、数据*****************//
cameralink_bit_allocation_rx #(// Parameters.N (CAMERALINK_MODE), // Set the number of channels.X (CAMERALINK_CHAL) // Set the number of data lines per channel
)
CameraLink_decode(.data_in (data_out), // Parallel data input// Chip X signals.xLVAL (o_xLVAL), // Line Valid, active high.xFVAL (o_xFVAL), // Frame Valid, active high.xDVAL (o_xDVAL), // Data Valid, active high. Maybe always zero..PortA (o_PortA), // Camera Link interface Port A , total 8 ports.PortB (o_PortB), // Camera Link interface Port B , total 8 ports.PortC (o_PortC), // Camera Link interface Port C , total 8 ports// Chip Y signals.yLVAL (o_yLVAL), // Line Valid, active high.yFVAL (o_yFVAL), // Frame Valid, active high.yDVAL (o_yDVAL), // Data Valid, active high. Maybe always zero..PortD (o_PortD), // Camera Link interface Port D , total 8 ports.PortE (o_PortE), // Camera Link interface Port E , total 8 ports.PortF (o_PortF), // Camera Link interface Port F , total 8 ports// Chip Z signals.zLVAL (o_zLVAL), // Line Valid, active high.zFVAL (o_zFVAL), // Frame Valid, active high.zDVAL (o_zDVAL), // Data Valid, active high. Maybe always zero..PortG (o_PortG), // Camera Link interface Port G , total 8 ports.PortH (o_PortH) // Camera Link interface Port H , total 8 ports
);
//*****************根据CameraLink的数据格式,解码出行、场、de、数据*****************//
//解码后的时许如下:
// __ __ __ __ __ __ __ __ __ __ __ __ __ __ __
//o_pixel_clk__/ \__/ \__/ \__/ \__/ \__/ \__/ \__/ \__/ \__/ \__/ \__/ \__/ \__/ \__/ \
// ____________________________________________________________________________________
//o_xFVAL_________/
// _______________________ _______________________
//o_xLVAL_________________/ \_________________/ \__________
// _______________________ _______________________
//o_xDVAL_________________/ \_________________/ \__________
// _________________ _______________________ _________________ _______________________
//o_PortA___invalid_data__\_______valid_data______\___invalid_data__\_______valid_data______\_invalid_data_
// _________________ _______________________ _________________ _______________________
//o_PortB___invalid_data__\_______valid_data______\___invalid_data__\_______valid_data______\_invalid_data_
// _________________ _______________________ _________________ _______________________
//o_PortC___invalid_data__\_______valid_data______\___invalid_data__\_______valid_data______\_invalid_data_
endmodule
下面提供一个CameraLink base模式的工程
开发板:Kintex7开发板;
开发环境:vivado2019.1;
输入:CameraLink摄像头,1280X1024@60Hz分辨率;
输出:HDMI,1920X1080@60Hz分辨率;
BD工程如下图:经典的FDMA三帧缓存架构,不清楚的可以看我前面关于FDMA的文章;
工程代码架构如下:
最后给出工程的顶层代码如下:
module CameraLink_rx_hdmi_out(input i_27m_clk , // Y2 125MHzinput i_clk_in_p ,input i_clk_in_n ,input [3:0] i_data_in_p ,input [3:0] i_data_in_n ,
// HDMI output HDMI_CLK_P ,output HDMI_CLK_N ,output HDMI_D2_P ,output HDMI_D2_N ,output HDMI_D1_P ,output HDMI_D1_N ,output HDMI_D0_P ,output HDMI_D0_N ,
// DDR3 output [12: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 ,output ddr3_ok
);helai_CameraLink_rx #(// Parameters.CAMERALINK_MODE (1), // Set the CameraLink mode. Base-->1 Medium-->2 Full-->3.CAMERALINK_CHAL (4) // Set the number of data lines per channel=4
)
CameraLink_decode(.delay_clk_200m(ui_clk_200m ), // Clock for input delay control: 200MHz or 300Hz clk is needed.reset_n (rst_n ), // Active low reset.i_clk_in_p (i_clk_in_p ), // Input from LVDS clock receiver pin.i_clk_in_n (i_clk_in_n ), // Input from LVDS clock receiver pin.i_data_in_p (i_data_in_p ), // Input from LVDS data pins.i_data_in_n (i_data_in_n ), // Input from LVDS data pins.o_pixel_clk (vid_clk ), // Pixel clock output.o_xFVAL (vid_vs ), // Frame Valid, active high.o_xDVAL (vid_de ), // Data Valid, active high. Maybe always zero..o_PortA (vid_data[23:16]), // Camera Link interface Port A , total 8 ports.o_PortB (vid_data[15: 8]), // Camera Link interface Port B , total 8 ports.o_PortC (vid_data[ 7: 0]) // Camera Link interface Port C , total 8 ports
);wire [31:0] fdma_raddr_0 ;
wire fdma_rareq_0 ;
wire fdma_rbusy_0 ;
wire [127:0]fdma_rdata_0 ;
wire fdma_rready_0;
wire [15:0] fdma_rsize_0 ;
wire fdma_rvalid_0;
wire [31:0] fdma_waddr_0 ;
wire fdma_wareq_0 ;
wire fdma_wbusy_0 ;
wire [127:0] fdma_wdata_0 ;
wire fdma_wready_0;
wire [15:0] fdma_wsize_0 ;
wire fdma_wvalid_0;
wire ui_clk_200m ;
wire rst_n ;design_1 u_design_1(.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_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_in1_0 (i_27m_clk ),.ddr3_ok (ddr3_ok ),.fdma_raddr_0 (fdma_raddr_0 ),.fdma_rareq_0 (fdma_rareq_0 ),.fdma_rbusy_0 (fdma_rbusy_0 ),.fdma_rdata_0 (fdma_rdata_0 ),.fdma_rready_0 (fdma_rready_0 ),.fdma_rsize_0 (fdma_rsize_0 ),.fdma_rvalid_0 (fdma_rvalid_0 ),.fdma_waddr_0 (fdma_waddr_0 ),.fdma_wareq_0 (fdma_wareq_0 ),.fdma_wbusy_0 (fdma_wbusy_0 ),.fdma_wdata_0 (fdma_wdata_0 ),.fdma_wready_0 (fdma_wready_0 ),.fdma_wsize_0 (fdma_wsize_0 ),.fdma_wvalid_0 (fdma_wvalid_0 ),.ui_clk_0 (ui_clk_200m ),.rst_n (rst_n ));wire vid_clk ;
wire vid_vs ;
wire vid_de ;
wire [23:0] vid_data;
wire vga_clk;
wire vga_hs;
wire vga_vs;
wire vga_de;
wire [23:0] vga_data;fdma_contrl #(.VIDEO_H_SRTI_W (1920 ),.VIDEO_H_SIZE_W (1280 ), //输入图像行分辨率.VIDEO_V_SIZE_W (1024 ), //输入图像场分辨率.VIDEO_H_SRTI_R (1920 ), .VIDEO_H_SIZE_R (1920 ), //输入图像行分辨率.VIDEO_V_SIZE_R (1080 ), //输入图像场分辨率 .VIDEO_DAAR_0 (32'h80000000), //第1帧图像缓存基地址.VIDEO_DAAR_1 (32'h81000000), //第2帧图像缓存基地址.VIDEO_DAAR_2 (32'h82000000), //第3帧图像缓存基地址.FDMA_TRANS_DIV (2 ), //一行图像分2次FDMA突发写传输.FDMA_FRAME_NUM (3 ) //缓存3帧
)
helai_fdma_contrl(.ui_clk_200m (ui_clk_200m ), .rst_n (rst_n ), .cmos_pclk (vid_clk ),.senser_vs (~vid_vs ), .senser_de (vid_de ), .senser_rgb (vid_data ), .vga_clk (vga_clk ),.vga_vs (vga_vs ),.vga_de (vga_de ),.o_vga_rgb (vga_data ),.fdma_waddr_0 (fdma_waddr_0 ),.fdma_wareq_0 (fdma_wareq_0 ),.fdma_wbusy_0 (fdma_wbusy_0 ),.fdma_wdata_0 (fdma_wdata_0 ),.fdma_wready_0(fdma_wready_0),.fdma_wsize_0 (fdma_wsize_0 ),.fdma_wvalid_0(fdma_wvalid_0),.fdma_raddr_0 (fdma_raddr_0 ),.fdma_rareq_0 (fdma_rareq_0 ),.fdma_rbusy_0 (fdma_rbusy_0 ),.fdma_rdata_0 (fdma_rdata_0 ),.fdma_rready_0(fdma_rready_0),.fdma_rsize_0 (fdma_rsize_0 ),.fdma_rvalid_0(fdma_rvalid_0) );dvi_transmitter_top helai_hdmi_out(.ref_clk (ui_clk_200m),.i_vga_hs (vga_hs ),.i_vga_vs (vga_vs ),.i_vga_de (vga_de ),.i_vga_rgb (vga_data ), .tmds_clk_p (HDMI_CLK_P ),.tmds_clk_n (HDMI_CLK_N ),.tmds_data0b_p(HDMI_D0_P ),.tmds_data0b_n(HDMI_D0_N ),.tmds_data1g_p(HDMI_D1_P ),.tmds_data1g_n(HDMI_D1_N ),.tmds_data2r_p(HDMI_D2_P ),.tmds_data2r_n(HDMI_D2_N ),.o_vga_rclk (vga_clk ),.o_vga_hs (vga_hs ), .o_vga_vs (vga_vs ),.o_vga_de (vga_de ),.o_x_pos (),.o_y_pos () ); endmodule
福利:代码太大,不方便在这里给出,需要的朋友可以**“关注并私信我”**得到工程源码
FPGA纯逻辑资源解码CameraLink视频,附带工程源码并详解相关推荐
- 【已完结!】Java基础--学习笔记(零起点打开java世界的大门)--博客汇总表【附:视频、工程源码、资料、详细笔记】
java零基础入门到精通(2019版)[黑马程序员] 视频+资料(工程源码.笔记)[链接:https://pan.baidu.com/s/1MdFNUADVSFf-lVw3SJRvtg 提取码:z ...
- FPGA驱动24C04实现读写操作,提供工程源码和技术支持
目录 1.24c04芯片手册解读 2.纯verilog的i2c驱动 3.24c04读写状态机设计 4.上板调试验证 5.福利:工程源码获取 1.24c04芯片手册解读 24c04芯片手册很简单,原理图 ...
- FPGA纯verilog实现视频拼接,纯逻辑资源搭建,提供4套工程源码和技术支持
目录 1.本方案的实用价值 2.总体设计方案 3.视频拼接方案算法 4.工程1:单路视频输出 5.工程2:2路视频拼接输出 6.工程3:3路视频拼接输出 7.工程4:4路视频拼接输出 8.上板调试验证 ...
- FPGA解码4line MIPI视频 IMX291/IMX290摄像头采集 提供工程源码和技术支持
目录 1.前言 2.Xilinx官方主推的MIPI解码方案 3.我已有的MIPI解码方案 4.纯Vhdl代码解码MIPI 5.vivado工程介绍 6.上板调试验证 7.福利:工程代码的获取 1.前言 ...
- FPGA实现CSI-2 解码MIPI视频 2line 720P分辨率 OV5647采集 提供工程源码和技术支持
目录 1.前言 2.Xilinx官方主推的MIPI解码方案 3.纯Vhdl方案解码MIPI 4.vivado工程介绍 5.上板调试验证 6.福利:工程代码的获取 1.前言 FPGA图像采集领域目前协议 ...
- FPGA纯vhdl实现MIPI CSI2 RX 4K视频解码输出,OV13850采集,提供工程源码和技术支持
目录 1.前言 2.Xilinx官方主推的MIPI解码方案 3.纯Vhdl方案解码MIPI 4.vivado工程介绍 5.上板调试验证 6.福利:工程代码的获取 1.前言 FPGA图像采集领域目前协议 ...
- FPGA使用GTX实现SFP光纤收发SDI视频 全网首创略显高端 提供工程源码和技术支持
目录 1.前言 2.设计思路和框架 3.vivado工程详解 4.上板调试验证并演示 5.福利:工程代码的获取 1.前言 FPGA实现SDI视频编解码目前有两种方案: 一是使用专用编解码芯片,比如典型 ...
- FPGA基于GS2971/GS2972实现SDI视频收发 提供工程源码和技术支持
目录 1.前言 2.我目前已有的SDI编解码方案 3.GS2971/GS2972芯片解读 GS2971解读 GS2972解读 4.详细设计方案 5.vivado工程1解读 硬件逻辑工程 软件SDK工程 ...
- FPGA纯Verilog实现任意尺寸图像缩放,串口指令控制切换,贴近真实项目,提供工程源码和技术支持
目录 1.前言 2.目前主流的FPGA图像缩放方案 3.本方案的优越性 4.详细设计方案 5.vivado工程详解 6.上板调试验证并演示 7.福利:工程源码获取 1.前言 代码使用纯verilog实 ...
- FPGA驱动FT601实现USB3.0相机 OV5640视频采集 提供2套工程源码和QT上位机源码
目录 1.前言 2.FT601芯片解读和时序分析 FT601功能和硬件电路 FT601读时序解读 FT601写时序解读 3.我这儿的 FT601 USB3.0通信方案 4.vivado工程1--彩条视 ...
最新文章
- defaultdict python_python中defaultdict的用法详解
- 【BZOJ2326】【HNOI2011】数学作业 [矩阵乘法][DP]
- linux cp -d复制软链接文件
- java操作word文档,深度解析,值得收藏
- 基础总结篇之七:ContentProvider之读写短消息
- Django的数据迁移
- postgresql和mysql语句区别_postgresql和mysql语句区别
- FreeImage的学习总结总结(四)
- 为心爱的人做一个超具创意的表白网页吧❤(告白气球)HTML+CSS+JavaScript
- 德卡t10社保卡类型_德卡T10社保卡读卡器非接触式ic卡医保卡二代证医院挂号卡...
- 使用js的方式设置点击按钮发送短信倒计时并且防止刷新
- 优达(Udacity)-机器学习基础-数据集与问题(安然数据集)
- Springboot毕设项目校园二手交易平台x9zo8java+VUE+Mybatis+Maven+Mysql+sprnig)
- Failed to execute tools\android.bat:分分钟解决!网上千篇一律,解决不了?看看这篇!
- 聚焦前沿丨2021世界VR产业大会倒计时,酷雷曼与众齐聚英雄城
- PyWifi破解Wifi密码试验
- web前端开发h5,2021中高级前端面试题合集
- php 获取用户的IP
- 不受局域网限制的遥控小车(esp8266+l298n+点灯科技平台)
- 计算机未能找到网络,无线适配器未找到,未找到网络适配器