疯狂的自制工程师Chris Fenton的站点上的一篇文章
与ZedRipper一起,这是一个由Z80处理器提供支持的以83 MHz运行的16核野兽,它实在不可行。 这是我最近为了娱乐而组装计算机的一次尝试,并且一次满足了几个愿望:
- 最后,使用巨大的FPGA,它闲置着。
- 发挥创建计算机的替代历史,从铁的角度解决多任务问题。
- 组装一台计算机,我可以在该计算机上编写上班途中有趣的简短程序。
- 组装一个平台,在该平台上可以进行相对简单的计算机体系结构实验。
迷人的照片
如果您没有时间阅读有关不切实际的计算机体系结构的文字...






那么这是什么野兽?

ZedRipper是尝试使用CP / M 2.2构建最酷的计算机的结果:
- 16个Z80处理器以83.33 MHz的频率运行。
- 每个Z80的64 KB专用内存。
- 具有16个输出的ANSI兼容终端加速器。
- 所有处理器和设备通过运行在83 MHz的完全同步单向环形网络连接。
- SD卡上有128 MB的驱动器(CP / M中有16 x 8 MB的驱动器)。
- 引导到CP / M 2.2并运行CP / NET文件服务器(在计算机本身上用Turbo Pascal 3编写!)的“服务器”内核,它提供对SD卡的共享访问。
- 15个“客户端”内核从ROM启动CP / NOS。 每个客户端都可以访问一个公共存储库,每个人都可以运行任何CP / M 2.2程序,而无需与其他内核争夺资源。
另一条路
是因为国际象棋和Planetfall使我从Turbo Pascal编辑器中分心了吗?在
将游戏移植到Kaypro的冒险之后,40年前,我对这个原始的操作系统产生了令人惊讶的热情印象,并且我有一个想法,我决定开发:如果故事朝相反的方向发展,并且PC可以继续运行,该怎么办?立即拥有多个CPU的开发路径? 即使在1980年代,处理器本身(以及随后的RAM)也相对便宜,但是PC多任务处理仅基于缩短时间的长度,即在竞争程序之间分配一种大资源(RAM或CPU)。 在我们进入386年代和内存超过4 MB的计算机时代之前,Iron无法解决这一问题(并且很难使程序在DOS等操作系统上正常运行)。
在我对计算机的历史爱好中,我遇到了一些非常有趣的事情:在开发的早期,
CP / M OS支持称为CP / NET的“网络”版本。 今天大多数人仍然知道她的想法-将一台或两台带有大型驱动器和打印机的“真实”机器放入办公室,其资源将在瘦客户机,具有CPU和RAM的终端之间共享。 每个用户的工作就好像自己拥有运行CP / M的计算机一样,并且可以访问大磁盘和打印机。
正如我所提到的,CPU和RAM(通常是Z80具有64 KB的DRAM)并不是特别昂贵,但是创建有用的计算机(驱动器,打印机,显示器等)所需的所有外部特权总计加起来了。 当时,向计算机添加多个CPU / RAM似乎是一种decade废的方法,可以为一个用户提供多个CPU和RAM。 甚至CP / M也已经采用了划分MP / M OS时间长度的方式。
我发现Exidy最接近这一点-1981年,他们发布了他们的Multi-NET 80机器,该机器最多可以添加16张卡,每张卡具有Z80和RAM。 但是,它设计用于最多16个个人用户,而不适合同时启动16个程序的单个用户。
太近了...快进40年-晶体管的价格实际上已经下降。 实验室关闭后,我继承了几个出色的FPGA(Stratix IV 530GX),我认为使用其中一个非常有趣。 在某个时候,我遇到了Grant Searle
Multi-Comp的一个非常有趣的项目,用CP / M和一个CPU组装一台工作机器非常容易。 但是我还需要更多。 我决定看看是否可以在CP / M上创建具有真正多任务处理能力的多核计算机-没什么棘手的问题,只是蛮力而已。
我们配置并启动软件
在这个项目中,我主要专注于硬件,没有在汇编器中编写任何代码。 CPU 0直接从我从Grant那里获得的ROM加载,其余节点从4KB CP / NOS ROM那里加载,而这是我从Atari模拟器获得的。
两个ROM都等待通过标准接口连接到串行终端,而CP / NOS客户端则希望将另一个串行端口连接到服务器。 在如此大的FPGA上设计自己的逻辑很容易。 我开发了地址解码逻辑,这使得每个CPU的Z形环在必要时出现在地址映射方案中。
里面

