1. 项目概述:打造一台能运行Win95的32位微型计算机
作为一名从90年代就开始折腾计算机的老玩家,我一直对那个时代的硬件架构充满敬意。最近突发奇想,决定从零开始搭建一台能够流畅运行Windows 95的32位微型计算机。这可不是简单的组装现成配件,而是要从芯片级别构建整个系统,包括处理器、内存控制器、图形显示等核心组件。
这个项目的核心挑战在于:我们需要在2020年代的今天,用现代元器件重新实现一套兼容80386/80486指令集的计算机系统。这不仅是对计算机组成原理的深度实践,更是对那个黄金年代计算机架构的一次致敬。整个系统需要支持实模式和保护模式切换,具备基本的图形显示能力,并能通过IDE接口连接存储设备。
提示:这个项目需要扎实的数字电路基础和一定的汇编语言知识,建议至少完成过简单的CPU实验(如基于74系列逻辑芯片的8位机)再尝试。
2. 核心芯片选型与系统架构设计
2.1 处理器选型:平衡性能与可实现性
在处理器选择上,我们有几个关键考量因素:
- 指令集兼容性:必须完整支持80386指令集,这是运行Win95的最低要求
- 封装工艺:最好选择QFP等便于手工焊接的封装
- 时钟频率:33MHz以上才能流畅运行Win95
- 资料完整性:需要有完整的数据手册和参考设计
经过多方比较,我最终选择了Intel 80486DX2-66处理器。这款CPU有以下几个优势:
- 内置浮点运算单元(FPU),无需额外协处理器
- 66MHz主频足以流畅运行大多数Win95应用
- PQFP封装相对容易手工焊接
- 有丰富的技术文档和社区支持
2.2 芯片组设计:用FPGA实现核心逻辑
现代计算机使用高度集成的芯片组,但对于我们的复古构建,我们需要更接近原始x86架构的设计。我选择用FPGA实现以下核心功能:
- 总线控制器:处理CPU与各外设之间的通信
- 内存控制器:管理SRAM和ROM的访问
- 中断控制器:实现8259A兼容的中断管理
- DMA控制器:支持基本的DMA传输
具体实现上,我采用了Xilinx Spartan-6 FPGA,主要基于以下考虑:
- 足够的逻辑单元(约6k LUTs)实现上述功能
- 支持3.3V和5V电平,可直接与486CPU接口
- 丰富的IO资源(200+用户IO)
- 相对低廉的价格和易用性
2.3 图形子系统设计
为了显示输出,我们需要实现一个兼容VGA的图形控制器。经过评估,我决定采用以下方案:
- 核心芯片:使用FPGA实现VGA时序控制器
- 显存:单独配置512KB SRAM作为显存
- 分辨率:支持640x480@16色和320x240@256色两种模式
- 接口:通过ISA总线与CPU通信
这个设计虽然简单,但足以运行大多数Win95的基础应用和游戏。对于更复杂的3D加速,可以考虑后期添加兼容Glide API的扩展卡。
3. 硬件实现细节
3.1 电源与时钟系统设计
稳定的电源和时钟是系统可靠运行的基础。我的设计方案如下:
电源系统:
- 输入:12V DC
- 主电源:LM7805提供5V@2A核心电压
- 辅助电源:AMS1117-3.3为FPGA I/O供电
- 上电时序:使用MAX811监控5V电源,确保CPU在电源稳定后才复位
时钟系统:
- 主时钟:66MHz晶体振荡器,直接驱动486CPU
- 次级时钟:25.175MHz用于VGA时序生成
- 时钟分配:使用74F244缓冲器驱动多个负载
3.2 存储器子系统实现
存储器子系统是计算机的核心部分,我的设计包括三个主要部分:
-
BIOS ROM:
- 使用SST39SF040 512KB NOR Flash
- 映射到地址空间0xF0000-0xFFFFF
- 通过74HC573锁存器实现地址锁存
-
主内存:
- 使用IS61C1024 128KBx8 SRAM
- 总容量1MB,映射到0x00000-0xFFFFF
- 通过FPGA实现内存控制器
-
显存:
- 单独配置IS61C256 32KBx8 SRAM
- 总容量256KB,通过FPGA管理
3.3 外设接口设计
为了构建完整的系统,我们需要实现几个关键外设接口:
ISA总线接口:
- 数据总线:74HC245双向收发器
- 地址总线:74HC573锁存器
- 控制信号:由FPGA生成
IDE接口:
- 使用FPGA实现PIO模式IDE控制器
- 支持最多两个IDE设备
- 40针标准IDE连接器
串口调试接口:
- MAX232电平转换芯片
- DB9连接器
- 波特率支持9600-115200bps
4. 固件与软件环境构建
4.1 BIOS开发
BIOS是硬件与操作系统之间的桥梁,我选择基于SeaBIOS进行定制开发:
-
硬件初始化:
- CPU模式设置
- 内存控制器配置
- 中断向量表建立
-
设备枚举:
- 检测IDE设备
- 初始化VGA控制器
- 配置串口调试输出
-
引导加载:
- 支持从IDE设备加载MBR
- 实现INT 13h磁盘服务
4.2 操作系统安装
在硬件和BIOS就绪后,我们需要安装Windows 95:
-
准备工作:
- 准备一个CF卡作为IDE硬盘
- 使用DOS 6.22启动盘进行分区和格式化
-
安装步骤:
- 从DOS环境运行Win95安装程序
- 选择"最小化安装"以节省空间
- 安装标准VGA驱动程序
-
优化配置:
- 禁用不必要的服务和启动项
- 配置虚拟内存
- 安装必要的DOS驱动程序
5. 调试与优化技巧
5.1 硬件调试方法
在构建这样的复杂系统时,调试是不可避免的。以下是我总结的几个有效方法:
-
分阶段验证:
- 先验证CPU最小系统
- 然后添加内存子系统
- 最后集成外设
-
调试工具:
- 逻辑分析仪:用于捕获总线信号
- 示波器:检查时钟和电源质量
- 串口调试:输出系统状态信息
-
常见问题:
- 电源噪声:增加去耦电容
- 信号完整性:注意走线长度匹配
- 时序问题:调整等待状态
5.2 性能优化技巧
为了让Win95运行更流畅,可以考虑以下优化:
-
内存配置:
- 尽可能增加物理内存
- 优化BIOS内存检测例程
-
磁盘访问:
- 使用CF卡代替机械硬盘
- 实现DMA传输模式
-
图形加速:
- 优化VGA绘图算法
- 实现硬件光标支持
6. 项目扩展与进阶方向
完成基础系统后,可以考虑以下几个扩展方向:
-
音频子系统:
- 添加Yamaha OPL3芯片
- 实现Sound Blaster兼容性
-
网络功能:
- 添加NE2000兼容网卡
- 支持TCP/IP协议栈
-
3D加速:
- 设计兼容Glide API的扩展卡
- 实现基本的3D渲染管线
这个项目最让我惊喜的是,通过亲手构建每一个子系统,我对现代计算机架构有了更深入的理解。那些在教科书上看似抽象的概念,如保护模式、内存分页、中断处理等,在实践中变得具体而生动。虽然过程中遇到了无数挑战,但每次解决一个问题后的成就感,都让我觉得这些付出是值得的。
