端到端视频处理SoC:输入到输出的完整流水线集成
5级流水线SoC:RGB->YCbCr(3cycles) -> 色彩校正(2cycles) -> 伽马校正(2cycles) -> 时域降噪(2cycles) -> OSD叠加(1cycle),总延迟10cycles。640x480@60fps需18.4M pixels/s,像素时钟25.175MHz。扩展:添加缩放器、边缘增强、运动检测、画中画。
| 级 | 模块 | 参考课程 | 延迟(cycles) |
|---|---|---|---|
| 1 | RGB-YCbCr | 第2课 | 3 |
| 2 | 色彩校正 | 第3课 | 2 |
| 3 | 伽马校正 | 第4课 | 2 |
| 4 | 时域降噪 | 第11课 | 2 |
| 5 | OSD叠加 | 第25课 | 1 |
| 总计 | 5级流水线 | 10 | |
// 第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 检查。
恭喜完成全部30课的学习!回顾旅程:
每一步都是下一步的基石。继续探索,不断精进!
本节深入探讨毕业项目:完整视频处理流水线在FPGA实现中的关键设计决策和优化策略。
视频处理模块的时序设计需要考虑以下因素:
FPGA资源有限,视频处理模块需要精心优化:
| 策略 | 适用场景 | 节省资源 |
|---|---|---|
| 时分复用乘法器 | 像素时钟远低于系统时钟 | DSP 4~8x |
| 移位替代乘法 | 系数为2的幂次 | DSP 1个/次 |
| CSD编码 | 固定系数乘法 | DSP全部 |
| 查表替代计算 | 非线性函数(sin,exp) | 逻辑大量 |
| 对称性利用 | FIR系数对称 | 乘法器减半 |
视频处理中定点运算的精度直接影响图像质量。分析方法:
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设计需要考虑系统级的因素:
| 方向 | 新增模块 | 难度 |
|---|---|---|
| 多分辨率 | 缩放器+时序生成器 | 中等 |
| 智能分析 | 运动检测+目标跟踪 | 较高 |
| HDR处理 | 色调映射+宽色域转换 | 高 |
| AI推理 | 卷积加速器+量化网络 | 很高 |
视频处理SoC的完整设计流程:1)需求分析(分辨率/帧率/功能) 2)架构设计(流水线级数/模块划分/接口定义) 3)模块开发(Verilog编码/单元验证) 4)系统集成(级联验证/时序分析) 5)FPGA实现(综合/布局布线/比特流生成) 6)板级验证(HDMI输入输出/实时效果评估)
当像素时钟较高(如148.5MHz for 1080p)时,关键路径可能无法满足时序约束。优化方法:
当FPGA资源紧张时,可以牺牲吞吐率换取面积:
视频处理模块持续运行,功耗优化很重要:
完成以下所有项目即可毕业:
| 开发板 | FPGA | 适合项目 | 价格范围 |
|---|---|---|---|
| Arty A7 | Artix-7 35T | 640x480处理 | $100~150 |
| Nexys Video | Artix-7 200T | 1080p处理 | $300~400 |
| ZCU104 | Zynq UltraScale+ | 4K+AI加速 | $500~800 |