阶段1:色彩与格式

第03课:色彩校正

亮度/对比度/饱和度调整的硬件实现与系数定点化

色彩校正原理

亮度调整对所有像素值加减偏移量;对比度调整以中灰(128)为中心缩放像素值差异;饱和度调整缩放色度分量相对于中性灰的距离。使用Q0.8格式(128=1.0x)表示系数。注意:对比度和饱和度调整都可能产生超出[0,255]范围的值,必须做饱和截断!

Verilog实现

// 第03课:色彩校正 - 亮度/对比度/饱和度
module color_correction #(
    parameter DATA_W = 8, COEF_W = 8
)(
    input  wire                clk, rst_n,
    input  wire                valid_in,
    input  wire [DATA_W-1:0]   y_in, cb_in, cr_in,
    input  wire [COEF_W-1:0]   brightness, contrast, saturation,
    output reg                 valid_out,
    output reg  [DATA_W-1:0]   y_out, cb_out, cr_out
);
    reg signed [DATA_W:0] y_adj;
    wire signed [DATA_W:0] boff = $signed({1'b0,brightness}) - 128;
    always @(*) begin y_adj=$signed({1'b0,y_in})+boff; if(y_adj<0) y_adj=0; else if(y_adj>255) y_adj=255; end
    reg signed [17:0] yc, cbs, crs;
    always @(posedge clk or negedge rst_n) begin
        if (!rst_n) begin yc<=0; cbs<=0; crs<=0; end
        else if (valid_in) begin
            yc<=(y_adj-128)*$signed({1'b0,contrast});
            cbs<=($signed({1'b0,cb_in})-128)*$signed({1'b0,saturation});
            crs<=($signed({1'b0,cr_in})-128)*$signed({1'b0,saturation});
        end
    end
    function automatic [DATA_W-1:0] clip8; input signed [17:0] v; logic signed [17:0] s;
        begin s=(v>>>7)+128; if(s<0) clip8=0; else if(s>255) clip8={DATA_W{1'b1}}; else clip8=s[DATA_W-1:0]; end
    endfunction
    always @(posedge clk or negedge rst_n) begin
        if (!rst_n) begin valid_out<=0; y_out<=0; cb_out<=0; cr_out<=0; end
        else begin valid_out<=valid_in; y_out<=clip8(yc); cb_out<=clip8(cbs); cr_out<=clip8(crs); end
    end
endmodule

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

仿真验证

练习

  1. 添加色温调整(偏移Cb/Cr)
  2. 实现自动对比度
  3. 对比FPGA与软件PSNR

成就解锁

深入理解:色彩校正进阶

本节深入探讨色彩校正在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 // 帧起始/行结束

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

功耗考虑

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

色彩校正的高级实现

3D LUT色彩校正

专业视频处理使用3D查找表(3D LUT)进行色彩校正。3D LUT将(R,G,B)映射到(R',G',B'),可以表示任意非线性色彩变换。

典型3D LUT大小:17x17x17 = 4913个条目,每个条目3x12bit = ~18KB。硬件实现需要三线性插值(8个顶点加权平均)。

色温调整

色温(Color Temperature)用开尔文(K)表示光源的颜色。常见色温:

色温光源偏色
2700K白炽灯暖黄
4000K荧光灯中性白
5500K日光标准白
6500K阴天冷蓝
10000K蓝天明显蓝

硬件实现:等量偏移Cb和Cr。暖色调+Cr, 冷色调+Cb。

自动白平衡(AWB)

AWB算法流程:

  1. 统计全帧的R/G/B均值
  2. 计算增益:R_gain=G_avg/R_avg, B_gain=G_avg/B_avg
  3. 应用增益到每个像素
  4. 需要2帧延迟(统计+应用)

亮度直方图与自动曝光

通过亮度直方图统计,可以实现自动曝光控制:

附录

关键术语表

术语英文说明
像素Pixel图像最小单元
Frame一帧完整图像
Field隔行扫描的半帧
消隐Blanking非有效视频区域
流水线Pipeline多级并行处理架构
定点数Fixed-point有限精度数值表示
饱和截断Saturation超出范围钳位到边界
行缓冲Line Buffer缓存一行像素的存储器
帧缓冲Frame Buffer缓存一帧图像的存储器
时序Timing视频同步信号参数

本课核心知识点

  1. 算法原理:理解色彩校正的数学基础和物理意义
  2. 定点化:从浮点公式到Q格式定点实现
  3. 流水线设计:多级流水线平衡时序和面积
  4. Verilog实现:参数化、可配置、可验证的RTL代码
  5. 仿真验证:测试向量设计、边界条件覆盖

同阶段相关课程

前置知识

推荐阅读

Verilog编码检查清单

常见错误与调试

错误现象可能原因解决方法
输出全零复位未释放或valid未传播检查rst_n和valid链
色彩偏移系数位宽不足或溢出增加中间结果位宽
行间错位行缓冲地址不对齐检查写地址和读地址
画面闪烁时序违例或跨时钟域添加同步器或约束
边缘伪影边界处理不正确添加边界检测和钳位

本课资源估算

资源估计使用量说明
LUT100~500加法器、比较器、选择器
FF50~200流水线寄存器、状态机
DSP0~9乘法器(色彩转换9个)
BRAM(18K)0~6行缓冲(2~4行)、帧缓冲、LUT
延迟2~5 cycles流水线级数

Verilator验证命令

# 语法检查
verilator --lint-only verilog/lesson_03.v

# 带波形仿真(需要testbench)
verilator --trace --cc verilog/lesson_03.v --exe tb.cpp
make -C obj_dir -f Vlesson_03.mk
./obj_dir/Vlesson_03

补充:常见问题FAQ

Q: 为什么选择FPGA而不是GPU做视频处理?
A: FPGA提供确定性延迟、更低功耗和更高能效比。实时视频处理需要可预测的延迟,GPU的调度不确定性无法满足。
Q: 定点运算和浮点运算的精度差距有多大?
A: 对于8bit视频处理,Q1.10定点(误差<0.5LSB)与单精度浮点的PSNR差异通常<0.1dB,视觉不可见。
Q: 如何选择行缓冲的位宽?
A: 行缓冲位宽=像素位宽。中间结果可以更宽(12~16bit)以保持精度,但存储到行缓冲前截断到像素位宽。
Q: Verilator和ModelSim有什么区别?
A: Verilator是开源lint+编译仿真器,速度快但不支持全部Verilog特性。ModelSim是商业全功能仿真器,支持SystemVerilog/VHDL。
Q: 模块级联时valid信号如何对齐?
A: 每级模块内部打拍valid(1周期延迟),级间自然对齐。如果某级有可变延迟,需要FIFO或握手协议。