在复古计算硬件仿真领域,FPGA(现场可编程门阵列)技术因其高性能和可重配置性而备受青睐,尤其适用于周期精确(cycle-accurate)的 CPU 仿真。本文聚焦于基于 FPGA 构建的 IBM PC-XT 克隆项目,强调 Intel 8088 CPU 的周期精确仿真以及 ISA(Industry Standard Architecture)总线时序的实现。这种仿真方法不仅能重现 1980 年代 XT 系统的行为,还能支持运行如 EGA 图形游戏的经典软件,确保硬件级兼容性。
观点一:周期精确仿真是复古硬件复刻的核心,确保软件行为的忠实再现。传统软件仿真虽灵活,但往往忽略硬件时序细节,导致外围设备兼容问题。而在 FPGA 上,通过硬件描述语言如 Verilog 实现的仿真,能在时钟周期级别精确模拟 8088 的指令执行和总线交互。这对于运行 DOS 时代游戏至关重要,例如需要精确中断处理的 Monkey Island 1。证据显示,在该项目中,开发者使用低功耗 NEC V20 CPU(兼容 8088)与 FPGA 结合,实现了从 0Hz 到标准时钟的宽范围运行,避免了高电压兼容难题。“V20 CPU 的外部接口以总线周期为单位操作”,这要求 FPGA 的 bus controller 严格遵守时序规范。
可落地参数与清单:首先,选择合适的 FPGA 板,如 Lattice LFE5U-25F(iCESugar-Pro),其资源足以容纳 8088 核心逻辑和外围模块。时钟频率设定为 XT 标准的 4.77MHz(基于 14.31818MHz 晶振分频),确保 50% 占空比以匹配 V20 要求。状态机设计是关键:构建一个有限状态机(FSM)来检测总线周期起始,包括读内存(M/IO=0, RD=0)、写 IO(M/IO=1, WR=0)等类型。每个周期通常跨越 4-6 个时钟 tick,例如内存写周期:T1 状态 CPU 断言地址和控制信号,T2-T3 数据有效,T4 结束。参数包括 setup 时间(地址稳定前 20ns)、hold 时间(数据保持后 10ns),通过 FPGA 的时序约束文件(SDC)验证。清单如下:
- 初始化 bus controller:监控 ADS#(地址选通)信号启动周期。
- 类型识别:基于 M/IO#、RD#、WR#、LOCK# 等引脚分类周期。
- 数据处理:读周期在 T3 采样数据,写周期在 T2 驱动数据。
- 等待状态:支持 READY# 信号插入 wait cycles,阈值不超过 16 cycles 以防死锁。
- 监控点:使用 ILA(Integrated Logic Analyzer)捕获时序波形,检查违例如 hold violation。
观点二:ISA 总线时序的精确集成是外围设备兼容的基础。ISA 总线作为 XT 的核心接口,定义了严格的时序窗口,用于内存、IO 和中断。FPGA 仿真需模拟这些时序,以支持 CGA/EGA 视频、PIT(8253 定时器)和 PIC(8259 中断控制器)。忽略时序可能导致如鼠标中断丢失或硬盘读写错误。项目中,开发者通过 Verilog 模块桥接 PS/2 鼠标到模拟 UART,实现双向通信;SD 卡作为固定盘,使用 SPI 控制器响应 INT 13h BIOS 调用。这种集成确保了 cycle-level 准确性,例如中断周期需在特定时钟边沿响应。
证据与参数:博客描述了使用 Supersoft/Landmark Diagnostic ROM 测试 PIT 和 PIC,验证了总线时序的稳定性。“每个总线周期遵循特定事件序列,跨越多个时钟周期”,这通过状态机确保信号采样时机正确。ISA 时序参数包括:地址有效期(T1-T2,200ns min),数据传输延迟(T2-T3,80ns max),IO 周期比内存短(3 states vs 4)。对于外围集成,SD 卡 SPI 时钟设为 1MHz 以匹配 XT 速度,扇区大小固定 512 字节。鼠标桥接模块需处理 PS/2 的 100kHz 时钟,请求报告率 10ms 间隔。清单:
- 总线仲裁:优先级 DMA 通道 0-3,仲裁延迟不超过 4 cycles。
- 中断处理:PIC 级联模式,IRQ0-7 映射到 8259A,响应时间 < 1us。
- 视频时序:CGA 模式下,视频内存读端口与 SRAM 共享,读优先 SRAM 以模拟影子 RAM。
- 错误处理:超时阈值设为 100 cycles,触发 NMI(非掩码中断)。
- 调试工具:Verilator 模拟器验证波形,比较真实 PC 逻辑分析仪捕获。
观点三:工程化挑战与优化策略需关注功耗、资源利用和可扩展性。FPGA 资源有限,8088 核心约占 5% LUTs,但外围如 YM3812 FM 合成需开源 IP 核(jtopl)集成。低功耗设计使用 3.3V IO,避免 5V 电平转换。风险包括时序违例导致的仿真不准,可通过约束优化和多角优化(multi-corner)分析缓解。项目中,开发者手动焊接 SRAM 芯片,强调供应链管理。
可落地参数:资源预算:LUTs <20k,BRAM 1Mb 用于 BIOS / 视频。功耗 < 1W,通过低功耗 V20(UPD70108H)和 CY62158EV30 SRAM 实现。回滚策略:若时序失败,降频至 3MHz 测试兼容性。监控点:JTAG 链路实时观察状态机,功耗表追踪热问题。清单:
- 硬件布局:DIP-40 V20 socket,PS/2 双口,SD 槽。
- 软件加载:BIOS 从 phatcode.net,option ROM 自写汇编。
- 测试套件:NASM blinky 程序,诊断 ROM 内存测试。
- 扩展:支持 EGA 需额外 VRAM,参数分辨率 640x350,16 色。
- 文档:原理图 EasyEDA,Gerber JLCPCB。
总之,这种 FPGA-based PC-XT 克隆展示了 cycle-accurate emulation 的强大潜力,不仅重现了历史硬件,还为现代复古爱好者提供可玩平台。通过严格的时序控制和模块化设计,开发者能高效集成外围,实现如 Adlib 音频和硬盘保存的功能。未来,可扩展到 AT 兼容,进一步探索 x86 演进。
资料来源:
- Bit-Hack 博客:FPGA based IBM-PC-XT 项目日志。
- GitHub 仓库:iceXt 源代码与原理图。