大家好,這里是大話硬件。
前面文章中提到了內存要想高效的工作,需要精心安排各種指令和解決沖突。這些工作任務的都是由內存控制器來完成。
通用的內存控制器主要分為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執行完一次操作后,需要將數據返回給系統內部,數據通過數據總線進行傳輸。高效的內存控制器,能夠讓數據總線一直處于繁忙的狀態從而來提高效率。