第四节:像素时钟与PLL配置

各位同学,今天我们来聊聊视频输出里最核心的一个问题——时钟。说白了,没有稳定的像素时钟,你的HDMI画面就是一团乱码。我刚开始做HDMI驱动时,就吃过这个亏,画面老是闪,查了半天,原来是PLL配置参数算错了。

4.1 视频时序标准(VESA)

VESA标准定义了每种分辨率的时序参数。你想想看,显示器怎么知道什么时候该显示下一行、下一帧?全靠这些时序信号。

一个完整的视频帧包含:

  • 有效像素区域:真正显示图像的部分
  • 消隐区:包含水平前肩、同步脉冲、后肩
  • 垂直消隐区:类似,但针对行

我常用的几个分辨率参数,给你列个表:

分辨率刷新率(Hz)像素时钟(MHz)H总像素V总行数
640x4806025.175800525
800x6006040.01056628
1024x7686065.01344806
1280x7206074.251650750
1920x108060148.522001125
小提示: 注意看,像素时钟不是简单用分辨率乘刷新率算出来的。因为还要加上消隐区的像素。比如1920x1080@60Hz,有效像素是1920x1080,但总像素是2200x1125,所以时钟 = 2200 × 1125 × 60 ≈ 148.5 MHz。

4.2 像素时钟计算

像素时钟的计算公式其实很简单:

像素时钟 = H_total × V_total × 刷新率

举个例子,我们做720p输出:

H_total = 1650(有效1280 + 消隐370)
V_total = 750(有效720 + 消隐30)
刷新率 = 60 Hz

像素时钟 = 1650 × 750 × 60 = 74.25 MHz

嗯,这里要注意。74.25MHz这个值很特殊,它是HDMI标准里的基准频率。为什么?因为高清视频的时钟都是它的整数倍或分数倍。比如1080p就是148.5MHz,正好是两倍。

我在项目中遇到过一个问题:用Vivado的时钟向导生成74.25MHz,结果出来的实际频率是74.175MHz。差那么一点点,画面就开始出现条纹。后来发现是PLL的VCO频率范围限制,导致分频系数只能取整。解决办法是改用MMCM,它的分频精度更高。

4.3 MMCM/PLL IP核配置

Xilinx的器件里,PLL和MMCM都能用来生成像素时钟。我个人习惯用MMCM,因为它有更多的相位调整选项,对HDMI这种高速接口更友好。

配置步骤大致如下:

  1. 选择输入时钟:通常是开发板上的晶振,比如50MHz或100MHz
  2. 设置输出频率:输入你要的像素时钟值
  3. 调整分频系数:系统会自动计算M和D值
  4. 检查VCO频率:确保在器件允许范围内

举个例子,从50MHz生成74.25MHz:

输入时钟: 50 MHz
目标输出: 74.25 MHz

M (倍频系数) = 297
D (分频系数) = 200
VCO频率 = 50 × 297 / 200 × 2 = 148.5 MHz(内部倍频后)

实际输出 = 148.5 / 2 = 74.25 MHz ✓
避坑指南: 我曾经在配置MMCM时,直接用了默认的M和D值,结果输出频率差了0.1%。对于一般逻辑没问题,但HDMI的TMDS时钟要求非常严格,偏差超过±0.5%就会丢同步。所以一定要用精确的小数分频模式。

4.4 时钟域同步

好了,时钟生成出来了,但问题来了——你的系统里可能有多个时钟域。比如:

  • 系统时钟域(100MHz)
  • 像素时钟域(74.25MHz)
  • TMDS串行时钟域(742.5MHz,10倍于像素时钟)

跨时钟域传输数据,最怕的就是亚稳态。说白了,就是信号在时钟沿附近变化,导致寄存器采到了不确定的值。

我常用的同步方法:

  1. 两级寄存器同步:最基础的单bit同步,适用于控制信号
  2. 异步FIFO:多bit数据跨时钟域,比如像素数据从系统时钟到像素时钟
  3. 握手协议:用于低速控制信号,可靠性高

给你看个两级同步的Verilog代码片段:

// 从系统时钟域到像素时钟域的同步
reg sync_reg1, sync_reg2;
always @(posedge pixel_clk or posedge rst) begin
    if (rst) begin
        sync_reg1 <= 1'b0;
        sync_reg2 <= 1'b0;
    end else begin
        sync_reg1 <= sys_clk_signal;  // 来自系统时钟域
        sync_reg2 <= sync_reg1;       // 同步到像素时钟域
    end
end
assign pixel_clk_signal = sync_reg2;

核心要点: 像素时钟是HDMI系统的命脉。从VESA时序计算,到PLL/MMCM配置,再到跨时钟域同步,每一步都马虎不得。我建议你在做板级调试时,先用示波器看看像素时钟的抖动和频率精度,确认没问题再往下走。

嗯,关于像素时钟和PLL配置,今天就讲这么多。记住一句话:时钟稳了,画面就稳了。下次我们聊聊TMDS编码和串行化,那才是真正考验功底的地方。

像素时钟与PLL配置知识体系 输入时钟(50/100MHz) PLL / MMCM IP核配置 M倍频 / D分频 / VCO频率检查 像素时钟(如74.25MHz) VESA视频时序标准 H_total / V_total / 消隐区 时钟域同步 两级同步 / 异步FIFO TMDS串行时钟 10倍像素时钟(742.5MHz) 稳定的HDMI视频输出

可可精品资料库