大家好,这里是大话硬件。
前面文章中提到了内存要想高效的工作,需要精心安排各种指令和解决冲突。这些工作任务的都是由内存控制器来完成。
通用的内存控制器主要分为2个部分,前端和后端。
前端是内存控制器和系统内部打交道的接口,主要响应CPU和其他部分的读写请求。
前端的设计是独立于内存类型,无论后面是接DDR2还是DDR4,前端的工作方式不会发生变化。
后端是内存控制器直接和内存颗粒打交道的接口,它高度依赖于内存类型,也就是说如果单板上是DDR2颗粒,后端就必须懂DDR2所有专用指令集,时序参数和操作协议。
内存控制器详细的功能框图如下所示:
从上面的框图可以看出,内存控制器的前端和后端是由4个主要模块组成,分别是:内存映射(memory map)、仲裁器(arbiter)、 命令生成器(command generator)、数据路径(data path)。
系统内部发送请求,内存映射模块开始工作,它会将程序中写的逻辑地址转换成DDR物理地址,具体在哪个bank,哪一行,哪一列。
地址转换完成后,仲裁器根据优先级来决定优先响应哪条请求。仲裁器决定好完成后,命令生成器将内存映射后请求,转换成DDR可以执行的命令,也就是在前面提到的激活,读写,预充电以及刷新。最后就是DDR将需要的数据进行写入或读取,通过数据总线输入和输出。
内存映射
内存映射是通过将CPU程序中的二进制地址解析成这些地址到底对应到DDR内部的哪个bank,哪个行和哪个列。
下面的图解释了翻译的过程,首先是将逻辑地址翻译成物理地址,物理地址中有行列和bank的信息,再对应到DDR中,就是一次完成的内存映射。
仲裁器
仲裁器就像是指挥官,比如在用电脑时,同时执行多个命令,就要同时访问内存,如果都一起访问肯定会出现冲突,仲裁器就会把接收到的所有请求进行排队和调度。
仲裁器是一个权衡的过程,高效的内存仲裁器需要同时具备高效率,可预测性,决策速度快,公平性,灵活性等。但是这些特质不能同时被满足。如果完全公平,肯定不能做到高效率。
命令生成器
系统内部发出的指令是比较抽象的请求,命令生成器要将请求翻译成内存可以执行的指令序列。比如来自系统的请求指令是左边0x12c7f00032,但是DDR并不懂这个指令,命令生成器就需要将这个指令翻译DDR内部可以执行的动作,如右边所示。
翻译后的指令需要和对应颗粒手册中规定的时序参数保持一致。更换DDR颗粒后,同样是左边的代码,右边的指令会因为DDR指令集的差异而不同。
数据路径
DDR执行完一次操作后,需要将数据返回给系统内部,数据通过数据总线进行传输。高效的内存控制器,能够让数据总线一直处于繁忙的状态从而来提高效率。
以上内容参考文档《An Introduction to SDRAM and memory controllers》如果也想看下原文档,在大话硬件公众号后台回复关键字 : SDRAM
1863