欢迎回来
登录你的知识库账户
忘记密码?
还没有账户?立即注册
创建账户
注册你的专属知识库
已有账户?去登录
找回密码
输入注册邮箱获取验证码
返回登录
请输入图片中的验证码以继续注册
加载中...
取消
新建收藏
手动添加你喜欢的内容
取消
编辑头像与昵称
上传新头像或修改你的显示昵称
支持 JPG/PNG,最大 2MB
取消

问题反馈

notebasewww.notebase.cn
控制台
内容库
动态
管理
账户
U
用户
--
在线
v0.8.7 · 知识库
笔记
KnowledgeBase
网络无边,知识有迹。
0笔记
0工具
30推荐

分类导航

按主题直达

编辑精选

站内用户贡献 · 真实笔记

最新收录

每日更新
继续浏览全部内容 →
>
笔记
0
加载中...
工具
0
此页用于记录用户反馈问题后的每一次改进
笔记用法

“写笔记”支持四种格式——Word 文档、Excel 表格、Markdown、纯文本,起稿或二次编辑时都能随时切换,同一篇笔记想用哪种形态来记,都由你说了算。

md、txt、csv、json 这类纯文本则原样载入,不做多余加工。拿一张现成的表倒进来、改几笔、再导出去,等于白用一台免费的格式转换器。

要带走就在右上角点“下载”,可导出 PDF、Word、Markdown、Excel、TXT 等格式;列表卡片“⋯”菜单里,也有同样的下载入口。

工具用法

在“工具”页点“+ 上传工具”即可发布:填好名称与链接,再用 Markdown 把使用方法写清楚——能解决什么问题、怎么装、怎么用,比堆介绍实在。

要分发安装包就一并上传压缩包(ZIP、RAR、7Z、TAR.GZ,最大 35MB),别人在详情页一键下载;只放链接不带附件也可以。

工具按大家的收藏热度排序,好用的自然会被顶上来。发布后可在详情页或卡片菜单里编辑、下架。

隐藏笔记

写笔记时勾上“隐藏”,这篇就只存在于你自己的账号里:不进列表、不进搜索、不上首页精选,也不会出现在任何公开的页面,链接发给别人同样打不开。

适合放密码、草稿、日记这类只给自己看的内容;想公开,去“发布”打开它,把“隐藏”的勾去掉再保存,之后编辑会默认保持原状态,不会悄悄变回公开。

数据安全

你的内容会同时保存在多个副本上,系统定期做备份与完整性校验,再配合异地容灾机制:就算某台机器出问题,数据也不会丢,可以长期放心存放;特别重要的资料,仍建议你另外再留一份备份。

技术

全站跑在容器化、模块化的现代架构上,更新、部署、回滚都很快,扩展性和稳定性都按长期运营的标准来设计(Built for reliability, designed to scale)。

理念

这个网站最早只是一个人的笔记仓库,后来慢慢长成现在的知识中枢。设计上很克制——没有广告、没有追踪、没有推荐算法,只是干干净净地存放一些东西;既然做好了,就公开出来,万一有人用得上呢。

原则

不做大而全,不做平台梦,保持简单、保持克制、保持好奇。所有内容都由用户贡献、由用户维护:不会突然冒出付费墙,不会在角落塞广告位,也不会把你的数据卖给第三方。

更多

产品会持续迭代,站内日志页记录着每一次改动,改了什么都有迹可循;想了解这个站是怎么一步步走到今天的,翻翻日志就能看到来龙去脉。

举报

如果在这里看到涉嫌违规的内容,点对应卡片右侧的“举报”按钮就能提交,我们会尽快核实处理;也谢谢你花一点时间,一起把这里维护干净。

趋势
// 点击导航加载发现
归档
// 归档为空
最近浏览
// 暂无浏览记录
发布
// 加载中...
用户发布
// 加载中...
用户管理
// 加载中...
访问统计
// 加载中...
内容审核
// 加载中...
个人信息
// 加载中...
返回首页