ZedRipper的核心是这些巨大的Stratix IV 530GX FPGA之一。 HSMC卡用于显示,从键盘控制器接收数据并连接到SD卡。 以太网用于下载固件,因此机箱侧面有一个这样的端口,以及一个SD卡适配器和一个用于外部串行端口(尚未使用)的插槽。
键盘和控制器
键盘和前景上的孔,稍后将在其中安装定位设备我有一个紧凑的PS / 2键盘(来自我的一个带有笔记本电脑的老项目),我想将其连接到我的FPGA的2.5 V I / O。 我决定采用简单的方法,并在捆绑包中添加Teensy 2.0微控制器。
键盘底部的热胶控制器这样就可以将PS / 2转换为ASCII,并且可以轻松地将一些附加键(F1-F12)标记为终端命令的“魔术”序列,以增加便利性。 然后,控制器以9600波特的速率为UART提供Z80字节(使用一个简单的分压器,对于FPGA,分压器将5 V变为2.5 V)。 鉴于该项目是由我车间内的各种垃圾组装而成的,因此它是一种便捷的解决方案,在工作中表现出了出色的性能。
展示架
加载屏幕,服务器在左上角运行,并且三个不同的用户程序在单独的内核上工作显示功能:1280×800 10.1英寸,并且支持VGA。 FPGA使用简单的电阻器网络来提供多达64种颜色(R2G2B2)。 该显示器需要一个83.33 MHz(1280×800 @ 60Hz)的计时器,因此为简单起见,整个电路都在该频率下工作。
Grant的项目Multicomp具有用于简单ANSI兼容终端的VHDL代码。 我在Verilog上重写了其逻辑,然后开发了一种视频控制器,该控制器支持通过一个Z环节点连接的16个独立终端。 1280×800的显示被认为是160x50字符(使用8x16字体)的显示,并且每个终端都可以用作80x25的“精灵”,可以将其移动到屏幕上的任何位置(具有调整终端渲染顺序的优先级列表)。 由于每个终端都独立于其他终端进行操作,因此它具有自己的状态机,其中2 KB的RAM用于字符和2 KB的“属性”(用于存储颜色信息)。 每个字符都支持4位背景和字符颜色。 由于所有终端必须具有相同的缩进字符,并且一个8x16单元只能包含一个字符,因此所有终端可以使用相同的2 KB ROM,其中包含一种字体。 通常,显示逻辑使用大约66 KB的Block RAM。
通常,我为CP / M终端获得了一个非常简单的窗口管理器,由于硬件的缘故,它几乎可以完全正常工作。 这是最丰富的研究领域之一-到目前为止,只有服务器CPU才可以重新排列终端,但是我有深远的计划来添加定位设备,例如鼠标,该设备只能使用Windows硬件来拖动窗口并更改显示的优先级。
由于终端控制器只是Z环节点之一(并且将该接口重定向到Z80中的任何一个都非常简单),因此在将来的计划中,可以添加“全屏”终端160x50(可能作为“背景”)和真实显示1280x800x64板上带有快速外部SRAM的颜色。
Z型圈
如何把一堆Z80放在一起? 在我的工作中,我坚定地了解到一件事:发展网络是困难的。 该网络的总体目标是:
正如我已经提到的,我的Z80期望连接到串行端口,因此该接口非常简单-必须将其伪装成串行端口! 本质上,Z环是一个同步的单向环网,它使用“信用”来控制流量。 每个节点都有一个1字节的传入缓冲区,用于网络中的每个其他节点。 重置后,每个节点对其余的每个网络节点都有1个“信用”。 该方案已参数化,因此只需添加很少的逻辑就可以轻松扩展到数百个节点,但是如今Z-Ring支持多达32个节点(因此,每个节点都需要32字节的缓冲区)。
“总线”本身包含一个有效位,一个“源” ID,一个“目标” ID和一个1字节的有效载荷(19位)。 我认为使用TTL逻辑实现起来非常简单(如果一个人在1981年失败并且找不到FPGA)。 每个“节点”都有2个用于总线触发的管道-0级和1级-输入消息时,它会一直等到第0级为空,然后合并到第1级。 消息在源节点上输入,并在环中传播,直到到达目标为止,之后它们在适当的缓冲区中找到自己并更新数据就绪标志。 当接收节点读取缓冲区时,它将重新输入原始消息,该消息继续在环中传播,直到再次到达源为止,并返回“贷方”。 如果您将包裹寄到不存在的地址,则整整一圈后,贷款将自动退还。
由于环上的每个挡块都由两个输送机级组成,并且没有背压,因此每个消息所花费的传递周期不超过2 *(节点数)。 当前的实现有17个节点(16个CPU +显示/键盘控制器),它的计时器工作时间为12 ns,因此传递消息和偿还贷款大约需要400 ns。 显示控制器可以到达速率发送流量,因此每个CPU的终端都有2-2.5 Mb / s的带宽(总线通过足以提供全部16个CPU),这对于终端来说是相当大的。
在当前配置中,一切正常,但是您可以进行一些明显的改进:
- 为了加深接收缓冲区,这将增加节点的吞吐量-在FPGA上,有许多1 KB RAM的空闲块,它将支持32个点数的32个节点,因此理论上每个CPU都可以使总线饱和。
- 添加对地址模式的支持。 添加16位(或更多)地址将允许直接访问内存(DMA)(并且将DMA添加到每个节点将很简单)。 FPGA具有大量额外的硬件(几兆字节的静态RAM和大约一千兆字节的DDR3)。
- 在节点之间添加流控制(和缓冲)。
但这一切都可以等到更好的时候。
营养!
带有FPGA的调试板需要12-20 V输入电源,显示器需要12 V,键盘和控制器需要5V。FPGA具有3.3、5和12 V控制器很方便,它们很容易连接,因此FPGA直接从5000毫安时的锂聚合物电池以14.4 V的电压接收功率,然后将功率分配给所有其他器件。 困难之一是我不想每次都为充电而拆卸笔记本电脑,但是电池具有正常的+/-电源连接器以及连接到每个电池的“平衡”连接器。 我不完善的解决方案是电源按钮在FPGA电源和位于滑动盖封闭的凹槽中的充电连接器之间切换电池连接。 不是很方便,但是您可以滑动盖子并从那里拉出连接器以将它们连接到充电装置,而无需使用六角键。
充电看起来很奇怪我尚未对电池进行全面测试,但是它至少可以使用3个小时(足以应付我的火车旅行)。 最有可能的是,它将持续约6个小时,而无需进行任何消耗优化。 它不支持在充电的同时使用,但是,笔记本电脑使用电池供电的时间足够长,因此这不是问题。
房屋
标准“黑客”设计的案例是3毫米激光切割胶合板和在3D打印机上打印的塑料的组合。 我将弹簧装在屏幕铰链上,因此实际上感觉就像是一台普通的笔记本电脑,尽管速度有些慢。 我想赋予它1980年代的外观,因此屏幕的上角有点像Cray,而假皮支架是在手腕下制成的。 激光切割胶合板的边缘使双手非常不适,因此该支架的功能令人惊讶。
速度
我还没有尝试过专门针对CP / M的基准测试(我想是的,但是我并不是特别在寻找它)。 由于这台机器是用Turbo Pascal编写程序的,所以我尝试了几次微测试以提高速度。 事实证明,每秒15-35 K浮点运算(使用TP中的48位实数类型)和每秒约1百万个整数运算(使用16位Integer类型)。 对于8位CPU和足够方便的编程环境来说,还不错。
未来一个有趣的项目可能是浮点运算加速器的开发。
FPGA处置
正如我已经说过的那样,所有逻辑都很轻巧,仅消耗大约7%的芯片资源(尽管总块RAM的40%和M144k RAM的100%)。
- 组合式ALUT 31,808 / 424,960(7%)
- 内存ALUT 0 / 212,480(0%)
- 专用逻辑寄存器10,231 / 424,960(2%)
- 逻辑利用率10%
- 寄存器总数10231
- 块存储位总数9,005,056 / 21,233,664(42%)
- DSP模块18位元素0 / 1,024(0%)
未来计划
在我的近期计划中(也就是说,熨斗已经在车间中,您只需要找到焊接时间):
- 全部着色。 笔记本电脑是由胶合板制成的,我真的很想用东西覆盖它。
- 操纵杆定位装置 将其连接到键盘控制器。
- 电池跟踪。 键盘控制器上的ADC使跟踪电池变得足够容易,这样我就可以了解充电的程度。
- WiFi-我身边有ESP32来启动Zimodem! 与处于接入点模式的电话一起,这应该允许我随时随地上网。 对于CP / M,有很好的终端应用程序,但是编写IRC客户端或简单的Web浏览器之类的东西会很好。 在现代Linux计算机上使用Kermit文件传输协议也将很方便。
- 可以从外部访问的用于连接到另一台机器的串行端口(已经为它打印了一个连接器,只需要焊接即可)。
- LED指示当前状态。 对于他来说,前面已经有一个孔了-现在我打算将其连接到SD卡的访问信号。
从长远来看,我期待各种铁的想法,可以尝试以下有趣的想法:
- Z80可以超频多少? 第一步是从像素计时器中释放处理器速度,但是尝试将现代计算机技术应用于Z80(管道,寄存器重命名,转换预测器等)也将很有趣。
- 为浮点运算之类的事物添加特殊的加速器可能会很有趣。 芯片上有1024个未使用的DSP模块,我认为没有人试图为TP中的48位Real格式构建加速器。
- 使用现有的铁! 我还有一堆未使用的内存,即:
- 带有64位数据总线的512 MB DDR3 SDRAM
- 具有16位数据总线的128 MB DDR3 SDRAM
- 两个带18位数据总线的4 MB QDR II + SRAM
- 64 MB闪存
- 2 MB SSRAM
- 改善视频! 第一步是添加对“全屏”终端160x50的支持,并能够将其放大到普通终端80x25 2倍。 使用外部SSRAM只需添加1280×800 @ 6位模式。
- 扩展当前终端的功能。 我想我可以增加与Kaypro / 84中使用的ADM-3A之类的终端的兼容性(并添加图形支持),然后我就可以使用更广泛的软件(并且不必移植DD9)。
总结
到目前为止,汽车仅工作了几天,但是我可以说我真的很喜欢一切。 屏幕漂亮清晰,键盘又大又舒适,机身笨重,但重量很小(适合放在背包里)。 便携式计算机在火车上工作时甚至符合人体工程学。
我认为我走在正确的轨道上。 在一个窗口中打开文本编辑器以记笔记而在另一窗口上调试TP上的代码的功能极为方便(或者在播放Zork时可以记笔记!)。 可以认为,存在基于CP / M的低成本多任务计算机创建方法。
要建立相同的?
到目前为止,我还没有一种简单的方法可以从计算机中获取文件,因此该软件最有用的部分(用Turbo Pascal编写的CP / Net文件服务器)被困了。 与我们保持联系并保持关注(如果您迫不及待想给我
发电子邮件 )。
在某个时候,我可能会加入21世纪并在github上开设一个帐户。everything,一切都取决于非常“空闲的时间”。