大家好,這里是大話硬件。
前面文章中提到了內(nèi)存要想高效的工作,需要精心安排各種指令和解決沖突。這些工作任務(wù)的都是由內(nèi)存控制器來完成。
通用的內(nèi)存控制器主要分為2個部分,前端和后端。
前端是內(nèi)存控制器和系統(tǒng)內(nèi)部打交道的接口,主要響應(yīng)CPU和其他部分的讀寫請求。
前端的設(shè)計是獨(dú)立于內(nèi)存類型,無論后面是接DDR2還是DDR4,前端的工作方式不會發(fā)生變化。
后端是內(nèi)存控制器直接和內(nèi)存顆粒打交道的接口,它高度依賴于內(nèi)存類型,也就是說如果單板上是DDR2顆粒,后端就必須懂DDR2所有專用指令集,時序參數(shù)和操作協(xié)議。
內(nèi)存控制器詳細(xì)的功能框圖如下所示:
從上面的框圖可以看出,內(nèi)存控制器的前端和后端是由4個主要模塊組成,分別是:內(nèi)存映射(memory map)、仲裁器(arbiter)、 命令生成器(command generator)、數(shù)據(jù)路徑(data path)。
系統(tǒng)內(nèi)部發(fā)送請求,內(nèi)存映射模塊開始工作,它會將程序中寫的邏輯地址轉(zhuǎn)換成DDR物理地址,具體在哪個bank,哪一行,哪一列。
地址轉(zhuǎn)換完成后,仲裁器根據(jù)優(yōu)先級來決定優(yōu)先響應(yīng)哪條請求。仲裁器決定好完成后,命令生成器將內(nèi)存映射后請求,轉(zhuǎn)換成DDR可以執(zhí)行的命令,也就是在前面提到的激活,讀寫,預(yù)充電以及刷新。最后就是DDR將需要的數(shù)據(jù)進(jìn)行寫入或讀取,通過數(shù)據(jù)總線輸入和輸出。
內(nèi)存映射
內(nèi)存映射是通過將CPU程序中的二進(jìn)制地址解析成這些地址到底對應(yīng)到DDR內(nèi)部的哪個bank,哪個行和哪個列。
下面的圖解釋了翻譯的過程,首先是將邏輯地址翻譯成物理地址,物理地址中有行列和bank的信息,再對應(yīng)到DDR中,就是一次完成的內(nèi)存映射。
仲裁器
仲裁器就像是指揮官,比如在用電腦時,同時執(zhí)行多個命令,就要同時訪問內(nèi)存,如果都一起訪問肯定會出現(xiàn)沖突,仲裁器就會把接收到的所有請求進(jìn)行排隊(duì)和調(diào)度。
仲裁器是一個權(quán)衡的過程,高效的內(nèi)存仲裁器需要同時具備高效率,可預(yù)測性,決策速度快,公平性,靈活性等。但是這些特質(zhì)不能同時被滿足。如果完全公平,肯定不能做到高效率。
命令生成器
系統(tǒng)內(nèi)部發(fā)出的指令是比較抽象的請求,命令生成器要將請求翻譯成內(nèi)存可以執(zhí)行的指令序列。比如來自系統(tǒng)的請求指令是左邊0x12c7f00032,但是DDR并不懂這個指令,命令生成器就需要將這個指令翻譯DDR內(nèi)部可以執(zhí)行的動作,如右邊所示。
翻譯后的指令需要和對應(yīng)顆粒手冊中規(guī)定的時序參數(shù)保持一致。更換DDR顆粒后,同樣是左邊的代碼,右邊的指令會因?yàn)镈DR指令集的差異而不同。
數(shù)據(jù)路徑
DDR執(zhí)行完一次操作后,需要將數(shù)據(jù)返回給系統(tǒng)內(nèi)部,數(shù)據(jù)通過數(shù)據(jù)總線進(jìn)行傳輸。高效的內(nèi)存控制器,能夠讓數(shù)據(jù)總線一直處于繁忙的狀態(tài)從而來提高效率。