自制复古游戏主机:从零到可玩的家酿电子工程

1970/1/1机械电子

一位软件工程师从零开始自制了一台具有复古风格(NES/SNES之间)的游戏主机,采用双单片机模拟PPU/VPU、Z80 CPU、PAL输出和SD卡加载游戏,展示了完整硬件与固件设计过程。

自制视频游戏主机:一位软件工程师的复古硬件之旅

引言

这篇文章是 Sérgio Vieira 分享的“家酿”(homebrew)视频游戏主机项目介绍。整个项目从零开始,没有使用现成的游戏芯片,而是用分立元件和微控制器搭建了一台独特的、可玩游戏的硬件主机。作者出生于80/90年代的葡萄牙,受第三、四代主机(NES、SNES、Master System、Mega Drive)的深刻影响,决定在业余时间自学电子学,打造属于自己的游戏机。

作者的背景:职业是软件工程师,几乎没有电子经验(除了组装电脑外),通过买书和套件自学。最终成功构建了这台主机,并在此文中详细解析了硬件架构、图形系统、CPU设计和固件实现。

设计目标与核心特性

作者在项目启动时设定了明确的设计目标,这些目标贯穿了整个项目:

  1. 无模拟:所有游戏必须在真实硬件上运行(不要求使用当年的老芯片,只要求性能恰好够用)。
  2. 专用复古CPU:采用 Zilog Z80。
  3. 模拟电视输出:输出 PAL 制式的模拟 RGB 信号。
  4. 音频能力:能够发出声音。
  5. 双控制器支持:支持两个游戏手柄。
  6. 滚动背景与精灵:必须支持马里奥式横版游戏所需的图形能力(以及更多类型)。
  7. SD卡存储游戏:不使用卡带,而用 SD 卡分发程序,便于从 PC 复制文件。卡带方案需要为每个程序制作额外的硬件——这不现实。

这个目标矩阵在后续的系统架构中几乎被逐条实现,非常值得留意。

视频信号:软件位冲 PPV 的诞生

视频信号是整个项目最先攻克的难点。那个时代的主机都使用完全不同的专用图形芯片,因此设计者并不想采用任何现成方案,而是希望拥有自有的图形特性。但因为无法流片,也不会 FPGA,作者选择用软件方式驱动一颗 20 MHz 的 8位微控制器(Atmega644)来生成 PAL 视频信号。

由于微控制器原生不支持 PAL 协议,他采用 bit banging 方式直接操纵引脚,模拟输出视频时序。视频信号格式为 8位 RGB332(R=3位,G=3位,B=2位),再通过被动 DAC(电阻网络)转换为模拟 RGB,最后通过 SCART 接口输入电视(那是葡萄牙非常普遍的电视输入方式)。

图:用 Atmega644 直接产生 PAL 信号,附有必要的时序控制。

图形系统:双缓冲与双 MCU 架构

为了不让视频信号生成处理器(他们称之为 VPU,Video Processing Unit)同时去计算图形,作者引入了 双缓冲 机制:

  • PPU(Picture Processing Unit,图形处理单元):另一颗 Atmega1284(也是 20 MHz)负责生成图像内容,写入 VRAM1(或 VRAM2)。
  • VPU:专门负责把 VRAM 中的图像数据依次推出到电视上。

每一帧(在 PAL 下为 1/25 秒或两个半帧)完成后,VPU 和 PPU 交换使用的 RAM 芯片。例如:此刻 PPU 写入 VRAM2,而 VPU 把 VRAM1 的内容输出;下一帧交换。

这带来一个复杂问题:PPU和VPU都需要访问RAM,而微控制器访问外部 RAM 是位敲定制的(没有内存控制器)。因此,这块视频板不得不加入大量 74系列逻辑芯片(计数器、行选择器、总线收发器等),以实现总线仲裁和 RAM 的高效存取。

