阶段1:色彩与格式

第01课:视频处理概述

数字视频基础概念、像素格式、帧缓冲架构与FPGA实现概述

视频处理概述原理

数字视频基础概念、像素格式、帧缓冲架构与FPGA实现概述

Verilog实现

// 第01课:视频处理概述 - 顶层架构示例
module video_overview #(
    parameter DATA_W = 8, IMG_W = 640, IMG_H = 480
)(
    input  wire                clk, rst_n,
    input  wire                vid_in_valid,
    input  wire [DATA_W-1:0]   vid_in_data,
    input  wire                vid_in_sof, vid_in_eol,
    output reg                 vid_out_valid,
    output reg  [DATA_W-1:0]   vid_out_data,
    output reg                 vid_out_sof, vid_out_eol,
    input  wire [7:0]          cfg_brightness,
    input  wire [7:0]          cfg_contrast,
    input  wire                cfg_bypass
);
    reg [DATA_W-1:0] s1_data; reg s1_valid, s1_sof, s1_eol;
    always @(posedge clk or negedge rst_n) begin
        if (!rst_n) begin s1_data<=0; s1_valid<=0; s1_sof<=0; s1_eol<=0; end
        else begin s1_data<=vid_in_data; s1_valid<=vid_in_valid; s1_sof<=vid_in_sof; s1_eol<=vid_in_eol; end
    end
    reg [DATA_W-1:0] s2_data; reg s2_valid, s2_sof, s2_eol;
    wire [17:0] cmul = s1_data * {1'b0, cfg_contrast};
    wire [17:0] cadd = cmul + {cfg_brightness, 9'b0};
    always @(posedge clk or negedge rst_n) begin
        if (!rst_n) begin s2_data<=0; s2_valid<=0; s2_sof<=0; s2_eol<=0; end
        else begin
            s2_valid<=s1_valid; s2_sof<=s1_sof; s2_eol<=s1_eol;
            if (cadd[17]) s2_data<=0;
            else if (|cadd[17:8]) s2_data<={DATA_W{1'b1}};
            else s2_data<=cadd[7:0];
        end
    end
    always @(posedge clk or negedge rst_n) begin
        if (!rst_n) begin vid_out_data<=0; vid_out_valid<=0; vid_out_sof<=0; vid_out_eol<=0; end
        else begin
            vid_out_valid<=s2_valid; vid_out_sof<=s2_sof; vid_out_eol<=s2_eol;
            vid_out_data <= cfg_bypass ? s1_data : s2_data;
        end
    end
endmodule

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

仿真验证

练习

  1. 添加饱和度调整功能
  2. 用移位+加法近似替代乘法器
  3. 添加帧计数器
  4. 仿真验证渐变灰度图效果

成就解锁

深入理解:视频处理流水线设计

现代FPGA视频处理系统通常采用深流水线架构,每个处理模块作为一个流水线级,通过valid/ready握手协议连接。这种设计确保了:

定点数运算深入

FPGA中浮点运算资源昂贵(DSP+大量逻辑),定点运算是视频处理的首选。常用Q格式:

格式范围精度适用场景
Q0.80~255/2561/256混合系数、增益
Q1.100~21/1024色彩转换系数
Q4.12-8~81/4096仿射变换系数
Q16.16-32768~327671/65536坐标映射

饱和截断策略

定点运算的关键问题是溢出处理。视频处理中常用的策略:

  1. 饱和截断(Saturate):超出范围则钳位到边界值,最常用
  2. 环绕(Wrap):模运算,会产生伪影,一般不用
  3. 对称饱和:[-128,127]范围,有符号场景

8bit像素的饱和截断实现:检查结果的高位是否非零(正溢出)或符号位为1(负溢出)。

FPGA资源分析(640x480@60fps)

资源亮度+对比度模块说明
LUT~200加法器+比较器+选择器
FF~50流水线寄存器
DSP1对比度乘法器
BRAM0无需行缓冲
延迟3 cycles输入寄存+乘加+截断

视频数据流协议

FPGA视频模块间的数据传输通常使用以下信号:

有时还使用ready信号实现反压(back-pressure),形成完整的valid/ready握手。

测试方法学

Verilog视频模块的仿真验证方法:

  1. 单元测试:针对单个模块,输入特定测试向量
  2. 对比测试:用软件(Python/MATLAB)实现相同算法,对比输出
  3. 覆盖率测试:确保所有分支和边界条件都被覆盖
  4. 时序测试:验证流水线延迟和吞吐率

数字视频信号流

一个完整的数字视频信号从采集到显示经历多个处理环节:

传感器(CMOS/CCD) -> ADC -> ISP -> 编码 -> 传输 -> 解码 -> 后处理 -> 显示

每个环节都可能涉及不同的色彩空间、位深、分辨率和帧率。

CMOS传感器输出格式

格式说明数据量
RAW88bit Bayer原始数据1 byte/pixel
RAW1010bit Bayer1.25 byte/pixel
RAW1212bit Bayer1.5 byte/pixel
YUV4228bit YCbCr 4:2:22 byte/pixel
RGB8888bit RGB全色3 byte/pixel

Bayer模式与去马赛克

CMOS传感器每个像素只采集R/G/B之一,排列为Bayer模式(RGGB/GRBG/GBRG/BGGR)。去马赛克(Demosaicing)算法从单色采样恢复全色图像,常用双线性插值或边缘感知插值。

视频处理的关键指标

指标定义典型值
吞吐率每秒处理像素数18~500 Mpixels/s
延迟输入到输出的周期数3~30 cycles
PSNR峰值信噪比(dB)>30dB(好), >40dB(优)
SSIM结构相似性>0.9(好), >0.95(优)
资源利用率FPGA资源占比<80%(安全)

Verilog编码规范

视频处理模块的Verilog编码应遵循以下规范:

仿真测试平台(TB)模板

module tb_video_module;
    reg clk, rst_n;
    reg valid_in;
    reg [7:0] data_in;
    wire valid_out;
    wire [7:0] data_out;

    video_module uut (
        .clk(clk), .rst_n(rst_n),
        .valid_in(valid_in), .data_in(data_in),
        .valid_out(valid_out), .data_out(data_out)
    );

    always #5 clk = ~clk;  // 100MHz

    initial begin
        clk = 0; rst_n = 0; valid_in = 0; data_in = 0;
        #20 rst_n = 1;
        // Test vectors here
        $finish;
    end
endmodule

附录

关键术语表

术语英文说明
像素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_01.v

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