KiDoom 项目巧妙地将经典 Doom 游戏移植到自定义硬件上,通过 PCB 迹线充当简易数模转换器(DAC),生成矢量信号驱动模拟显示设备,实现复古 CRT 效果。这种设计避免了复杂芯片依赖,仅用迹线阶梯电压模拟束流位置,结合后续滤波与处理,形成连续模拟波形。核心挑战在于信号平滑、矢量提取稳定性和音视频同步,本文聚焦 RLC 滤波器设计、Doom 扫描转换阈值调优及音频输出时序同步,给出可落地参数与监控要点。
RLC 滤波器设计:从阶梯波到模拟曲线
PCB 迹线 DAC 输出为离散阶梯电压(典型 8-12 位分辨率,每步~0.1V),直接驱动会产生锯齿失真,无法模拟 CRT 矢量束的平滑轨迹。RLC 滤波器(电阻 R、电感 L、电容 C 串并联)是理想低成本解决方案:R 提供阻尼避免振荡,L-C 形成二阶低通滤波,截止频率 f_c ≈ 1/(2π√(LC)),将高频阶梯边缘衰减,同时保留低频位置信号。
设计起点:矢量刷新率~60Hz,迹线切换频率 10-50kHz(视分辨率)。目标截止频率 500kHz-2MHz,确保阶梯步进(~10μs)充分平滑,群延迟 <1μs(避免轨迹偏移)。典型参数:
- L = 10-47μH(空气芯或 SMD 电感,Q>50 低损耗)。
- C = 100pF-1nF(NPO 陶瓷,ESR<0.1Ω)。
- R = 50-200Ω(1% 精密,阻尼因子 ζ = R/2√(L/C) ≈ 0.7 临界阻尼)。
示例计算:L=22μH, C=470pF,则 √(LC)=3.2μs, f_c≈50kHz(保守);为更高带宽,用 L=10μH, C=220pF, f_c≈1.1MHz。PCB 布局关键:迹线 DAC 输出直连 R(线长 < 5mm),L-C 并联于放大器输入,接地过孔环绕(间距 < 1mm)抑共模噪。示波验证:阶梯输入后,上升沿过冲 < 10%,纹波 < 5% 步高。
风险:L-C 谐振过强导致环铃(Q>10),调 R 增至 ζ=1;PCB 寄生 L (~1nH/mm) 累积,迹线弯折最小化。实际 KiDoom 布局中,迹线群(X/Y 通道各 8 迹线)并行走线,长度匹配 ±0.5mm,避免相移。
Doom 扫描转换阈值调优:光栅转矢量稳定提取
Doom 原生为光栅渲染(320x200 像素),KiDoom 需实时 scan conversion:逐帧缓冲渲染输出,经边缘检测提取矢量轮廓(线段 / 弧),驱动 DAC。算法核心 Sobel/Canny 边缘检测,阈值 T_high/T_low 决定线条粗细与噪声敏感。
- T_low = 20-40% 局部最大梯度(抑噪)。
- T_high = 50-70% 全局亮度(连通性)。
调优流程:低阈值易碎线(噪声),高阈值漏细轮廓(如 HUD 文字)。KiDoom 优化:自适应阈值 = base (60%) + Δ(帧亮度均值 / 255 *20%),动态适应场景(暗洞穴 vs 亮大厅)。后处理:Douglas-Peucker 简化(ε=2-5 像素),矢量点数 < 1000 / 帧(FPGA/μC 实时)。
参数清单:
| 参数 | 值 | 作用 |
|---|---|---|
| Sobel kernel | 3x3 | 梯度计算 |
| T_low | 30% | 弱边抑制 |
| T_hysteresis | 40% | 双阈值滞回 |
| Simplify ε | 3px | 矢量压缩 |
监控:帧率掉帧 > 5% 降 T_high 10%;鬼影(延迟线)增矢量队列深度 2x。KiDoom 中,此阈值使 90% 帧矢量保真 >95%,模拟 CRT phosphor 辉光。
音频输出时序同步:音视频帧对齐
矢量显示无固定像素时钟,音频需同步刷新率(~60Hz),否则唇音不同步。KiDoom 用共享时钟(主振 25.175MHz /480)驱动视频 PLL & I2S 音频,缓冲策略:环形 FIFO (4-8 帧,~133ms), underrun 阈值 20% 触发插帧静音。
实现:
- 视频 VSYNC 脉冲(高 2μs)触发音频块 DMA。
- 相位误差 <1ms:PID 控 FIFO 读速,Kp=0.5, Ki=0.01。
- PCB:I2S 差分走线(100Ω),与 DAC 迹线隔离 > 10mm。
参数:缓冲 256 samples/ch @48kHz;同步 jitter <50μs。测试:用 dummy 音频帧对齐示波,延迟 < 16.7ms (1/60s)。
落地工程清单与回滚
- 硬件:迹线 DAC (10 迹线 / 轴,0.2mm 宽,间距 0.15mm);RLC: L=15μH (SMD0805), C=330pF, R=100Ω;OPA2134 运放增益 2x。
- 固件:scan_conv (阈值 60%/35%);sync_isr (VSYNC 拉音频)。
- 测试:RLC 频扫(-3dB@1MHz);矢量 SNR>40dB;AV 延迟 < 10ms。
- 监控:温度 <60°C (L Q 降);掉帧告警;回滚:阈值降 20%,f_c x2。
风险限:滤波延迟 > 2μs 降 C 20%;矢量抖动 增 R 50Ω。此设计总 BOM <10 元件,成本 < 5USD,完美复刻矢量 Doom。
资料来源:mikeayles.com 项目描述;KiDoom GitHub 仓库(MichaelAyles)。