因此视频板的硬件相当复杂,固件(尤其 PPU 端)为了每帧绘制出期望的图像效果,需要在极短时间中高效地运行。最初作者用纯汇编编写 PPU/VPU 程序,后来部分移植到 C,但仍保留了高度性能导向的代码。

图形规格:224×192、精灵、虚拟屏与属性表

最终 PPU 生成的画面为 224×192 像素,稍低于同代主机的 256×224。降低分辨率让作者可以在每帧绘制周期内塞入更多图形特效。

该图形芯片采用经典“复古”特征:

背景:

  • 使用 8×8像素的字符/瓦片(tiles) 组成背景,屏幕背景为 28×24 块瓦片。
  • 同时支持 4 个虚拟屏幕,每个均为 28×24 瓦片,彼此连续且环绕(可以平滑实现逐像素滚动和背景无缝更新)。
  • 支持每行单独滚动方向/偏移,可产生有限的视差滚动或分屏效果。

精灵(Sprites):

  • 最多渲染 64 个精灵,每个可为 8×8 或 16×16(1、2 或 4 个瓦片)级别的大小。
  • 支持水平翻转、垂直翻转或双方向翻转。

Overlay 覆盖层:

  • 背景之上可显示一片 28×6 瓦片 的覆盖区域,适合静态HUD栏,在背景滚动时不需要只靠精灵来显示游戏提示文字。

属性表(Attribute Table):

  • 给每个瓦片赋一个 0~3 的属性值,然后 CPU 可以一次设置:将具有某属性的全部瓦片映射到某页,或一次性让它们的瓦片序号递增。
  • 典型应用:马里奥游戏中“闪动的?砖块”或瀑布的动态水流——不需要 CPU 逐帧重写所有瓦片,只需下发指令即可。

CPU:为何是 Z80?以及IO空间的优势

有了图形板之后,作者开始连接主 CPU。他选择了传奇的 Zilog Z80。这是极具时代感的 CPU,但作者特别点出了硬件层的深层原因:

  • Z80 有 16位存储空间(64KB)和 16位IO空间,二者独立。
  • 同期的著名 6502 只有 16位寻址空间,需要将内存、外部设备(如显示芯片)映射在同一地址空间中。
  • 因此 Z80 可最大程度利用 64KB 程序/数据内存,IO空间独立用于外部设备的访问。

CPU通过 EEPROM 启动并运行测试代码。另外作者制作了一个 IO 单片机(Atmega324,20MHz),通过 Z80 的 IO空间进行控制,并通过 RS232 连接 PC 调试,以验证 CPU 与线路的互通。该 IO 单片机将成为控制 SD 卡、游戏手柄以及未来音频等等外设的中枢。

架构总结与后续

文章发布了这个精心之作的第一部分总结,后面似乎还有细节待展开。而核心架构已经很清晰:
_CPU(Z80) ↔ EEPROM/内存 ↔ IO单片机(负责输入输出、SD卡、手柄) ↔ 视频板(PPU+VPU+VRAM双缓冲)_ → 电视。

这个系统没有仿真、没有现成的图形/声音芯片,而是以软件位传输的方式创新地实现了大量显示特性,并且配合 Z80 的强分离IO地址,构成了一个相当完整、深入的家酿游戏机系统。它可以真正在 PAL 电视上渲染滚动背景、精灵、覆盖层、属性变换,并读取 SD 卡中的游戏。

对一个原本只有编程能力的爱好者来说,这个项目的意义不只是“设备能跑”,而是从零消化了模拟电路、数字逻辑、信号时序和底层固件设计——把一本电子学教程变成了真实运行的游戏机。


原文链接:https://internalregister.github.io/2019/03/14/Homebrew-Console.html

编写使用方法
Markdown 格式 · Ctrl+Enter 确定
新建笔记
预览
数据表格
点击单元格编辑 · Tab 移动
A1fx
Sheet1
BIH1H2≡🔗</>
隐私提醒

取消
编辑工具
取消