从 8085 CPU 架构来看,当 ALU 完成计算时,结果会在下一个时钟沿返回到累加器 A。但是累加器A直接连线作为ALU输入,如果时钟边沿上升得不够快导致A被加了两次或更多次怎么办,这样的错误很难检测到,这样的设计非常”脆弱”对我来说。
除非,ALU 中有一个额外的寄存器来临时保存 ALU 结果?
https://en.wikipedia.org/wiki/Intel_8085#/media/File:Intel_8085_arch.svg
从 8085 CPU 架构来看,当 ALU 完成计算时,结果会在下一个时钟沿返回到累加器 A。但是累加器A直接连线作为ALU输入,如果时钟边沿上升得不够快导致A被加了两次或更多次怎么办,这样的错误很难检测到,这样的设计非常”脆弱”对我来说。
除非,ALU 中有一个额外的寄存器来临时保存 ALU 结果?
https://en.wikipedia.org/wiki/Intel_8085#/media/File:Intel_8085_arch.svg
正如@duskwuff 所怀疑的那样,我已经对此进行了调查。为了回答这个问题,8085 在 ALU 中有两个额外的寄存器。
8085 有几个“隐藏”寄存器:一个 16 位 WZ 对和两个 8 位 ALU 辅助寄存器:ACT 和 TMP。WZ 是寄存器文件的一部分,而 ACT、A(累加器)和 TMP 位于 ALU 电路本身中。
下面是 ALU 工作原理图:
ACT 寄存器有几个重要的功能。首先,它保存 ALU 的输入。这允许将 ALU 的结果写回累加器,而不会干扰输入,否则会导致不稳定。其次,ACT 可以保持恒定值(例如,用于递增或递减,或小数调整)而不影响累加器。最后,ACT 允许不使用累加器的 ALU 操作。
8085 的 ALU 设置的一个有趣结果是,只有在通过 ALU 之后才能将值加载到累加器中。
在同步设计中,确保此类事情不会发生是设计人员的一项重要任务。将数据“计时”到的寄存器具有特定的动态属性,如时钟上升时间、时钟保持时间、时钟信号变化前后的数据稳定。如果违反时序,则无法保证结果状态。
在您的特定情况下,ALU 有其传播延迟,并且添加 A 两次应该有一段时间,直到新 A 被添加到加法器中的前一个 A 并且结果出现在其输出中。很可能它被模拟和计算出在设备定义的允许时钟频率范围内不会发生这种情况。这就是为什么数据表明确具有最小和最大时钟额定值的原因。对于 8085A-2,它说: