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。所以接收器要有足够的共模抑制比。
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 状态机来实现,输出只跟当前状态有关,不容易产生毛刺。
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 物理层传过来的是串行比特流,但内部逻辑需要并行数据。串并转换模块就是干这个活的。
转换流程:
- 比特对齐: 根据同步头检测到的起始位置,确定每个字节的边界。
- 串行移位: 用高速时钟(通常是 DDR 时钟的 2 倍)把串行数据移入移位寄存器。
- 并行输出: 每收到 8 个比特,就输出一个字节到下游模块。
关键设计点:
- 时钟域同步: 串行数据是在高速时钟域,而下游逻辑可能工作在低速时钟域。需要做异步 FIFO 或握手处理。
- 位序问题: MIPI 协议规定先传 LSB(最低有效位)。如果你的移位寄存器是从 MSB 开始移,那输出数据就是反的。我吃过这个亏,仿真时没注意,上板后图像全是花的。
4.5 整体结构图
下面这张图展示了接收端这几个模块的协作关系。你可以看到,LP-RX 状态机控制着 HS-RX 的使能,而同步头检测模块又决定了串并转换的起始时刻。
4.6 设计要点总结
嗯,到这里,接收端 RTL 设计的几个关键模块就讲完了。我最后再啰嗦几句:
- 状态机要健壮: LP 和 HS 状态机都要考虑异常情况,比如收到非法状态组合时能自动复位。
- 时序约束要到位: 高速串行路径上的寄存器一定要做合理的时序约束,不然综合工具可能优化出问题。
- 仿真验证要全面: 建议用 UVM 搭建验证环境,覆盖正常模式、边界情况、异常中断等场景。
我个人习惯在写完 RTL 后,先做门级仿真,再跑形式化验证,确保状态机不会进入死锁状态。这一步虽然费时间,但能省掉后面 Debug 的很多麻烦。