仅用 TTL 门电路从零构建文本模式显卡:分频器设计与字符映射参数
剖析 Leoneq 的 iNapGPU 项目,详解如何用 21 片 TTL 芯片实现 800x600@60Hz 文本显卡,提供分频器、字符生成与抗噪调试的可落地参数。
在软件定义一切的时代,Leoneq 的 iNapGPU 项目逆流而上——仅用 21 片 TTL 逻辑芯片,不依赖任何微控制器或 FPGA,从零构建出支持 800x600@60Hz 的文本模式显卡。这不仅是一次复古硬件工程的致敬,更是一堂关于数字电路底层原理的实践课。本文将聚焦其核心设计:分频器电路优化、字符生成架构与工程调试参数,为你提供一份可复现的硬件清单与调试指南。
1. 项目动机与规格:为何选择“世界第二差”方案
iNapGPU 的灵感源自 Ben Eater 的“世界最差显卡”,但 Leoneq 的目标更激进:构建一个真正能驱动 VGA 显示器、支持标准分辨率的纯 TTL 显卡。其规格参数直指实用边界:物理输出 800x600@60Hz(有效显示区 400x300),支持 50x18 字符布局,字符集容量达 255 个并可通过 2-bit 选择 4 个不同字库(如拉丁字母、波兰语字符、星际标准字母)。整个系统仅使用 2 个计数器、若干 NAND/NOT 门、1Mbit EPROM 与 2kB SRAM,通过并行接口与 Arduino 或 Z80 微处理器通信。作者自嘲“这是个糟糕的主意,应该用 FPGA”,但正是这种“徒手造轮子”的精神,揭示了现代 GPU 底层时序与内存管理的本质。
2. 分频器电路设计:用 12MHz 计数器“超频”生成 20MHz 像素时钟
VGA 信号的核心是精确的时序控制。标准 800x600@60Hz 模式要求像素时钟为 40MHz,但 Leoneq 巧妙地将需求减半:通过仅在水平扫描的“有效像素期”输出信号,将实际像素时钟降至 20MHz。这一设计的关键在于分频器——他选用了 CD4040 12 位二进制计数器,但面临一个硬伤:该芯片标称最大工作频率仅 12MHz(@15V)。解决方案是“超频”:在 5V 供电下强行驱动至 20MHz。作者坦言“不保证对你有效”,并建议使用多个 4 位计数器级联以保稳定。
更精妙的是同步信号生成。传统设计需比较完整 12 位计数器值,但 Leoneq 仅比较“个位”(最低有效位),利用 RS 触发器的边沿触发特性:当计数器达到 528(行周期结束)时,通过 NOT 门将高电平复位信号送入触发器,生成 HSYNC 脉冲。垂直同步(VSYNC)采用相同逻辑,由另一 CD4040 计数行数。这种“部分比较”设计大幅减少门电路数量,代价是计数器会多次触发同一事件——但因触发器仅响应边沿,实际输出无影响。最终,水平计数器运行在 37.87kHz,垂直计数器锁定 60Hz,完美匹配 VGA 时序。
3. 字符生成与显存架构:EPROM/SRAM 协同的“字符-像素”转换
显卡的核心功能是将字符代码转换为像素矩阵。iNapGPU 采用两级存储架构:SRAM 存储当前屏幕的 900 个字符代码(50x18),EPROM 存储字符字模(glyph)。地址映射是关键:EPROM 的 20 根地址线中,高 8 位来自 SRAM 读出的字符码,中间 4 位为行号(0–15,定义字符高度),低 3 位为列号(0–7,定义字符宽度),最低 2 位选择字库页。这样,每个字符被分解为 16x8 像素矩阵,通过时序电路逐行扫描输出。
数据总线的管理是另一难点。为避免 SRAM 写入与 EPROM 读取冲突,Leoneq 使用 74LS245(双向总线收发器)和 74LS244(单向缓冲器)隔离总线。写入时,缓冲器阻断 EPROM 访问;读取时,收发器将 SRAM 数据送入 EPROM 地址线。一个已知缺陷是:写入期间屏幕会轻微闪烁,因电路无法同时读写。作者建议未来改用 74LS373 锁存器暂存字符码,可彻底解决此问题——这恰是现代 GPU 显存控制器的雏形。
4. 工程落地参数与调试清单:从面包板到抗噪实战
复现 iNapGPU 需严格遵循以下参数与调试步骤:
- 关键 IC 清单:2x CD4040(计数器),4x 74LS00(NAND),2x 74LS02(NOR),1x 74LS04(NOT),2x 74LS74(D 触发器),2x 74LS244,2x 74LS245,1x M27C1001(1Mbit EPROM),1x HM6116(2kB SRAM)。总计 21 片。
- 时钟与电源:主时钟 20MHz(可由 40MHz 晶振分频),所有 IC 供电 5V±5%。CD4040 超频需实测稳定性,建议备选 74HC4040(高速 CMOS 版)。
- 抗噪调试:电路对电磁干扰极度敏感。作者报告 USB 线或示波器探头靠近即导致图像扭曲。解决方案:1) 所有电源引脚并联 100nF 陶瓷电容;2) 信号线尽量短,避免平行长走线;3) 使用屏蔽线连接 VGA 接口;4) 远离开关电源与电机设备。
- 字符生成校准:EPROM 烧录需严格对齐字模格式(每字符 16 字节,每字节 8 像素)。提供 Arduino 测试代码可验证字符映射,若出现乱码,检查 SRAM 地址线焊接或 EPROM 页选择信号。
已知异常包括背景杂线(疑似地线环路)、字符边缘模糊(EPROM 访问时序抖动),作者计划用新示波器定位。尽管不完美,iNapGPU 证明了纯 TTL 电路的惊人潜力——它不仅是硬件爱好者的玩具,更是理解计算机图形学底层的绝佳教具。下一次当你调用 OpenGL 时,不妨想想那些在面包板上跳动的 TTL 门电路,它们才是真正的“第一性原理”。