FPGA采集CameraLink相机Base模式的实现设计方案

FPGA采集CameraLink相机Base模式 本文详细描述了FPGA采集CameraLink相机Base模式解码输出的实现设计方案,思路是这样的,CameraLink相机输入到FPGA板子,FPGA使用内部逻辑资源实现LVDS视频解码,解析出像素时钟、行同步信号、场同步信号、数据有效信号、以及像素数据,然后将视频转为Xilinx的AXI4-Sream的视频流,经VDMA送入DDR3缓存,然后读取出视频再经过AXI4-Sream to Video Out通过HDMI接口输出视频,这是Xilinx图像处理常用的套路,可谓相当精巧的方案

CameraLink相机的Base模式接入FPGA系统,本质上是一场硬件与逻辑的默契配合。当差分信号穿过FPGA的IOB时,LVDS解码模块的活儿就正式开始了。这里有个容易被忽视的细节——差分对的极性配置。记得在XDC约束里把LVDS的P/N对调换位置可不是闹着玩的,否则数据直接变抽象画。

// LVDS差分缓冲器例化
IBUFDS #(
    .DIFF_TERM("TRUE")  // 启用差分终端
) lvds_buf (
    .I  (clk_p),
    .IB (clk_n),
    .O  (pixel_clk)
);

这个IBUFDS模块负责把差分时钟转换成单端信号,注意DIFF_TERM参数必须根据板卡设计选择是否启用。曾经有个项目因为漏了这个参数,时钟眼图直接崩成心电图。

解析同步信号时,状态机的设计要带点艺术细胞。比如场同步的下降沿触发帧开始,这时候得把行计数器清零。这里分享个实战技巧:用pixel_clk的上升沿锁存同步信号,可以避开亚稳态的坑。

always@(posedge pixel_clk) begin
    vsync_dly <= vsync;
    if(!vsync && vsync_dly) begin  // 捕捉场同步下降沿
        frame_cnt <= frame_cnt + 1;
        line_cnt <= 0;
    end
    else if(hsync) begin
        line_cnt <= line_cnt + 1;
    end
end

转换AXI4-Stream时有个性能玄学——突发传输的长度设定。VDMA的配置界面里那个Max Burst Size参数,建议设成64字节对齐。遇到过不按这个规矩来的案例,DDR3效率直接腰斩,带宽利用率从90%暴跌到40%。

HDMI输出部分有个隐藏关卡:颜色空间转换。当CameraLink传的是RAW12数据时,得在AXI-Stream里塞个TUSER信号标记Bayer模式。下面这段SystemVerilog代码展示了如何在流水线里实时转换:

always_comb begin
    case(bayer_pattern)
        2'b00: rgb = {pixel_data, 4'd0};  // RGGB模式处理
        2'b01: rgb = {pixel_data[11:4], pixel_data[3:0], 4'd0};
        // ...其他Bayer模式处理
    endcase
end

调试时建议在VDMA前后挂上ILA,同时抓取AXI4-Stream的TVALID和TREADY信号。曾经有个诡异的丢帧问题,最后发现是VDMA的帧缓冲数量设成了2,而摄像头输出帧率超过75Hz时,DDR3的bank切换来不及响应。

整个链路跑通后,别忘了做眼图测试。用Vivado的硬件管理器抓取LVDS的时钟抖动参数,确保在CameraLink的85MHz极限频率下,抖动不超过0.3UI。有一次项目验收时发现画面有横纹,最后查出来是LVDS的IDELAY没校准,调整tap值后画面立刻干净得像打过蜡。

这套方案最妙的地方在于它的扩展性——只要把VDMA后的处理模块换成自定义IP,马上就能实现实时图像处理。某次客户临时要求加激光光斑检测,我们只花了三天就塞进去个形态学滤波模块,AXI4-Stream的流式架构功不可没。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值