什么是闪存等待状态?

电器工程 记忆 闪光 处理器
2022-01-29 03:03:17

我正在使用飞思卡尔 PowerPC 微控制器。在数据表中的闪存模块中,“闪存访问的等待状态”的数量是可配置的。

以下是数据表中提出我的问题的部分,它取自 PFlash 模块寄存器的寄存器描述:

该字段必须设置为与 PFlash 的工作频率和 PFlash 的实际读取访问时间相对应的值。更高的工作频率需要此字段的非零设置才能正常运行闪存。
0 MHz, < 23 MHz, 需要等待状态 = 0 ---
23 MHz, < 45 MHz, 需要等待状态 = 1 ---
45 MHz, < 68 MHz, 需要等待状态 = 2 ---
68 MHz, < 90 MHz,需要等待状态 = 3 ---

(PFlash 是 Platform Flash 控制器模块)

我知道处理器比闪存快,这就是引入等待状态的原因。我不明白的是:如果处理器比闪存快,那么处理器是需要放慢速度的不是闪存,但上面的段落说相反(或者我不明白这一点?),它说如果 Pflash 以高频操作,那么我们需要通过添加额外的等待状态来减慢它!

我的理解有什么问题?

谢谢

3个回答

等待状态被添加到由 CPU 启动的内存访问周期中。所以确实是CPU必须等待较慢的Flash。内存控制器在多个周期(0 到 3)内向 CPU 发出“未准备好”信号,在此期间 CPU 保持其当前状态,即已写入 Flash 地址,但尚未读取数据。只有当内存控制器发出“数据就绪”信号时,CPU 才会从数据总线读取数据并继续执行指令(将数据锁存到寄存器或 RAM 中)。

为了放大 stevenvh 的答案,任何类型的逻辑在给定输入信号时都需要一些时间来产生输出信号;与其他逻辑相比,内存通常非常慢。通常,可以保证输出信号将在一定时间内变为有效,但仅此而已。特别是,信号可能会在该时间间隔内发生多次变化,并且在该时间间隔结束之前没有迹象表明信号已达到其最终“正确”值。

当典型的微控制器或微处理器读取存储器的一个字节(或字,或任何单位)时,它会生成一个地址,并在一段时间后查看存储器输出的值并对其进行操作。在控制器生成地址和从内存中查看值的时间之间,它不关心来自内存的输出信号何时或是否发生变化。另一方面,如果来自内存的信号在控制器查看它时还没有稳定到其最终值,则控制器将误读内存,因为它保存了它查看时正在输出的任何值。通常,控制器会在准备好对其执行某些操作时立即查看内存中的值,但如果内存的值还没有准备好,那可能就行不通了。所以,许多控制器可以选择在准备好处理内存中的数据后等待更长时间,以确保内存中的输出实际上是有效的。请注意,添加这种延迟会减慢速度(控制器会很乐意更快地对内存中的数据进行操作),但不会影响操作的正确性(除非速度减慢到无法满足其他计时义务)。

处理器可能需要在内存上停止,但聪明的设计不需要。

我认为您不知道的关键技术是突发/页面模式访问这使得内存访问的带宽非常接近处理器速度(但可能闪存仍然是瓶颈,因为我从未见过运行在 > 200MhZ 的基于闪存的 MCU)

但是,延迟保持不变。例如,对于我正在使用的 STM32F4 MCU,#wait states = floor(clockSpeed / 30MhZ)。这意味着无论时钟速度如何,延迟始终为 33ns。有句话说,“钱可以买到带宽,但延迟是永远的……”

即使闪存带宽不足以让 CPU 保持忙碌,您也可以轻松设计一个代码缓存来存储和预取预期执行的指令。ST 对其 STM32F4 MCU (168 MhZ) 有一个提示:

由于 ART 加速器和 128 位闪存,此处给出的等待状态数不会影响闪存的执行速度,因为 ART 加速器允许实现相当于 0 等待状态程序执行的性能。

实际上,该声明还表明突发模式不是必需的,并且非常宽的内存接口也足够了。但想法是一样的(使用并行性来隐藏延迟)。在芯片上,电线是免费的,因此 128 位内存是有意义的。