202509
systems

纯 TTL 逻辑门构建字符生成器:地址译码与时序抗噪设计

剖析用 TTL 门电路实现文本模式显卡的字符地址生成机制,给出 EPROM 译码、行/列计数器组合与噪声抑制的可操作参数。

在 FPGA 与专用 GPU 主导图形处理的今天,用纯晶体管-晶体管逻辑(TTL)门电路从零构建一块能驱动 VGA 显示器的文本模式显卡,无疑是一种“自虐式”的复古工程实践。iNapGPU 项目正是这样一个典型案例——它仅用 21 个 TTL 芯片,实现了 800x600@60Hz 分辨率下 50x18 字符的稳定输出。其核心挑战不在于复杂的图形渲染,而在于如何用最原始的数字逻辑,精确控制字符的生成、定位与同步。本文聚焦于字符生成器的核心子系统:字符地址译码电路,剖析其如何将屏幕坐标与字符码组合成 ROM 查表地址,并给出关键时序参数与抗噪设计清单,为类似复古硬件项目提供可落地的参考。

字符生成的本质,是在正确的屏幕像素位置,输出正确的字符点阵。iNapGPU 的方案是:用一块 1Mbit 的 UV EPROM(如 M27C1001)存储最多 4 个字符集,每个字符集包含 255 个字符,每个字符由 8x8 或类似尺寸的点阵定义。要从这块 ROM 中读出某个字符的某个点,需要一个 17 位的地址:低 8 位是字符码(来自显存 SRAM),中间 4 位是字符行号(0–7),再高 3 位是字符列号(0–7),最高 2 位用于选择字符集。这个地址的生成,完全由 TTL 逻辑动态拼接而成,是整个系统最精妙的“大脑”。

首先,字符码的来源是显存。iNapGPU 使用一块 2kB 的 SRAM(如 HM6116)存储屏幕上 900 个字符(50 列 x 18 行)的 ASCII 或自定义编码。这块 SRAM 的地址,由主时序电路中的行、场计数器经简单换算后提供——例如,当前扫描到屏幕第 N 行第 M 列像素时,需计算出该像素属于第几行字符、第几列字符,从而得到 SRAM 地址,读出该位置的字符码。这个计算过程,通常由一组 TTL 计数器(如 CD4040)和少量译码逻辑(如 74LS138)完成,确保在每个像素时钟沿,都能稳定输出正确的字符码。

其次,是字符内部的行/列计数器。当一个字符被选中后,需要逐行、逐列地扫描其 8x8 点阵。这需要两组独立的 3 位和 4 位计数器(同样可由 CD4040 或 74LS161 实现),它们的时钟与像素时钟同步。行计数器在每完成一行字符(即 8 个像素时钟)后递增,列计数器则在每个像素时钟递增,并在达到 7 后复位,同时触发行计数器进位。这两组计数器的输出,直接作为 ROM 地址的中间 7 位。关键参数在于复位与进位的时序:必须确保在列计数器从 7 跳变到 0 的瞬间,行计数器能可靠地加 1,且无毛刺。这通常通过将列计数器的最高位(Q3)连接到行计数器的时钟使能(EN)端来实现,并加入一个由 NAND 门构成的同步清零电路,确保复位信号与时钟边沿对齐。

最后,是地址的拼接与字符集选择。字符码(8 位)、行号(4 位)、列号(3 位)和字符集选择(2 位)这四部分,需通过 TTL 总线驱动器(如 74LS245)或直接连线,组合成 17 位并行地址,送入 EPROM。这里的风险在于总线竞争与信号完整性。iNapGPU 作者提到曾错误地使用 74LS245 缓冲器连接 SRAM 与 EPROM,导致总线冲突;正确的做法是使用锁存器(如 74LS373)在地址稳定后锁存字符码,再与动态变化的行/列计数器地址合并。字符集选择通常由微控制器(如 Arduino)通过 GPIO 设置,经 TTL 缓冲后输入 EPROM 地址线。

整个字符生成过程高度依赖精确的时序。iNapGPU 采用 20MHz 像素时钟,这意味着每个像素的处理时间仅有 50ns。所有地址生成逻辑必须在此窗口内稳定输出,否则将导致字符撕裂或错位。主要时序风险来自计数器的传播延迟和组合逻辑的冒险竞争。根据 TTL 门电路特性(如 74LS 系列典型传播延迟 10–15ns),建议为关键路径(如行/列计数器进位)预留至少 20ns 的建立时间裕量。具体操作是:确保驱动计数器时钟的前级逻辑(如像素时钟分频器)输出干净、无过冲,且走线尽量短。

更大的挑战是噪声抑制。iNapGPU 作者明确指出,电路对环境噪声极度敏感——USB 线缆或示波器探头靠近都可能引起图像扭曲。这是因为 TTL 电平(高电平 2.7V,低电平 0.4V)的噪声容限仅约 0.4V,且高速数字信号易受电磁干扰。对抗噪设计,可归纳为三点:第一,电源去耦,在每个 TTL 芯片的 VCC 与 GND 引脚间并联 0.1μF 陶瓷电容,滤除高频噪声;第二,关键信号线(如时钟、复位、地址总线)采用单点接地,并远离模拟 RGB 信号线;第三,对长距离走线(如从计数器到 ROM 的地址线),串联 22–47Ω 小电阻以抑制反射。若条件允许,将整个电路置于金属屏蔽盒内,并使用带磁环的 VGA 线缆,可进一步提升稳定性。

尽管作者自嘲这是“糟糕的主意”,并建议“用 FPGA 代替”,但 iNapGPU 的价值恰恰在于其纯粹性。它用最基础的 TTL 门,实现了现代 GPU 中由复杂 IP 核完成的字符光栅化功能。其字符地址生成电路的设计,是数字逻辑与时序控制的绝佳教学案例。通过精确控制计数器、合理分配地址位、严格管理总线时序与电源噪声,我们得以在 21 个芯片的限制下,让 VGA 显示器稳定输出文字。这不仅是对复古技术的致敬,更是对“计算机图形学始于字符”这一本质的深刻回归。对于硬件爱好者而言,理解并复现这一设计,远比调用一个 GPU API 更能触及图形系统的灵魂。