考虑制作 GPU 时从哪里开始?

电器工程 显卡
2022-01-14 15:40:32

前几天我看到了这个视频,它让我开始思考如何设计和设计像 GPU 这样的东西。你会从哪里开始?我更感兴趣的是阅读它们是如何工作的,而不是用 TTL 制作一个(无论如何)。

我知道这听起来像是一个“你如何制作编程语言”的问题,但任何起点都会很好,因为我不知道从哪里开始寻找。

4个回答

这有点像去参加科学课的拼贴期末考试,然后把这个作为你的问题:描述宇宙。简明扼要。没有办法以任何实际的方式回答这个问题——所以我将回答一个不同的问题。

在尝试设计 GPU 之前,我需要了解哪些事情?

按大致的时间顺序,它们是:

  1. VHDL 或 Verilog。
  2. FPGA(用于编写数字逻辑的有用区域)。
  3. 基本数据路径的东西,比如 FIFO。
  4. 总线接口,例如 PCIe 和 DDR2/3 接口
  5. 数学函数的二进制实现,包括浮点数等。
  6. 中央处理器设计。
  7. 视频接口标准。
  8. 高速模拟的东西(高速数字的模拟端)
  9. PLL 和其他半高级时钟的东西。
  10. 高速电路的PCB设计。
  11. 低压、大电流 DC/DC 转换器设计。
  12. 很多很多软件的东西。
  13. 最后,ASIC 或其他定制芯片类型设计。

我也敢说你不会用 TTL 逻辑芯片做这种事情。我怀疑您能否获得与普通 TTL 芯片一起使用的合理 DDR2/3 内存接口。使用大型 FPGA 会容易得多(但不容易)。

达到第 6 步可能“足以满足你的智力渴求”。这也可以在合理的时间内完成——大约一年——作为一个短期目标。

编辑: 如果您只想吐出视频信号,那么这相对容易。本质上,它是一块内存,以 60 赫兹的频率移出到显示器上。魔鬼在细节中,但这里是如何做到这一点的粗略概述:

从一些双端口 RAM 开始。它不必是真正的双端口 RAM,只需一些 CPU 可以读/写并且您的视频电路可以读取的 RAM。此 RAM 的大小和速度将取决于您所驾驶的显示器类型。我个人会使用连接到 Xilinx Spartan-6 FPGA 内存接口的 DDR2 SDRAM。他们的“内存接口生成器”内核 (MIG) 可以很容易地将其变成双端口 RAM。

接下来,设计一个电路来控制如何读取这个 RAM,并将这些数据输出到一个简单的总线上。通常,您只需按顺序读取 RAM。“简单巴士”真的就是这样。它是一些带有像素值的位 - 就是这样。该电路还需要做两件事:必须在每个视频帧返回到 RAM 的开头,并且必须在水平/垂直回扫期间“暂停”输出。

第三:制作一个输出视频控制信号(HSync、Vsync等)的电路,并告诉前一个电路何时暂停和重启。这些电路实际上很容易做到。恕我直言,找到合适的视频标准更难。

最后:将控制信号和视频像素数据总线连接到“某物”。那可能是一个小型彩色液晶显示器。它可能是用于输出 VGA 兼容信号的视频 DAC。有可以接收这些信号的 NTSC/PAL 编码器。等等。

如果分辨率真的很小,您可能会使用 FPGA 的内部 RAM 而不是外部 DDR2 SDRAM。我应该警告你,如果使用 DDR2 SDRAM,那么你可能需要一个 FIFO 和其他一些东西——但这也不是很困难。但是使用 DDR2 SDRAM,您可以支持相当高分辨率的显示器。您还可以找到具有集成 VGA DAC 和其他形式的视频输出的 FPGA 开发板。

Racing the Beam详细介绍了 Atari VCS 的设计和操作。它对电视接口适配器进行了彻底的处理。

TIA 是关于最简单、实用的 GPU。

了解一个小而完整的工作系统可能是学习新学科的好方法。

提供完整的原理图技术手册

