为什么我在某些逻辑 1 的数据线上看到一个奇怪的“缺口”?

电器工程 嵌入式 逻辑门 信号完整性 定时 z80
2022-01-15 21:02:59

我正在尝试构建一台 Z80 自制计算机,以获得一些逆向计算的乐趣,并自学电子设计的基础。对于概念验证,我已经在前几周成功地在面包板上组装了一个基本系统。

当前的原型非常简单。我使用了一个由 74HCT04 Pierce 振荡器驱动的 4 MHz 晶体作为系统时钟,两个透明模式(LE高)的 74HCT573 锁存器作为 16 位地址总线的缓冲器,另外两个 74HCT573 在相反方向上由控制RDNOT RD作为双向数据总线缓冲器。我将一个100 ns AT28C256 EEPROM(仅解码 16-KiB)和两个150 ns 8-KiB SRAM 芯片连接到系统总线。我使用了一个 74HCT42 来生成CS信号并将OEEEPROM 的硬线连接到低,WE到高,只留下一个 CS 信号来控制 EEPROM。

面包板上的所有东西都很吵,但在我完成每个阶段后,系统似乎完全可以运行。现在它可以从 EEPROM 中获取指令,从/向 SRAM 读取和写入数据,它有一个由另一个锁存器 74HCT573 制成的串行端口,D0连接到D0LE(NOT (IOREQ NAND WR)),输出来自Q1,换句话说,只有一个输出端口没有地址解码逻辑。我编写了一个 CPU/RAM 密集型基准程序,我的计算机可以输出预期的结果。Memdumps 还显示 Z80 可以正确读取 EEPROM 中的所有字节,因此一切正常。

但是当我试图探测D0数据总线的引脚时,我看到一些明显的逻辑 1 输出出现了一些奇怪的“缺口”。

D0 上的奇怪缺口示例

并且它们似乎总是CS在 EEPROM 的信号激活后不久出现一些逻辑 1,例如,这是叠加在蓝色 EEPROM CS 信号上的奇怪陷波的捕获。

一个奇怪的 Notch 叠加在 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,但我认为这不是罪魁祸首,因为我将编程器的所有数据和地址输出都设为三态,并且甚至在我添加程序员之前,我就已经看到了缺口。

“缺口”的另一个例子

因此,必须在操作码获取周期中创建“缺口”。这些是什么?

我有几个假设:

  1. 没有错,只是面包板的信号完整性不好造成的,在设计良好、解耦好的PCB中会自动消失面包板存在各种信号完整性问题:阻抗不匹配、反射、寄生电容、串扰、EMI/RFI。横跨电路板的长总线可能会在一定程度上使问题恶化。

    如果是真的,你能解释一下“缺口”的性质吗?这种现象在EE中有名字吗?我以前见过很多过冲和振铃,但从未见过“缺口”。为什么我只在某些逻辑级别上看到它?

  2. 定时。EEPROM输出或其他逻辑电路的短暂“稳定时间”是否可能对总线造成这种奇怪的影响?

  3. 扇出。也许长总线会消耗大量电流并具有高电容,因此 EEPROM 输出很难将总线驱动为高电平?可能示波器探头也在加载总线?

  4. 总线争用,或其他导致数据总线拉动的逻辑错误。我觉得不太可能?总线上的其他组件是隔离的,我看不到单个 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刷新,详情见我自己的回答。目前,不需要新的答案,当我确认解决方案时,我会接受我自己的答案。如果它不起作用,我会更新问题。感谢大家的帮助。

3个回答

感谢大家的帮助。我相信布鲁斯·雅培给出了正确的答案。我正在床上发帖,直到明天我才能对其进行测试,但是下面的分析得到证实,当他提到“刷新”这个词时,我认为问题已经解决了。我知道Z80是如何刷新内存的,但是前几天完全忘记了。

...另外两个相反方向的 74HCT573 由 RD 和 NOT RD 控制,作为双向数据总线缓冲器。” - 也许是这个?请提供显示控制信号的电路图。

我怀疑这是由每个 M1(操作码获取)周期结束时的刷新引起的。需要确切了解您是如何生成 CS 和数据总线缓冲区使能的。

——布鲁斯·阿博特

双向数据缓冲区由控制RDNOT RD如果RD为低电平有效,则缓冲区将数据驱动到CPU,否则,如果RD为高电平,则表示写入/输出,缓冲区驱动总线。

双向数据缓冲区

尽管如此,Z80 在获取操作码后立即执行 DRAM 刷新的内存读取。这一次,尽管它RDHIGH一个读操作,导致缓冲区翻转其方向并驱动总线,结果是总线争用。所以奇怪的“缺口”总是会在 DRAM 刷新周期中出现,但不会出现在普通的内存读/写或 I/O 中。这就解释了为什么“缺口”总是会出现,但只针对一些,而不是所有逻辑 1。

Z80操作码获取时序图

此外,SRAM 不需要刷新,因此 DRAM 刷新在我的系统中完全没有用,而且这种总线争用不会破坏任何指令或数据,使系统看起来功能齐全。

解决方案:实施(RD AND REFRESH)(NOT (RD AND REFRESH). 在下一个版本中,我还应该测试BUSACK以确保数据缓冲区在 DMA 操作期间也不会驱动总线。

更新:我可以确认问题和解决方案。使用WRNOT WR改为解决问题,如新原理图所示不要这样做!这也是错误的,请参阅更新 2)。

新原理图(错误)

现在波形看起来很正常!

新波形,显示问题已得到纠正。

更新2:上面的原理图也坏了,如果你是这个答案的读者,不要使用它!如果假设总线处于非活动状态WRRD足够糟糕了,那么假设总线RD处于WR非活动状态就更糟了。我使用以前的程序进行初始测试,所以系统看起来可以工作,但它错过了一个关键问题。

在内存写入周期中,Z80 CPU 会在变为低电平有效之前 WR开始驱动总线,此时数据缓冲区仍在向 CPU 驱动数据,哎呀,造成总线争用。

Z80内存读写时序图

Bruce Abbott 是正确的:最好始终独立使用RDWR发出信号来控制每个缓冲区,而不是反转单个缓冲区。

例如,

新的原理图(已修复,但 DMA 无人处理,您应该处理它。

它现在完美运行。

最后,同样,上面的示意图是一种简化,还应该测试BUSACK以确保数据缓冲区在 DMA 操作期间也没有驱动总线。

确保所有 IC 上都有足够的去耦电容。每个 IC 上从电源到地的 100nF 陶瓷保持其引线尽可能短,并且在整个电源轨上的面包板上使用低 ESR 电解液(例如 100uF)。

我在这里看到两种可能性:

1) D0 为三态

无论是什么驱动 D0 进入三态(高阻抗模式),然后 D0 网络中某处的下拉使电压缓慢下降(时间常数由下拉电阻和 IC 和走线的寄生电容定义)。波形的指数性质强烈表明该线不是由强大的东西驱动,而是由相对较弱的下拉驱动。

尝试在线路上添加另一个下拉电阻,并检查指数波形是否更快变为零。

请记住,这不一定是问题,您的公共汽车可能会很好地工作。

2) 争用

你的假设#4。D0也有可能与另一条逻辑线短路。我发现这不太可能,因为在这种情况下,您不会看到现在看到的具有相对较长时间常数的指数波形。您可以探测电路中的其他网络以寻找另一个相同的波形,表明您有短路。

祝你好运!

PS - 这不是信号完整性问题,脉冲宽度太长了