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


15

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

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

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

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

D0上的怪异刻痕示例

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

叠加在CS信号上的怪异缺口

我试图找出问题所在,所以将SRAM的所有CS引脚硬接线到HIGH,从而有效地将它们从系统中删除,并且我编写了一个简单的测试程序,该程序无法访问内存。

.org 0x00
    di

    xor a
loop:
    out (0x00), a
    inc a

    jp loop

但是问题并没有改变,在某些情况下仍然总是出现怪异的“缺口”MEMRQ /” CS(蓝色)变低和/或(因为现在基本上是单芯片)之后逻辑1 。

SRAM的所有CS引脚都为HIGH,因此该系统几乎只有一个AT28C256 EEPROM芯片作为存储器,而一个锁存器作为输出端口。该系统还具有一个由Atmega328p制成的系统内编程器,可以在DMA请求过程中即时对EEPROM进行重新编程,但是我认为这不是罪魁祸首,因为我将编程器的所有数据和地址输出均设为三态,并且在添加程序员之前,我就已经看到了缺口。

“缺口”的另一个示例

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

我有一些假设:

  1. 没错,这只是由于面包板的信号完整性差而引起的,并且它将在设计良好且去耦良好的PCB中自动消失。面包板存在各种信号完整性问题:阻抗不匹配,反射,寄生电容,串扰,EMI / RFI。跨电路板的长总线可能会在一定程度上加剧该问题。

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

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

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

  4. 总线争用或引起某些原因导致数据总线拔出的其他逻辑错误。我不太可能吗?总线上的其他组件是隔离的,我看不到单个AT28C256 EEPROM或锁存器是如何做到这一点的。但是我想仍然可能是由于接线错误或面包板上隐藏的内部短路。

更新:我从一开始就已经在板上使用了去耦和滤波电容器。我在板上使用了许多0.1uF的去耦电容器,CPU甚至同时具有0.1uF和0.01uF的去耦电容器。当前系统有8个板,每个面包板的两个导轨上都有两个4.7 uF铝电容器,用于局部滤波。而且,从开发板获得的功率具有200 uF的钽电容器。但是正如我所说,问题就在这里。

不过,我不确定是否足够,特别是考虑到在面包板上的芯片附近放置104个电容器的难度。也许添加更多可以解决这个问题?

我感兴趣的是问题的根本原因,如果可以将其确认为仅仅是去耦不充分或面包板上信号完整性较差的内在问题,那么我可以停止浪费时间进行故障排除或担心,因为最终设计将是PCB。但我不确定。

谢谢。

Update2:在我看来,我相信Bruce Abbott的评论给出了正确的答案,问题已经解决!虽然直到明天我都无法测试。罪魁祸首是Z80的DRAM刷新,有关详细信息,请参阅我自己的答案。目前,不需要新的答案,当我确认解决方案时,我将接受自己的答案。如果不起作用,我将更新问题。感谢大家的帮助。


我刚刚看到了您的修改。我相信,如果您查看所使用零件的规格和设计说明/应用程序,那将是理想的选择。除了为设备去耦电容之外,可能还有其他一些组件缺失。您确定已遵守所有规格吗?这是一个很好的根本原因练习。截至目前,如果没有电路图,您的问题将无法回答。
KingDuken

6
帮助将EMI /电源问题与时钟/逻辑问题分开的一种方法是尝试使用频率较低的时钟,例如0.5MHz或1MHz。如果奇怪的毛刺从250ns变为1us,则取决于处理器的操作。如果仍保持约250ns,则可能是EMI /电源问题。总线上是否有上拉/下拉电阻(这可能是三态响应)吗?
W5VO

1
查看处理器数据手册是否建议/建议数据总线上的任何上拉或下拉电阻。这将有助于减少三态操作中出现故障的机会。如果您在程序中添加了另一个“ inc a”指令,则可能会找出引起故障的指令。
W5VO

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

5
我怀疑这是由于每个M1(操作码提取)周期结束时的刷新引起的。需要确切了解您如何生成CS和数据总线缓冲区启用。
布鲁斯·雅培

Answers:


13

感谢大家的帮助。我相信Bruce Abbott给出了正确的答案。我正在从床上发帖,直到明天我都无法测试它,但是以下分析得到证实,当他提到“刷新”一词时,我认为问题已经解决。我知道Z80如何刷新内存,但是在前几天完全忘记了它。

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

我怀疑这是由于每个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)。

新原理图(错误)

现在波形看起来正常!

新波形,表明问题已得到纠正。

Update2:上面的示意图也已损坏,如果您是此答案的读者,请不要使用它!如果假设总线是WRRD信号无效是够糟糕的,假设公交车RD的时候WR是无效的,甚至更糟。我使用先前的程序进行初始测试,因此该系统似乎可以正常工作,但是它错过了一个关键问题。

在存储器写周期中,Z80 CPU将 WR变为低电平之前启动驱动总线,这时,数据缓冲区仍在向CPU驱动数据,哎呀,造成了总线争用。

Z80内存读写时序图

布鲁斯雅培是正确的:它更好地一直使用RD,并WR独立信号来控制每个缓冲区,而不是反转一个。

例如,

新的原理图(已修复,但未使用DMA,您应该进行处理。

现在,它可以完美运行。

最后,以上原理图只是一种简化,还应该进行测试BUSACK以确保在DMA操作期间数据缓冲区也不会驱动总线。


6
您可以考虑使用/ WR而不是反向的/ RD来启用上缓冲区。这样,除非正在进行实际的读取或写入,否则数据总线将处于非活动状态。
布鲁斯·雅培

8

确保所有IC上都有足够的去耦电容器。每个IC上从电源到地的100nF陶瓷保持其引线尽可能短,并且跨电源轨的试验板上的ESR较低,即100uF。


似乎是数字IC不稳定的解决方案:)
KingDuken

4
@KingDuken绝对是我的一个热门话题,我的一个朋友因错过一个而被开除一次。在现金处理机中引起了很多不稳定,哎呀。
RoyC

2
去耦很重要,但这并不是一切的答案。从波形中可以明显看出,此处不太可能相关。
pericynthion

4

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

1)D0为三态

不管驱动D0进入三态(高阻抗模式),然后在D0网络中的某个位置下拉都会使电压缓慢下降(时间常数由下拉电阻以及IC和走线的寄生电容定义)。波形的指数特性强烈表明,该线不是由强信号驱动,而是由相对弱的下拉驱动。

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

请记住,这并不一定是问题,您的公交车可能会完美运行。

2)争夺

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

祝好运!

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.