我正在尝试构建一台 Z80 自制计算机,以获得一些逆向计算的乐趣,并自学电子设计的基础。对于概念验证,我已经在前几周成功地在面包板上组装了一个基本系统。
当前的原型非常简单。我使用了一个由 74HCT04 Pierce 振荡器驱动的 4 MHz 晶体作为系统时钟,两个透明模式(LE
高)的 74HCT573 锁存器作为 16 位地址总线的缓冲器,另外两个 74HCT573 在相反方向上由控制RD
并NOT RD
作为双向数据总线缓冲器。我将一个100 ns AT28C256 EEPROM(仅解码 16-KiB)和两个150 ns 8-KiB SRAM 芯片连接到系统总线。我使用了一个 74HCT42 来生成CS
信号并将OE
EEPROM 的硬线连接到低,WE
到高,只留下一个 CS 信号来控制 EEPROM。
面包板上的所有东西都很吵,但在我完成每个阶段后,系统似乎完全可以运行。现在它可以从 EEPROM 中获取指令,从/向 SRAM 读取和写入数据,它有一个由另一个锁存器 74HCT573 制成的串行端口,D0
连接到D0
,LE
是(NOT (IOREQ NAND WR))
,输出来自Q1
,换句话说,只有一个输出端口没有地址解码逻辑。我编写了一个 CPU/RAM 密集型基准程序,我的计算机可以输出预期的结果。Memdumps 还显示 Z80 可以正确读取 EEPROM 中的所有字节,因此一切正常。
但是当我试图探测D0
数据总线的引脚时,我看到一些明显的逻辑 1 输出出现了一些奇怪的“缺口”。
并且它们似乎总是CS
在 EEPROM 的信号激活后不久出现一些逻辑 1,例如,这是叠加在蓝色 EEPROM CS 信号上的奇怪陷波的捕获。
我试图找出问题所在,因此我将 SRAM 的所有 CS 引脚硬连线到高电平,有效地将它们从系统中移除,并且我编写了一个没有内存访问的简单测试程序。
.org 0x00
di
xor a
loop:
out (0x00), a
inc a
jp loop
但是问题没有改变,奇怪的“缺口”仍然总是出现在一些逻辑 1 之后,就在MEMRQ
和/或(因为它现在基本上是一个芯片)CS
(蓝色)变低之后。
SRAM 的所有 CS 引脚均为高电平,因此系统几乎只有一个 AT28C256 EEPROM 芯片作为存储器,以及一个锁存器作为输出端口。该系统还有一个由 Atmega328p 制成的系统内编程器,用于在 DMA 请求期间即时重新编程 EEPROM,但我认为这不是罪魁祸首,因为我将编程器的所有数据和地址输出都设为三态,并且甚至在我添加程序员之前,我就已经看到了缺口。
因此,必须在操作码获取周期中创建“缺口”。这些是什么?
我有几个假设:
没有错,只是面包板的信号完整性不好造成的,在设计良好、解耦好的PCB中会自动消失。面包板存在各种信号完整性问题:阻抗不匹配、反射、寄生电容、串扰、EMI/RFI。横跨电路板的长总线可能会在一定程度上使问题恶化。
如果是真的,你能解释一下“缺口”的性质吗?这种现象在EE中有名字吗?我以前见过很多过冲和振铃,但从未见过“缺口”。为什么我只在某些逻辑级别上看到它?
定时。EEPROM输出或其他逻辑电路的短暂“稳定时间”是否可能对总线造成这种奇怪的影响?
扇出。也许长总线会消耗大量电流并具有高电容,因此 EEPROM 输出很难将总线驱动为高电平?可能示波器探头也在加载总线?
总线争用,或其他导致数据总线拉动的逻辑错误。我觉得不太可能?总线上的其他组件是隔离的,我看不到单个 AT28C256 EEPROM 或锁存器如何做到这一点。但我想这仍然是可能的,因为接线错误或面包板中隐藏的内部短路。
更新:我从一开始就已经在板上使用了去耦和滤波电容器。我在电路板上使用了很多 0.1 uF 去耦电容,CPU 甚至有 0.1 uF 和 0.01 uF 电容用于去耦。当前系统有 8 个板,每个面包板在两个导轨上都有两个 4.7 uF 铝电容器,用于本地滤波。此外,从开发板获得的电源有一个 200 uF 的钽电容。但正如我所说,问题就在这里。
我不确定这是否足够,特别是考虑到在面包板上的芯片附近放置 104 个电容器的难度。也许添加更多可以解决它?
我感兴趣的是问题的根本原因,如果可以确认它只是面包板上的去耦不足或信号完整性差的固有问题,我可以停止尝试浪费时间进行故障排除或担心它,因为最终设计将是 PCB。但我不确定。
谢谢。
Update2:在我看来,我相信Bruce Abbott 的评论已经给出了正确的答案并且问题已经解决了!虽然直到明天我才能测试它。罪魁祸首是Z80的DRAM刷新,详情见我自己的回答。目前,不需要新的答案,当我确认解决方案时,我会接受我自己的答案。如果它不起作用,我会更新问题。感谢大家的帮助。