微處理器的外部匯流排介面(External Bus Interface;EBI)用於存取或控制外部的周邊裝置,但是快閃記憶體、同步動態隨機存取記憶體(SDRAM)各自擁有特定的裝置介面。原因之一是這些類型的記憶體晶片在存取內部儲存單元(storage cell)時所需耗費的時間遠遠大於EBI的作業時間,另一原因是不同類型的記憶體有其獨特的存取特性。例如,快閃記憶體對於儲存單元的寫入是程式化(programming),在程式化之前必須先抹除(erase)。

SPMI的硬體結構和軟體工程

圖 1呈現微處理器和各類型的記憶體之間應用軟體代理記憶體介面(Software Proxy Memory Interface;SPMI)的硬體結構(關於軟體代理介面的更多討論,請參考筆者先前發表的《軟體代理介面提升記憶體存取效率》一文)。軟體程式在微處理器內部執行時控制二輸出腳,並且協同EBI來存取或控制各種記憶體。這二輸出腳的訊號是單元存取致能(cell access enable, #CAE)以及啟動(activating, #ACT),形成如圖 1所示的一組控制訊號,亦即‘Control 1’。由於快閃記憶體在進行程式化和抹除時皆需耗費非常久的時間,所以使用另一組控制訊號,亦即‘Control 2’。

依據記憶體的存取特性和存取時間來撰寫其所對應的軟體程式,軟體工程師必須適時使用EBI來傳輸資料和控制GPIO來操作記憶體裝置。當SPMI的程式碼被微處理器執行時,EBI和GPIO一定是循序動作;其中,EBI負責傳輸資料,GPIO負責控制儲存單元的存取,並且依據記憶體的存取特性來交替使用EBI和GPIO。這是簡單介紹SPMI在軟體工程上的基本知識;順便一提,用於存取DRAM的程式碼也可轉成微處理器的微碼(microcode)。

Hardware Struct of SPMI

圖1:SPMI的硬體架構

SPMI的特徵

圖 2呈現SPMI DRAM與[DDR-n] SDRAM的差異,用來介紹SPMI的獨到特徵。SPMI DRAM晶片包含控制邏輯(control logic),但沒有自動更新(auto refresh)以及延遲鎖定迴路(DLL),這樣的硬體架構可降低單一晶片的成本。除此之外,SDRAM的控制邏輯比SPMI DRAM更加複雜。軟體工程師可善加利用系統單晶片(SoC)的內部裝置以及硬體平台的裝置來實現自動更新的功能。

對於基本的自動更新,其所相關的硬體電路包含計時器,更進階的自動更新就需要溫度感測器;這一計時器以及溫度感測器並不要求精確度也不要求速度。如果在SDRAM晶片內部執行自動更新會產生正比於晶片數量的功率消耗。SoC可以包含高效率處理器和低功率處理器,某些SoC也有溫度感測器;除此之外,先進的硬體平台會偵測SoC與周邊晶片之間的環境溫度。因此,當SoC在低功率運行時,SPMI的軟體程式可以使用低頻率計時器和各溫度感測器來執行自動更新。例如,SoC透過內部的N模計數器來降低核心的工作頻率,然後使用圖 2所示的第一計時器、核心溫度感測器、周邊溫度感測器。

非同步SRAM的存取時間可以直接換算出操作頻率的極限或直接判斷存取效率的良窳,但DDR-n SDRAM的操作頻率受限於DLL的鎖定頻率(lock in frequency),其存取效率受限於速度箱(speed bin)的數值。DLL的電路設計有其預定的頻率範圍,於是SDRAM控制器的時脈頻率不能大幅變更;這對於硬體工程師在設計硬體平台時,不易在應用設計與元件規格之間取得較佳的平衡;當這一硬體平台轉給軟體工程師之後就成了錙銖必較的軟體工程。

軟體程式與數位邏輯之間具有互換的本質,於是SPMI的功能可以轉換成硬體控制器,此即圖 2所示的SPMI控制器。由於SPMI的動作僅是單純控制EBI和GPIO的時序,所以該控制器的硬體元件可以使用電場可程式閘陣列(Field Programmable Gate Array;FPGA),或是複合型可程式邏輯元件(Complex Programmable Logic Device;CPLD)。

(譯名解讀:原文‘Field’應是暗喻應用經由橫向電場而能工作的電晶體,即「場效電晶體」(FET);而原文‘Gate’在開發上應不受限於「邏輯閘」,例如類比開關也是一種閘;原文‘Complex’在硬體架構上則是複合許多PLD。)

SPMI DRAM vs [DDR-n] SDRAM

圖 2:SPMI DRAM VS. [DDR-n] SDRAM

SPMI快閃記憶體的操作

快閃記憶體的缺點就是儲存單元必須先具有初始的儲存狀態,也就是要先被抹除,然後才能改變儲存狀態,也就是程式化;在儲存單元被改變儲存狀態後只能再次抹除才能回到初始的儲存狀態。若儲存單元從初始的儲存狀態至最高的儲存狀態僅有一個位階可被變動,這就稱為單階單元(SLC)。若儲存單元能有多個位階,這就稱為多階單元(MLC),但這時的實際產品僅有3個位階。於是,三重階單元(Triple-Level Cell;TLC)意指二進位數學式,也就是2的3次方。

固態硬碟(SSD)在起始發展時是使用NAND快閃記憶體,為了提高寫入速度,因此設定同一儲存位址不能被覆寫,所以SSD會損失一些使用者資料的儲存空間來放置查找表;另外在背景作業中進行抹除,也就是垃圾收集(garbage collection)。在硬體平台上的SPI Flash也多是NAND快閃記憶體,所以本文以NAND快閃記憶體的存取特性來呈現SPMI的操作時序。

NAND快閃記憶體在執行抹除時的單位是區塊(block),在執行程式化時的單位是頁(page),對應其硬體架構而定義EBI的位址線以及資料線如下:全部位址線在首次資料搬移指令執行時分別是軟體晶片定址(software chip addressing, A[MSB:r])、列位址(A[r-1:0]),其中,列位址包含區塊位址和頁位址;在首次資料搬移指令執行後,列位址變成行位址。全部資料線在首次資料搬移指令執行時分別是庫位址(DQ[7:4])、功能編號(DQ[3:0]),其中,庫位址包含邏輯單位編號(logical unit number; LUN)和平面編號(plane number);在首次資料搬移指令執行後是資料。SPMI NAND快閃記憶體的指令真值表如下。

Command Truth Table of SPMI NAND Flash

表1:SPMI NAND快閃記憶體的指令真值表

讀取時序

圖 3呈現SPMI NAND快閃記憶體在讀取期間的時序,其中,tEBI代表EBI的存取時間,tIO代表輸出埠的控制時間,tOP代表指令碼的操作時間,Timer代表計時器的時間。虛構時脈(imaginary clock)是用來代表不同時間點的資料傳輸時間。第1虛構時脈至第2虛構時脈是執行功能編號‘4’。在第3虛構時脈到達之後,#CAE以及#ACT的邏輯訊號轉成低準位,然後啟動低頻率計時器。這一時間點是偵測儲存單元的儲存狀態,然後寫入晶片內部的資料暫存器。

微處理器在第4虛構時脈確認晶片是否仍在忙碌狀態(busy status);如果讀取到的資料是‘0x0F’,這表示資料暫存器已完成記錄儲存單元的儲存狀態,並且晶片處於備妥狀態(ready status)。微處理器在第5虛構時脈指令#CAE以及#ACT的邏輯訊號轉成高準位。當#ACT的邏輯訊號再次回到高準位之時記憶體晶片的工作狀態立即解除。

第7虛構時脈至第12虛構時脈是執行功能編號‘0’,微處理器會隨機讀取晶片內部的資料暫存器。當#ACT的邏輯訊號再次回到高準位之時記憶體晶片的工作狀態立即解除。

Timing Diagram of SPMI NAND Flash for Reading

圖3:SPMI NAND快閃記憶體在讀取期間的時序

寫入時序

圖 4呈現SPMI NAND快閃記憶體在寫入期間的時序。第1虛構時脈至第7虛構時脈是是執行功能編號‘1’,微處理器的資料會隨機寫入晶片內部的資料暫存器,所以不必改變#CAE的邏輯準位;在#ACT的邏輯訊號轉成低準位之後,記憶體晶片才會執行後續的操作步驟。當#ACT的邏輯訊號再次回到高準位之時記憶體晶片的工作狀態立即解除。

第9虛構時脈至第11虛構時脈是執行功能編號‘5’,也就是對儲存單元進行程式化。快閃記憶體在接收到程式化指令(PROG)之後啟動程式化電壓產生器,從啟動至穩定的時間(tPV)至少佔用1個tIO。微處理器在第10虛構時脈指令#CAE以及#ACT的邏輯訊號轉成低準位。

微處理器在第11虛構時脈啟動低頻率計時器。第12虛構時脈,微處理器確認晶片是否仍在忙碌狀態;如果讀取到的資料是‘0x0F’,那就表示儲存單元已完成程式化,並且晶片處於備妥狀態。微處理器在第13虛構時脈指令#CAE以及#ACT的邏輯訊號轉成高準位。當#ACT的邏輯訊號再次回到高準位之時記憶體晶片的工作狀態立即解除。

Timing Diagram of SPMI NAND Flash for Programming

圖4:SPMI NAND快閃記憶體在寫入程式化期間的時序

抹除時序

圖 5呈現SPMI NAND快閃記憶體在抹除期間的時序,以下說明如何對多個快閃記憶體晶片同時進行抹除。第1虛構時脈至第2虛構時脈是對某一晶片執行功能編號‘3’,也就是對某一區塊進行抹除。快閃記憶體在接收到區塊抹除指令(BERS)之後啟動抹除電壓產生器。第3虛構時脈至第4虛構時脈是對另一晶片執行功能編號‘3’;軟體程式在致能最後的晶片時,抹除電壓產生器從啟動至穩定的時間(tEV)至少佔用1個tIO。微處理器在第4虛構時脈指令#CAE以及#ACT的邏輯訊號轉成低準位。

微處理器在第5虛構時脈啟動低頻率計時器;在計時結束後,微處理器逐一讀取各晶片的狀態,並且剔除那些已經處於備妥狀態的晶片;以上的動作即是圖中所示的第6虛構時脈至第10虛構時脈。例如,微處理器在第8虛構時脈確認第二晶片仍然處於忙碌狀態,所以讀取到的資料是‘0x00’;緊接著,再次啟動低頻率計時器;第10虛構時脈,微處理器直接讀取第二晶片的狀態。微處理器在第11虛構時脈指令#CAE以及#ACT的邏輯訊號轉成高準位。當#ACT的邏輯訊號再次回到高準位之時記憶體晶片的工作狀態立即解除。

Timing Diagram of SPMI NAND Flash for Erasing

圖5:SPMI NAND快閃記憶體在抹除期間的時序

結語

SPMI的時序可以在操作過程中透過EBI來讀取快閃記憶體的忙碌狀態,但不能立即得知。快閃記憶體晶片包含一接腳,用於向微處理器表示它的忙碌狀態,所以微處理器可以透過硬體中斷來即時得知晶片是否處於備妥狀態。

單核心微處理器在存取相對低速的記憶體晶片時,無論是透過硬體控制器或是軟體程式皆要等待儲存單元的儲存狀態被寫入電路改變或被讀取電路偵測;在這樣的條件下並不必擔心軟體程式會影響應用程式的執行速度。對於多核心微處理器,單一硬體控制器需要預先設定緩衝空間來編排來自各核心的指令,然而軟體程式可以靈活配置。