如果您只是想在屏幕上放一些东西,并且认为您可能真的非常喜欢布线,那么您可以瞄准 1980 年代早期的字符图形系统。如果你能赶上 RS-170A 的时机,你甚至可以将信号推送到 50 英寸等离子电视上的备用 AV 输入中,并在很大程度上复古。

一些早期的系统使用它们的 8 位 CPU 直接生成显示,例如 Atari 2600 中的 6507 和 Timex Sinclair ZX-81 中的 Z-80。你甚至可以用现代微控制器做同样的事情。这种方式的好处是硬件简单,但软件一般都要汇编,而且要求很高,结果真的很差劲。可以说 2600 使用了额外的硬件,但 TIA 没有太多的 FIFO,并且 6502(实际上是 6507)必须实时向其转储字节。在这种方法中,没有标准的视频模式;每个使用视频的应用程序都必须与保持像素流动的需求密切结合。

如果你真的想用 TTL 构建一些东西,下一个复杂级别将是基于字符 ROM 的文本显示。这允许您将任何,例如 256 个字符放在任何例如 40 列和 25 行位置中。有几种方法可以做到这一点。

一种方法 - 做我所做的 TRS80 模型。一组带有各种门的 74161 个计数器生成了视频地址;三个 74157 将 CPU 地址的 12 位与视频地址复用,以将地址提供给 2K 静态 RAM。RAM 数据被缓冲回 CPU,但未缓冲作为地址馈送到字符集 ROM。没有总线仲裁;如果 CPU 需要视频 RAM,视频系统就会被踩到,从而产生“雪花”效果。混合的视频地址与计数器部分的一些行相结合,以完善低地址;字符 ROM 输出被转储到 74166 移位寄存器中。整个事情都从一个 14.31818MHz 晶体中分离出来。在这种方法中,您将拥有完全在硬件中实现的一种视频模式,例如 40x25 或 64x16 等,

另一种方法 - 挖掘一个所谓的 CRTC 芯片,如 6845。它们结合了大部分计数器和胶合逻辑,并为处理器提供了一个控制寄存器接口,这样你就可以重新编程一些时序。像这样的系统可以变得更加灵活,例如,您可以在寄存器控制下从相同的硬件中获得 40x25 和 80x25。如果你对时钟频率很了解,你可以让你的 CPU 在一半时钟内自由访问视频 RAM,而在另一半时钟内访问视频地址生成器,从而避免总线仲裁的需要消除雪效应。

但是,如果您想使用真正的图形模式,您很快就会发现自己滚动是有问题的。最初的 Apple 2 管理它,但该系统中有类似 110 个 MSI TTL 芯片的东西,即使如此,也有一些有趣的事情需要处理,比如视频缓冲区到显示器的非线性映射,以及极其有限的调色板,仅举两个。沃兹被普遍认为是有线索的。到“2e”出现时,Apple 已经将视频系统放入定制芯片中。大约在同一时间推出的 C-64 将其图形功能归功于定制芯片。

所以..我会说有两种方法可以做到这一点。一种方法 - 拿出你的旧 TTL 桶并渴望80x25 的单色文本显示;另一种方式 - 给自己一个好的 FPGA 评估板,用 VHDL 完成整个事情,然后80x25 文本显示开始。

您需要从一些计算机体系结构基础开始,同时开始使用 VHDL 或其他描述语言进行基本 ASIC 设计。

一旦您了解了计算机体系结构的基础知识,我建议您尝试使用计算机图形学,也许从一些简单的 OpenGL 项目开始。这里的主要内容是了解图形管道渲染架构

下一步将考虑如何使用专用硬件而不是软件来完成此渲染管道。

就实际构建 GPU 并将其连接到您的计算机而言,我认为这在发烧友的预算下是不可行的,但也许您可以尝试使用嵌入式 ARM-linux 平台(其中公开一个系统总线)和一个 FPGA(在这种情况下,FPGA 是你用 VHDL 编写的 GPU)作为一个整体项目输出到低分辨率 VGA 显示器。这也需要编写驱动程序。如果你能做到,那将是简历上的杀手锏。