高云GW5AT-LV60 FPGA开发套件与LVDS视频处理实战
1. 高云GW5AT-LV60开发套件初探
GW5AT-LV60是高云半导体第五代FPGA产品中的明星型号,主打低功耗与高性能视频处理能力。这块开发板拿到手的第一印象是接口丰富——板载的LVDS接口和Camera接口特别显眼,对于想做图像处理开发的工程师来说,这种硬件配置相当友好。
开发套件包含的核心组件包括:
- GW5AT-LV60 FPGA芯片(60K LUTs规模)
- 双通道LVDS显示接口(支持最高1920x1080@60fps)
- MIPI CSI-2摄像头接口(兼容OV5640等常见模组)
- 256Mb SPI Flash配置存储器
- USB-JTAG调试接口
- 扩展IO口(可用于连接按键、传感器等外设)
提示:首次使用时建议先检查板载跳线帽设置,特别是Bank电压选择跳线,LVDS接口通常需要2.5V或3.3V电平,错误设置可能导致通信失败。
2. 开发环境搭建与工程创建
高云FPGA使用Gowin云源软件进行开发,目前最新版本是V1.9.8。安装过程有几个关键点需要注意:
软件安装:
- 需要同时安装Gowin IDE和Programmer工具
- 安装路径不要包含中文或空格
- 安装完成后需手动安装USB驱动(在安装目录的Driver文件夹下)
新建工程步骤:
# 工程设置示例 create_project -name LVDS_Camera_Demo \ -location D:/FPGA_Projects \ -part GW5AT-LV60PG256C8/I7- 约束文件配置: 时钟和关键接口的约束对FPGA设计至关重要。对于LVDS和Camera接口,需要特别注意时序约束:
create_clock -name sys_clk -period 20 [get_ports clk_in] set_input_delay -clock sys_clk -max 3 [get_ports {camera_data[*]}] set_output_delay -clock lvds_clk -max 1 [get_ports {lvds_data[*]}]3. LVDS显示接口实现详解
3.1 LVDS硬件连接方案
开发板上的LVDS接口采用标准的30pin FPC连接器,引脚定义如下:
| 引脚号 | 信号名称 | 说明 |
|---|---|---|
| 1-5 | LVDS_D0P/N | 数据通道0(正/负) |
| 6-10 | LVDS_D1P/N | 数据通道1(正/负) |
| 11-15 | LVDS_D2P/N | 数据通道2(正/负) |
| 16-20 | LVDS_D3P/N | 数据通道3(正/负) |
| 21-25 | LVDS_CLKP/N | 时钟通道(正/负) |
| 26 | LCD_VCC | 3.3V电源 |
| 27 | LCD_BL_EN | 背光使能 |
| 28 | LCD_RST | 复位信号 |
| 29 | GND | 地 |
| 30 | NC | 未连接 |
3.2 LVDS控制器Verilog实现
核心代码结构包含三个主要模块:
- 时钟生成模块(生成LVDS像素时钟)
- 时序控制模块(生成HSYNC/VSYNC/DE信号)
- 数据对齐模块(将RGB数据转换为LVDS差分信号)
module lvds_controller ( input wire clk_50m, input wire rst_n, input wire [23:0] rgb_data, output wire [3:0] lvds_data_p, output wire [3:0] lvds_data_n, output wire lvds_clk_p, output wire lvds_clk_n ); // 时钟生成 OSER10 lvds_clk_gen ( .CLK(clk_50m), .RESET(~rst_n), .FCLK(fclk), .PCLK(pclk) ); // 时序生成 reg [15:0] h_cnt; reg [15:0] v_cnt; always @(posedge pclk or negedge rst_n) begin if(!rst_n) begin h_cnt <= 0; v_cnt <= 0; end else begin if(h_cnt < H_TOTAL-1) h_cnt <= h_cnt + 1; else begin h_cnt <= 0; if(v_cnt < V_TOTAL-1) v_cnt <= v_cnt + 1; else v_cnt <= 0; end end end // LVDS数据转换 genvar i; generate for(i=0; i<4; i=i+1) begin : lvds_data ELVDS_TX lvds_tx ( .DI({rgb_data[i*6+5:i*6], 2'b00}), .P(lvds_data_p[i]), .N(lvds_data_n[i]) ); end endgenerate endmodule注意:高云FPGA的LVDS接口需要使用专用的ELVDS_TX原语,不能直接用普通IO实现差分输出。
4. Camera图像采集系统设计
4.1 摄像头模组选型与配置
开发板兼容标准的MIPI CSI-2接口摄像头,推荐使用OV5640模组,其特点包括:
- 500万像素(2592x1944)
- 支持1080p@30fps输出
- 可编程控制(通过SCCB接口)
- 自动对焦功能
硬件连接示意图:
Camera模组 -> MIPI CSI-2接口 -> FPGA -> SCCB(I2C兼容) -> FPGA GPIO -> 电源(3.3V/1.8V) -> 板载LDO4.2 MIPI CSI-2接收逻辑实现
由于GW5AT-LV60内置MIPI D-PHY硬核,可以简化接收逻辑设计:
- D-PHY配置:
mipi_dphy mipi_rx ( .clk_hs_p(cam_clk_p), .clk_hs_n(cam_clk_n), .data_hs_p(cam_data_p), .data_hs_n(cam_data_n), .lp_dp(cam_lp_dp), .lp_dn(cam_lp_dn), .hs_data_out(hs_data), .hs_valid_out(hs_valid) );- 数据包解析:
always @(posedge mipi_clk) begin if(hs_valid) begin case(state) IDLE: if(hs_data[31:24] == 8'h00) begin // 帧开始 state <= HEADER; line_cnt <= 0; end HEADER: if(hs_data[31:24] == 8'h01) begin // 图像数据 pixel_cnt <= 0; state <= PAYLOAD; end PAYLOAD: if(pixel_cnt < FRAME_WIDTH) begin img_buf[line_cnt][pixel_cnt] <= hs_data[23:0]; pixel_cnt <= pixel_cnt + 1; end else begin line_cnt <= line_cnt + 1; state <= IDLE; end endcase end end5. 系统集成与调试技巧
5.1 时钟域交叉处理
系统涉及多个时钟域:
- 主时钟(50MHz)
- LVDS像素时钟(典型值74.25MHz)
- MIPI高速时钟(取决于摄像头配置)
推荐使用异步FIFO进行跨时钟域数据传输:
async_fifo #( .DATA_WIDTH(24), .DEPTH(512) ) img_fifo ( .wr_clk(mipi_clk), .wr_data(cam_data), .wr_en(cam_valid), .rd_clk(lvds_clk), .rd_data(display_data), .rd_en(display_ready) );5.2 常见问题排查指南
LVDS无显示:
- 检查FPC连接器是否插反
- 测量Bank电压(应为2.5V或3.3V)
- 用示波器检查差分信号幅度(典型值350mV)
摄像头不工作:
- 确认SCCB通信正常(用逻辑分析仪抓取波形)
- 检查MIPI时钟频率设置(应与摄像头配置一致)
- 验证D-PHY是否正确初始化(查看状态寄存器)
图像撕裂或错位:
- 增加FIFO深度
- 调整时序约束中的set_input_delay/set_output_delay值
- 检查PCB走线是否等长(LVDS差分对长度差应<5mm)
6. 性能优化实战经验
6.1 资源利用率优化
通过以下方法可以显著减少LUT使用量:
- 使用DSP块实现图像处理算法(如色彩空间转换)
- 合理使用Block RAM(而非分布式RAM)存储图像行缓冲
- 对时序不敏感的路径设置multicycle约束
6.2 低功耗设计技巧
- 动态时钟门控:在帧间空白期关闭部分模块时钟
assign module_clk = clk & module_enable;电源域划分:将摄像头接口和LVDS接口放在不同的Bank,可单独控制供电
温度监控:利用FPGA内置的温度传感器,当温度超过阈值时降低帧率
我在实际项目中发现,采用这些优化措施后,系统功耗可以从1.2W降至800mW左右,对于电池供电的应用场景特别有用。特别是在处理1080p视频流时,合理的流水线设计能让帧率稳定在60fps的同时,保持芯片温度在合理范围内。
