阶段1:色彩与格式

第02课:色彩空间转换(RGB/YUV)

BT.601/BT.709色彩空间转换原理与Verilog流水线实现

色彩空间基础

RGB基于三原色加法模型,YCbCr将亮度与色度分离。BT.601定义了标准转换公式:Y=0.299R+0.587G+0.114B, Cb=-0.169R-0.331G+0.500B+128, Cr=0.500R-0.419G-0.081B+128。选择Q1.10定点格式表示系数,最大截断误差约0.0005,对8bit像素影响小于0.5 LSB。BT.709用于高清视频,系数不同:Kr=0.2126,Kg=0.7152,Kb=0.0722。

定点化分析

系数浮点值Q1.10定点十进制
Kr0.2990.299*1024306
Kg0.5870.587*1024601
Kb0.1140.114*1024117

最大截断误差:1/2048 约 0.0005,对8bit像素影响小于0.5 LSB。

BT.709 vs BT.601

标准KrKgKb
BT.601(SD)0.2990.5870.114
BT.709(HD)0.21260.71520.0722

Verilog实现

// 第02课:色彩空间转换 RGB->YCbCr (BT.601)
module color_space_convert #(
    parameter DATA_W = 8
)(
    input  wire                clk, rst_n,
    input  wire                valid_in,
    input  wire [DATA_W-1:0]   r_in, g_in, b_in,
    output reg                 valid_out,
    output reg  [DATA_W-1:0]   y_out, cb_out, cr_out
);
    localparam signed [11:0] KYR=12'sd306, KYG=12'sd601, KYB=12'sd117;
    localparam signed [11:0] KCBR=-12'sd173, KCBG=-12'sd339, KCBB=12'sd512;
    localparam signed [11:0] KCRR=12'sd512, KCRG=-12'sd429, KCRB=-12'sd083;
    reg signed [20:0] yr,yg,yb,cbr,cbg,cbb,crr,crg,crb;
    reg s1v;
    always @(posedge clk or negedge rst_n) begin
        if (!rst_n) begin yr<=0;yg<=0;yb<=0;cbr<=0;cbg<=0;cbb<=0;crr<=0;crg<=0;crb<=0;s1v<=0; end
        else begin
            s1v<=valid_in;
            yr<=$signed({1'b0,r_in})*KYR; yg<=$signed({1'b0,g_in})*KYG; yb<=$signed({1'b0,b_in})*KYB;
            cbr<=$signed({1'b0,r_in})*KCBR; cbg<=$signed({1'b0,g_in})*KCBG; cbb<=$signed({1'b0,b_in})*KCBB;
            crr<=$signed({1'b0,r_in})*KCRR; crg<=$signed({1'b0,g_in})*KCRG; crb<=$signed({1'b0,b_in})*KCRB;
        end
    end
    reg signed [20:0] ys,cbs,crs; reg s2v;
    always @(posedge clk or negedge rst_n) begin
        if (!rst_n) begin ys<=0;cbs<=0;crs<=0;s2v<=0; end
        else begin s2v<=s1v; ys<=yr+yg+yb; cbs<=cbr+cbg+cbb+(128<<10); crs<=crr+crg+crb+(128<<10); end
    end
    function automatic [DATA_W-1:0] sat; input signed [20:0] v; logic signed [20:0] s;
        begin s=v>>>10; if(s<0) sat=0; else if(s>255) sat={DATA_W{1'b1}}; else sat=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<=s2v; y_out<=sat(ys); cb_out<=sat(cbs); cr_out<=sat(crs); end
    end
endmodule

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

仿真验证

练习

  1. 添加BT.709系数支持
  2. 实现YCbCr到RGB逆转换
  3. 分析最坏截断误差
  4. 仿真彩色条纹测试图

成就解锁

深入理解:色彩科学

色彩空间转换不仅仅是数学公式,背后涉及人眼视觉生理学和色彩科学:

人眼色彩感知

人眼视网膜有3种锥细胞,分别对长波(L,红)、中波(M,绿)、短波(S,蓝)最敏感。这解释了为什么RGB三色可以混合出大部分可见光颜色(三色理论)。

但人眼对亮度细节的分辨力远高于色度。这导致YCbCr空间的色度可以用更低采样率(4:2:2, 4:2:0)而几乎无感知损失。

色度子采样

格式亮度采样色度采样压缩比用途
4:4:4每像素每像素1:1专业视频
4:2:2每像素水平1/21.5:1广播/专业
4:2:0每像素水平+垂直1/22:1消费级/压缩

色域(Gamut)

BT.601覆盖标准清晰度的色彩范围,BT.709覆盖高清,BT.2020覆盖超广色域。不同色域之间转换需要色域映射(Gamut Mapping)。

有限范围 vs 完整范围

视频YCbCr通常使用有限范围(Limited Range):Y=16~235, Cb/Cr=16~240。计算机RGB使用完整范围(Full Range):0~255。转换时需要注意范围缩放。

转换精度优化

Q1.10格式的精度分析:

YCbCr到RGB逆转换

逆转换公式需要矩阵求逆,硬件实现通常预先计算好逆矩阵系数:

R = Y + 1.402 * (Cr - 128)
G = Y - 0.344 * (Cb - 128) - 0.714 * (Cr - 128)
B = Y + 1.772 * (Cb - 128)

流水线延迟分析

操作延迟资源
19个乘法1 cycle9 DSP
23个加法+偏移1 cycle3 加法器
3截断+饱和1 cycle3 比较器
总计3 cycles9 DSP + 少量逻辑

色彩空间转换的硬件实现细节

乘法器资源优化

9个乘法器(3个输出x3个输入)是色彩转换的主要资源消耗。优化策略:

CSD编码示例

0.299 = 0.0100110011... (二进制) ≈ 0.01010-010 (CSD)

0.299 * x = (x>>2) + (x>>4) - (x>>7) // 仅3次移位+2次加减

相比乘法器节省1个DSP切片。

色度子采样的硬件实现

4:2:2下采样:每2个水平像素共享1组Cb/Cr值

Y:  Y0  Y1  Y2  Y3  Y4  Y5  ...
Cb: Cb0  --  Cb2  --  Cb4  -- ...
Cr: Cr0  --  Cr2  --  Cr4  -- ...

上采样(4:2:2到4:4:4):线性插值填充缺失的Cb/Cr

有限范围转换

视频标准使用有限范围:Y=16~235(220级), Cb/Cr=16~240(225级)

Y_video = Y_full * 219/255 + 16
C_video = C_full * 224/255 + 128

硬件中用定点乘法+偏移实现,注意输入为0时Y=16(不是0)。

测试向量生成

色彩转换的标准测试图:

附录

关键术语表

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

本课核心知识点

  1. 算法原理:理解色彩空间转换(RGB/YUV)的数学基础和物理意义
  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_02.v

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

补充:常见问题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或握手协议。