当大多数电子爱好者仍在使用微控制器或现成逻辑芯片构建项目时,一位工程师选择了一条截然不同的道路 —— 用 2458 个离散 MOSFET 构建一个完整的 Tic-Tac-Toe 游戏系统。这个名为 "Fets & Crosses" 的项目不仅实现了人人对战和人机对战模式,还能够检测所有可能的获胜或平局状态,并具备移动验证功能。从逻辑仿真到硬件实现,整个工程展现了硬件级电路设计的完整思考过程。
系统架构与设计方法
整个系统的核心设计思路与实际 IC 设计流程高度相似。设计者首先在 Logisim 图形化逻辑仿真器中验证了游戏逻辑的正确性,随后将设计拆分为两个独立的 PCB 模块:主电路板和游戏引擎板。主电路板包含用户界面、电源管理、基于 555 定时器的时钟源以及除引擎外的所有逻辑电路。引擎板则专门实现人机对战所需的决策逻辑,通过排针连接到主电路板。
在逻辑层面,系统仅需 19 个触发器即可完整存储游戏状态 ——18 个触发器记录 3×3 棋盘的当前局面,1 个触发器追踪当前活跃的玩家。这种极简的状态存储方式为后续的硬件实现奠定了基础。设计者初步估算,如果使用 CMOS 工艺实现全部逻辑,整个系统大约需要 2000 个晶体管,这一数字最终被精确锁定在 2458 个。
游戏引擎的设计经历了从 ROM 查表到纯组合逻辑的演进。最初的实现使用并行输入输出的 ROM 作为大型查找表,将当前棋盘状态作为 18 位地址输入,从内存中读取引擎的落子位置。然而这种实现方式效率极低 —— 因为在所有可能的输入组合中,只有不到 5% 对应实际有效的游戏状态。随后设计者将其替换为纯组合逻辑门实现的模块,该模块同样能够实现完美棋力。组合逻辑引擎仅需 64 个决策门即可确保系统永不失败,每个决策门硬连线检测特定的棋局条件。
决策门实现原理
Tic-Tac-Toe 的完美棋力可以通过一系列优先级递减的 if-else 逻辑实现。在硬件层面,这种逻辑被转化为 64 个级联的决策门,每个门检测一个特定的棋局条件。当某个条件满足时,该决策门激活并产生落子信号,同时通过 block 输出禁止后续决策门激活。这种级联结构确保了决策的优先级顺序。
决策门按照以下优先级依次实现:首先检测是否能通过完成行、列、对角线获胜(24 个门);其次检测是否需要阻挡对手完成行、列、对角线(24 个门);然后防止对手形成双威胁(3 个门);接着占据中心位置(1 个门);如果对手占据了角位且对角角位为空则占据对角角位(4 个门);如果角位为空则占角(4 个门);最后占据边线位置(4 个门)。由于在 CMOS 中构建非反相逻辑需要更多晶体管,设计者采用低电平有效的反相输入信号,通过 NAND 和 NOR 门减少晶体管使用量。
这个 64 门的决策引擎及其支持逻辑(游戏状态反转、特定落子输出的或运算)共使用 1074 个晶体管,实现了完全组合逻辑的完美 Tic-Tac-Toe 引擎。设计者使用 Python 脚本让程序与引擎对弈所有可能的 Tic-Tac-Toe 局面,确认引擎从未输掉任何一局。
硬件实现与 PCB 设计
电路实现采用了与实际 IC 设计高度相似的工作流程。设计者在 KiCad 中首先创建了一套基础逻辑单元库,每个单元放置在独立的设计表 Sheet 中。例如,一个简单的 NOT 门包含特定尺寸的 MOSFET 布局。然后通过层次化原理图方式组合这些基本单元构建更复杂的逻辑门 —— 例如一个 2 输入 AND 门由一个 NAND 门和一个 NOT 门组成。
PCB 布局采用曼哈顿风格布线,这是一种在 IC 设计中常用的布线策略。顶层 PCB 用于所有晶体管封装和垂直走线,底层用于水平走线。这种分层策略简化了布线复杂度并提高了可维护性。两个 PCB 均为双层板,通过这种结构化的布线方法完成了整个系统的电气连接。
在晶体管选型方面,设计者采用了非常实用的成本优化策略 —— 从 LCSC 网站按价格排序选择最便宜的 MOSFET 型号。这种看似随意的选择方法实际上反映了实际工程中的成本考量,只要器件参数满足电路需求即可。最终选定的 MOSFET 型号被系统性地用于构建所有需要的逻辑门类型。
工程挑战与测试验证
手工焊接 2458 个 MOSFET 本身就是一个巨大的挑战。设计者为此专门制作了一个真空拾取放置笔,可以将元件从卷盘快速转移到电路板上。由于所有晶体管在 PCB 上采用相同的排列方向,这个工具显著提高了组装效率。然而即使有了这个工具,项目仍然经历了三个版本迭代才最终稳定工作。
前两次迭代的失败原因在于手工焊接过程中的不均匀加热导致 PCB 产生显著翘曲,数周后焊点因应力而开裂。最终设计者投入资金委托工厂完成了五个引擎板和主电路板的批量组装,确保了机械可靠性和电气稳定性。
作为最终验证步骤,设计者实现了一个基于 STM32 的小型测试平台,将引擎连接到 PC 端。配套的 Python 脚本遍历了所有可能的 Tic-Tac-Toe 局面与引擎对弈,验证了引擎在每种情况下都能保持不败。这个自动化测试框架不仅验证了硬件的正确性,也展示了如何对硬件逻辑进行完整的功能验证。
工程化参数与实践要点
从该项目可以提取以下可复用的工程实践参数:在 CMOS 逻辑门设计中,NAND 和 NOR 门比 AND、OR 门更节省晶体管;19 个触发器可存储完整的 3×3 棋盘状态加玩家轮换信息;64 个优先级决策门即可实现 Tic-Tac-Toe 的完美棋力;组合逻辑引擎使用约 1074 个晶体管即可达到永不失败的智能水平。PCB 设计中的曼哈顿式布线策略适用于双层板的模块化设计。测试验证应覆盖所有可能的输入状态,对于 Tic-Tac-Toe 这类状态空间有限的游戏,完全遍历验证是可行的。
该项目虽然并非追求最高效率或最优雅的实现,但其完整展示了从逻辑设计到硬件实现的完整工程链条 —— 包括仿真验证、原理图绘制、PCB 布局、晶体管选型、手工或自动化组装以及完整的功能测试。这种全流程的硬件工程实践,对于理解数字系统底层原理和积累硬件设计经验具有重要的参考价值。
资料来源