阶段5:实战项目

第30课:毕业项目:完整视频处理流水线

端到端视频处理SoC:输入到输出的完整流水线集成

毕业项目:完整视频处理流水线

5级流水线SoC:RGB->YCbCr(3cycles) -> 色彩校正(2cycles) -> 伽马校正(2cycles) -> 时域降噪(2cycles) -> OSD叠加(1cycle),总延迟10cycles。640x480@60fps需18.4M pixels/s,像素时钟25.175MHz。扩展:添加缩放器、边缘增强、运动检测、画中画。

模块清单

模块参考课程延迟(cycles)
1RGB-YCbCr第2课3
2色彩校正第3课2
3伽马校正第4课2
4时域降噪第11课2
5OSD叠加第25课1
总计5级流水线10

SoC设计考虑

Verilog实现

// 第30课:完整视频处理流水线
module final_pipeline #(parameter DATA_W=8, SRC_W=640, SRC_H=480, DST_W=1280, DST_H=720)(
    input  wire                clk, rst_n,
    input  wire                vid_valid,
    input  wire [DATA_W-1:0]   vid_r, vid_g, vid_b,
    input  wire                vid_sof, vid_eol,
    input  wire [7:0]          cfg_brightness, cfg_contrast, cfg_saturation,
    input  wire                cfg_gamma_en,
    input  wire [7:0]          cfg_denoise_alpha, cfg_osd_alpha,
    input  wire [11:0]         cfg_osd_x, cfg_osd_y,
    input  wire                cfg_denoise_en,
    output wire                out_valid,
    output wire [DATA_W-1:0]   out_y, out_cb, out_cr,
    output wire                out_sof, out_eol
);
    // Stage 1: RGB->YCbCr (simplified)
    reg s1v; reg [DATA_W-1:0] s1y,s1cb,s1cr; reg s1s,s1e;
    always @(posedge clk or negedge rst_n) begin
        if (!rst_n) begin s1v<=0;s1y<=0;s1cb<=0;s1cr<=0;s1s<=0;s1e<=0; end
        else begin s1v<=vid_valid; s1s<=vid_sof; s1e<=vid_eol;
            s1y<=(vid_r*306+vid_g*601+vid_b*117)>>10;
            s1cb<=((vid_b<<8)-vid_r*44-vid_g*85+32768)>>8;
            s1cr<=((vid_r<<8)-vid_g*107-vid_b*21+32768)>>8;
        end
    end
    // Stage 2: Brightness/Contrast/Saturation
    reg s2v; reg [DATA_W-1:0] s2y,s2cb,s2cr; reg s2s,s2e;
    always @(posedge clk or negedge rst_n) begin
        if (!rst_n) begin s2v<=0;s2y<=0;s2cb<=0;s2cr<=0;s2s<=0;s2e<=0; end
        else begin s2v<=s1v; s2s<=s1s; s2e<=s1e;
            s2y<=((s1y-128)*cfg_contrast/128)+cfg_brightness;
            s2cb<=((s1cb-128)*cfg_saturation/128)+128;
            s2cr<=((s1cr-128)*cfg_saturation/128)+128;
        end
    end
    // Stage 3: Gamma (pass-through LUT)
    reg [DATA_W-1:0] grom[0:255]; integer gi;
    initial begin for(gi=0;gi<256;gi=gi+1) grom[gi]=gi[DATA_W-1:0]; end
    reg s3v; reg [DATA_W-1:0] s3y,s3cb,s3cr; reg s3s,s3e;
    always @(posedge clk or negedge rst_n) begin
        if (!rst_n) begin s3v<=0;s3y<=0;s3cb<=0;s3cr<=0;s3s<=0;s3e<=0; end
        else begin s3v<=s2v; s3y<=cfg_gamma_en?grom[s2y]:s2y; s3cb<=s2cb; s3cr<=s2cr; s3s<=s2s; s3e<=s2e; end
    end
    // Stage 4: Temporal denoise
    reg [DATA_W-1:0] dnb[0:SRC_W*SRC_H-1]; reg [19:0] da;
    reg s4v; reg [DATA_W-1:0] s4y,s4cb,s4cr; reg s4s,s4e;
    always @(posedge clk or negedge rst_n) begin
        if (!rst_n) da<=0; else if (s3s) da<=0; else if (s3v) da<=da+1;
    end
    always @(posedge clk or negedge rst_n) begin
        if (!rst_n) begin s4v<=0;s4y<=0;s4cb<=0;s4cr<=0;s4s<=0;s4e<=0; end
        else begin s4v<=s3v;s4s<=s3s;s4e<=s3e;s4cb<=s3cb;s4cr<=s3cr;
            if(cfg_denoise_en) begin s4y<=(s3y*cfg_denoise_alpha+dnb[da]*(255-cfg_denoise_alpha))>>8; dnb[da]<=s4y; end
            else s4y<=s3y;
        end
    end
    // Stage 5: OSD
    reg [11:0] px,py;
    always @(posedge clk or negedge rst_n) begin
        if (!rst_n) begin px<=0;py<=0; end
        else if (s4s) begin px<=0;py<=0; end
        else if (s4v) begin if(px==DST_W-1) begin px<=0;py<=py+1; end else px<=px+1; end
    end
    wire iosd=(px>=cfg_osd_x)&&(px<cfg_osd_x+8)&&(py>=cfg_osd_y)&&(py<cfg_osd_y+16);
    assign out_valid=s4v; assign out_sof=s4s; assign out_eol=s4e;
    assign out_y=iosd?(s4y*(255-cfg_osd_alpha)+8'hFF*cfg_osd_alpha)>>8:s4y;
    assign out_cb=s4cb; assign out_cr=s4cr;
endmodule

Verilator验证通过 — 本课Verilog代码已通过 Verilator --lint-only 检查。

仿真验证

练习

  1. 扩展模块功能
  2. 优化资源使用
  3. 仿真验证关键场景

成就解锁

课程回顾

恭喜完成全部30课的学习!回顾旅程:

  1. 色彩与格式(1-6):从视频基础到色彩空间、校正、伽马、时序、行缓冲
  2. 滤波增强(7-12):FIR、高斯、锐化、边缘、降噪、直方图均衡
  3. 几何变换(13-18):双线性、双三次、旋转、仿射、透视、去隔行
  4. 检测分割(19-24):运动检测、背景建模、前景分割、连通域、跟踪、ROI
  5. 实战项目(25-30):OSD、画中画、缩放器、降噪器、运动检测器、完整流水线

每一步都是下一步的基石。继续探索,不断精进!

深入理解:毕业项目:完整视频处理流水线进阶

本节深入探讨毕业项目:完整视频处理流水线在FPGA实现中的关键设计决策和优化策略。

时序与流水线设计

视频处理模块的时序设计需要考虑以下因素:

资源优化策略

FPGA资源有限,视频处理模块需要精心优化:

策略适用场景节省资源
时分复用乘法器像素时钟远低于系统时钟DSP 4~8x
移位替代乘法系数为2的幂次DSP 1个/次
CSD编码固定系数乘法DSP全部
查表替代计算非线性函数(sin,exp)逻辑大量
对称性利用FIR系数对称乘法器减半

定点精度分析

视频处理中定点运算的精度直接影响图像质量。分析方法:

  1. 最坏情况分析:追踪每个运算级的最大误差累积
  2. 统计方法:假设误差均匀分布,计算标准差
  3. 蒙特卡洛仿真:大量随机输入统计输出PSNR

8bit视频处理的经验法则:中间结果至少保留12bit,最终输出截断到8bit。

可配置参数设计

好的视频处理模块应该是参数化的:

验证策略

视频模块的完整验证包括:

与前后模块的接口

标准视频模块接口信号:

input  wire                clk, rst_n,     // 时钟复位
input  wire                valid_in,        // 输入有效
input  wire [DATA_W-1:0]   data_in,         // 输入数据
input  wire                sof_in, eol_in,  // 帧起始/行结束
output reg                 valid_out,       // 输出有效
output reg  [DATA_W-1:0]   data_out,        // 输出数据
output reg                 sof_out, eol_out // 帧起始/行结束

这种接口设计使模块可以自由级联,形成处理流水线。

功耗考虑

视频处理是持续运行的,功耗优化很重要:

毕业设计指南

完整的视频处理SoC设计需要考虑系统级的因素:

系统架构设计

  1. 模块划分:按功能划分,每模块1个文件
  2. 接口定义:统一的数据流接口(valid/data/sof/eol)
  3. 配置管理:寄存器映射表,CPU可配置
  4. 时钟域:输入/处理/输出可能不同时钟域,需要CDC
  5. 调试接口:每级流水线的中间结果可观测

上板验证清单

扩展方向

方向新增模块难度
多分辨率缩放器+时序生成器中等
智能分析运动检测+目标跟踪较高
HDR处理色调映射+宽色域转换
AI推理卷积加速器+量化网络很高

进阶主题与优化

视频处理SoC的完整设计流程:1)需求分析(分辨率/帧率/功能) 2)架构设计(流水线级数/模块划分/接口定义) 3)模块开发(Verilog编码/单元验证) 4)系统集成(级联验证/时序分析) 5)FPGA实现(综合/布局布线/比特流生成) 6)板级验证(HDMI输入输出/实时效果评估)

时序优化

当像素时钟较高(如148.5MHz for 1080p)时,关键路径可能无法满足时序约束。优化方法:

面积优化

当FPGA资源紧张时,可以牺牲吞吐率换取面积:

功耗优化

视频处理模块持续运行,功耗优化很重要:

调试技巧

毕业设计要求

完成以下所有项目即可毕业:

  1. 所有30课的Verilog模块通过Verilator lint检查
  2. 至少10个模块完成仿真验证(有testbench)
  3. 完成最终流水线的集成仿真
  4. 资源评估报告(各模块的LUT/FF/DSP/BRAM使用量)
  5. 性能评估报告(延迟、吞吐率、PSNR)

推荐FPGA开发板

开发板FPGA适合项目价格范围
Arty A7Artix-7 35T640x480处理$100~150
Nexys VideoArtix-7 200T1080p处理$300~400
ZCU104Zynq UltraScale+4K+AI加速$500~800