4. MIPI D-PHY 接收端 RTL 设计:HS-RX 模式、LP-RX 模式、同步头检测、串并转换

好,咱们今天来啃 MIPI D-PHY 接收端最核心的几个模块。说白了,就是让摄像头的数据能正确进到你的芯片里。我刚开始接触 MIPI 的时候,觉得协议栈好复杂,后来发现只要把物理层这几个状态机搞明白,后面就顺了。

4.1 HS-RX 模式:高速数据通道的“耳朵”

HS-RX 模式,就是接收端工作在高速差分信号下的状态。这时候 D-PHY 的 Data Lane 和 Clock Lane 都在跑几百 Mbps 甚至 Gbps 级别的数据。

核心要点:

  • 差分信号接收: HS 模式下,D-PHY 用一对差分线(Dp/Dn)传输数据。接收端需要把差分信号转成单端数字电平。我建议在 RTL 里直接例化工艺库提供的差分接收器,别自己用逻辑门搭,时序容易出问题。
  • 终端匹配: 接收端内部有个 100Ω 的差分终端电阻,只有在 HS 模式下才使能。这个使能信号得跟 LP-RX 状态机配合好,不然阻抗不匹配,信号反射会把眼图搞烂。
  • 共模电压范围: HS 信号的共模电压大概在 200mV 左右,摆幅只有 200-400mV。所以接收器要有足够的共模抑制比。
我的经验: 曾经有个项目,HS 模式下数据偶尔错位。查了好久,发现是终端电阻使能信号晚了几个时钟周期。记住:终端电阻必须在 LP→HS 切换完成前稳定建立。

4.2 LP-RX 模式:控制通道的“低语”

LP-RX 模式处理的是低功耗信号,电压摆幅大(0-1.2V),速率低(10Mbps 左右)。它主要用于控制信息传输,比如进入/退出 Escape 模式、触发复位等。

LP 状态机核心状态:

状态 Dp/Dn 电平 含义
LP-00 Dp=0, Dn=0 HS 关闭 / 控制线低功耗空闲
LP-01 Dp=0, Dn=1 HS 请求 / 控制线高电平
LP-10 Dp=1, Dn=0 LP 请求 / 控制线低电平
LP-11 Dp=1, Dn=1 高速模式准备就绪 / 控制线高阻

你想想看,LP 模式其实就是在两根线上编了 4 种状态。接收端需要实时检测 Dp/Dn 的电平组合,然后跳转到对应的状态。我习惯用一个简单的 Moore 状态机来实现,输出只跟当前状态有关,不容易产生毛刺。

注意: LP 状态切换有严格的时序要求。比如从 LP-11 到 LP-00 的切换时间不能超过某个阈值,否则接收端会误判为 HS 模式开始。我曾经遇到过因为 PCB 走线过长导致 LP 信号边沿变缓,状态机卡在中间态的问题。

4.3 同步头检测:找到数据的“起跑线”

HS 模式下,数据不是随便发的。每包数据前面都有一段固定的同步头(Sync Pattern),接收端必须准确检测到这个头,才能开始采样数据。

同步头格式:

  • 前导码(Preamble): 8 个连续的 0x00 字节,用于接收端 PLL 锁定和时钟恢复。
  • 同步码(Sync Code): 固定的 0xB8 字节(二进制 10111000),作为数据包的起始标志。

检测逻辑:

// 伪代码示例:同步头检测状态机
always @(posedge clk or negedge rst_n) begin
    if (!rst_n) begin
        state <= IDLE;
        sync_detected <= 1'b0;
    end else begin
        case (state)
            IDLE: begin
                if (byte_data == 8'h00) begin
                    preamble_count <= preamble_count + 1;
                    if (preamble_count == 8) state <= WAIT_SYNC;
                end else begin
                    preamble_count <= 0;
                end
            end
            WAIT_SYNC: begin
                if (byte_data == 8'hB8) begin
                    sync_detected <= 1'b1;
                    state <= DATA;
                end else begin
                    state <= IDLE;  // 同步码错误,重新等待
                end
            end
            DATA: begin
                // 正常接收数据包
            end
        endcase
    end
end

这里有个坑:前导码的计数不能太死板。有些传感器在切换通道时可能会多发送或少发送几个前导码字节。我建议把计数器的阈值设成一个范围(比如 6-10 个),而不是固定 8 个。

4.4 串并转换:把高速串行流“掰开”

D-PHY 物理层传过来的是串行比特流,但内部逻辑需要并行数据。串并转换模块就是干这个活的。

转换流程:

  1. 比特对齐: 根据同步头检测到的起始位置,确定每个字节的边界。
  2. 串行移位: 用高速时钟(通常是 DDR 时钟的 2 倍)把串行数据移入移位寄存器。
  3. 并行输出: 每收到 8 个比特,就输出一个字节到下游模块。

关键设计点:

  • 时钟域同步: 串行数据是在高速时钟域,而下游逻辑可能工作在低速时钟域。需要做异步 FIFO 或握手处理。
  • 位序问题: MIPI 协议规定先传 LSB(最低有效位)。如果你的移位寄存器是从 MSB 开始移,那输出数据就是反的。我吃过这个亏,仿真时没注意,上板后图像全是花的。
避坑指南: 我曾经在串并转换模块里忘了处理跨时钟域,导致数据偶尔丢字节。后来加了一个深度为 4 的异步 FIFO,问题就解决了。记住:高速串行域和低速并行域之间一定要做同步处理。

4.5 整体结构图

下面这张图展示了接收端这几个模块的协作关系。你可以看到,LP-RX 状态机控制着 HS-RX 的使能,而同步头检测模块又决定了串并转换的起始时刻。

MIPI D-PHY 接收端 RTL 结构图 MIPI D-PHY 接收端 RTL 模块结构 Dp/Dn 输入 LP-RX 状态机 HS-RX 差分接收器 同步头 检测 串并转换 8b 并行输出 并行数据 使能控制 说明: 1. LP-RX 状态机检测 Dp/Dn 电平,决定是否进入 HS 模式。 2. HS-RX 接收差分信号,输出串行比特流。 3. 同步头检测模块找到数据包起始位置,触发串并转换。

4.6 设计要点总结

嗯,到这里,接收端 RTL 设计的几个关键模块就讲完了。我最后再啰嗦几句:

  • 状态机要健壮: LP 和 HS 状态机都要考虑异常情况,比如收到非法状态组合时能自动复位。
  • 时序约束要到位: 高速串行路径上的寄存器一定要做合理的时序约束,不然综合工具可能优化出问题。
  • 仿真验证要全面: 建议用 UVM 搭建验证环境,覆盖正常模式、边界情况、异常中断等场景。

我个人习惯在写完 RTL 后,先做门级仿真,再跑形式化验证,确保状态机不会进入死锁状态。这一步虽然费时间,但能省掉后面 Debug 的很多麻烦。