文/曹劍鋒(陜西秦泰陽光電力工程有限公司)
整體上,系統(tǒng)由FPGA芯片、eMMC芯片、電源及周邊電路、上位機等部分組成。本設計采用4片支持eMMC5.1標準的eMMC芯片組成磁盤陣列,4片eMMC芯片單獨連接至FPGA。FPGA內部實現了eMMC磁盤陣列控制器用于控制eMMC磁盤陣列。為了對設計的控制器進行測試驗證,FPGA內部還實現了一個萬兆網模塊,通過光模塊與具備萬兆網卡的上位機連接,編寫了上位機軟件用于讀寫eMMC磁盤陣列。本文介紹的是設計eMMC磁盤陣列控制器的設計思想。
eMMC磁盤陣列控制器主要由同步傳輸控制模塊和4個eMMC驅動模塊組成。4個eMMC驅動模塊分別連接4個eMMC芯片。
圖1 系統(tǒng)結構圖
eMMC驅動模塊直接和eMMC芯片打交道,該模塊實現對其所連接的eMMC芯片進行初始化和讀寫操作等功能。該模塊向下連接eMMC芯片,向上連接同步傳輸控制模塊。執(zhí)行同步傳輸控制模塊發(fā)來的命令,控制eMMC作出相應的動作;讀取eMMC反饋的狀態(tài)信息,向同步傳輸控制模塊發(fā)送運行狀態(tài)信息。同時,當執(zhí)行讀操作時,從eMMC獲取數據,向同步傳輸控制模塊發(fā)送數據;當執(zhí)行寫操作時,獲取同步傳輸控制模塊發(fā)來的數據,發(fā)送給eMMC寫入。
同步傳輸控制模塊實現了4片eMMC芯片數據的同步讀寫、同步控制、提供統(tǒng)一對外接口等功能。同步傳輸控制模塊向下連接4個eMMC驅動模塊,向上形成eMMC磁盤陣列控制器的對外接口,用于連接萬兆網模塊。連接萬兆網模塊的接口包括數據接口和控制接口,數據接口采用標準AXI-stream接口,控制接口包括命令和狀態(tài)信號。
eMMC驅動模塊連接eMMC的信號包括8位數據信號、命令信號、時鐘信號等;同步傳輸控制模塊連接每個eMMC驅動模塊的接口包括數據接口和控制接口,其中數據接口信號包括8位讀數據信號、8位寫數據信號,控制接口包括命令信號和狀態(tài)信號。
同步傳輸控制模塊主要包括數據FIFO和狀態(tài)控制模塊。數據FIFO建立了萬兆網模塊與eMMC驅動模塊之間的數據通道。當進行寫操作時,數據從萬兆網模塊通過寫數據FIFO傳送到eMMC驅動模塊。當進行數據讀取操作時,數據由eMMC驅動通過讀數據FIFO傳送到萬兆網模塊。
狀態(tài)控制模塊收集各個模塊的工作狀態(tài)和來自上位機的命令,控制各個模塊協(xié)同工作,完成讀寫傳輸操作。
狀態(tài)控制模塊連接著萬兆網模塊的控制接口,能夠接收萬兆網模塊發(fā)來的來自上位機的命令,并能夠將eMMC磁盤陣列控制器的工作狀態(tài)傳輸給萬兆網模塊,進而上報上位機,實現對eMMC磁盤陣列控制器的操作。
狀態(tài)控制模塊連接著4個eMMC驅動模塊的控制接口,能夠獲取eMMC驅動模塊報告的工作狀態(tài);能夠向eMMC驅動模塊下發(fā)命令,控制eMMC驅動模塊的讀寫等操作。
狀態(tài)控制模塊連接著讀數據FIFO和寫數據FIFO,能夠獲取各個FIFO的工作狀態(tài),能夠根據萬兆網模塊來的命令和eMMC驅動模塊的工作狀態(tài)控制各個FIFO的工作狀態(tài),從而實現數據的同步讀寫傳輸操作。
eMMC驅動模塊具體實現了對eMMC芯片的各種操作。eMMC驅動模塊由命令接口模塊、數據接口模塊、初始化模塊和讀寫控制模塊等組成。
圖2 eMMC陣列控制器結構圖
命令接口模塊用于在CMD信號線上發(fā)送命令和接收響應。該模塊形成eMMC標準命令格式的48位命令數據,將命令數據轉換為串行數據,并通過CMD信號線發(fā)送給eMMC芯片;通過CMD信號線接收eMMC芯片返回的響應數據,并將串行數據轉化為并行數據,然后解析eMMC芯片的響應數據,以便判斷命令是否成功執(zhí)行,獲取eMMC芯片的工作狀態(tài)等。命令接口由狀態(tài)控制模塊、命令形成模塊、響應解析模塊等部分組成。
數據接口模塊用于在eMMC芯片數據線上發(fā)送和接收數據。數據接口模塊由發(fā)送數據模塊和接收數據模塊組成。本設計采用HS400工作模式,數據會在時鐘的上升沿和下降沿傳輸。當發(fā)送數據時,發(fā)送數據模塊按照eMMC標準規(guī)定的數據格式在8根數據線上送出數據包,即1個周期的開始信號、256個時鐘周期共512字節(jié)數據、16個周期的CRC數據和一個結束信號;當接收數據時,接收數據模塊接收8根數據線上的數據包,即1個周期的開始信號、256個周期共512字節(jié)數據、16個周期的CRC數據和一個結束信號。在接收256個時鐘周期的數據時計算CRC,在接收完數據包后將計算的CRC與接收到的CRC比較,若相同則接收成功,若不同則接收失敗。
初始化模塊用于對eMMC芯片進行初始化,使其進入傳輸模式,以便進行讀寫操作。同時,初始化模塊用于監(jiān)控eMMC的工作狀態(tài),當出現故障時,初始化模塊重新對eMMC芯片執(zhí)行初始化操作。初始化模塊還向同步傳輸模塊報告eMMC芯片的工作狀態(tài)。初始化模塊包括初始化狀態(tài)機模塊和狀態(tài)監(jiān)測模塊。初始化狀態(tài)機用于執(zhí)行eMMC標準規(guī)定的初始化流程,狀態(tài)監(jiān)測模塊用于監(jiān)測eMMC工作狀態(tài)。初始化模塊接收同步傳輸模塊發(fā)來的命令,向命令接口模塊發(fā)送需要發(fā)送的命令,并接收命令接口模塊報告的eMMC工作狀態(tài)。
讀寫控制模塊用于實現對eMMC芯片的讀、寫、擦除等操作功能。讀寫控制模塊包括讀控制模塊、寫控制模塊、擦除控制模塊等部分。當讀寫控制模塊收到同步傳輸控制模塊發(fā)來的命令時,根據指令執(zhí)行不同的操作流程。讀寫控制模塊向命令接口模塊發(fā)送命令,使所連接的eMMC芯片進入讀、寫或者擦除的工作狀態(tài);讀寫控制模塊接收命令接口模塊回報的狀態(tài),即所連接的eMMC芯片進入的讀、寫或擦除狀態(tài)后,控制數據接口模塊進行讀、寫數據操作。
命令接口模塊的作用主要是向eMMC芯片發(fā)送串行命令和接收eMMC芯片的響應。命令接口模塊依據初始化模塊或者讀寫控制模塊發(fā)來的命令生成符合eMMC規(guī)范的命令包,發(fā)送給eMMC芯片;解析eMMC芯片發(fā)回的響應,判斷命令是否成功執(zhí)行,并向上返回狀態(tài)。
在命令接口模塊發(fā)送命令的時候遵循一定的流程進行。一般情況下,命令接口模塊處于IDLE狀態(tài),等待新命令。
當初始化模塊或者讀寫控制模塊向命令接口模塊下發(fā)新命令時,命令接口模塊狀態(tài)轉化為START,在此狀態(tài)下,向CMD信號線發(fā)送開始信號。隨后狀態(tài)轉換為DIR狀態(tài),向CMD信號線發(fā)送方向信號。接著狀態(tài)切換到CMD狀態(tài),向CMD信號線發(fā)送6個時鐘周期的CMD數據。隨后是PARA狀態(tài),向CMD信號線發(fā)送32位參數數據。在發(fā)送從START到PARA的數據過程中計算7位CRC,在發(fā)送完PARA數據后轉換為CRC狀態(tài)并發(fā)送計算的CRC數據,最后轉化為END狀態(tài)并發(fā)送結束位。這樣就完成了一個命令的發(fā)送操作。
當命令發(fā)送完成后,模塊接收eMMC芯片的響應。命令接口模塊狀態(tài)轉換為START狀態(tài),并在這一狀態(tài)等待CMD信號線上出現開始信號。當開始信號出現后,狀態(tài)轉換為DIR狀態(tài),接收方向信號。然后轉換為CMD狀態(tài)接收6位命令碼,并確認接收到的6位命令碼是剛才發(fā)送命令的響應。隨后轉換為PARA狀態(tài)接收32位參數,此參數可以包括eMMC當前的工作狀態(tài)數據等,由此可以判斷命令是否成功執(zhí)行。接收上述數據時計算CRC。接收完PARA數據后轉換為CRC狀態(tài),接收CRC數據,然后轉換為END狀態(tài),并在這一狀態(tài)驗證CRC以判斷響應是否正確接收。由此即可完成一次響應的接收。
數據接口模塊的作用是向eMMC芯片發(fā)送數據和接收eMMC發(fā)來的數據。數據接口模塊依照eMMC 5.1標準中HS400工作模式形成數據包和解析接收到的數據。數據接口模塊接收讀寫控制模塊傳來的數據,按照發(fā)送流程發(fā)送給eMMC芯片,并檢查寫入是否成功;接收eMMC芯片發(fā)來的數據,并檢查接收到的數據是否存在錯誤,成功接收后將數據上傳讀寫控制模塊。
發(fā)送數據時,當讀寫控制模塊準備好數據后,向命令接口模塊和數據接口模塊發(fā)送寫數據命令。數據接口模塊從IDLE狀態(tài)轉換為START狀態(tài),在此狀態(tài)下在8位數據線上發(fā)送1個時鐘周期的開始信號,然后轉化為DATA狀態(tài)。在DATA狀態(tài)下,發(fā)送256個時鐘周期的數據信號,數據信號在時鐘的上升沿和下降沿發(fā)送,一個時鐘周期發(fā)送2字節(jié)數據,共發(fā)送512字節(jié)數據。在發(fā)送數據時計算CRC,當完成發(fā)送數據時狀態(tài)轉化為CRC,此時發(fā)送16個時鐘周期的CRC數據,然后轉化為CHECK狀態(tài)。在CHECK下檢查eMMC是否寫入成功,若寫入成功,則轉入IDLE狀態(tài)等待下一個寫數據命令;若寫入失敗,則轉入START狀態(tài)重復以上流程重新寫入當前數據。
接收數據時,當讀寫控制模塊需要讀取數據時,向命令接口模塊和數據接口模塊發(fā)送讀數據命令。數據接口模塊從IDLE狀態(tài)轉換為START狀態(tài),等待eMMC數據線上出現開始信號。當等待開始信號超時時,數據接口模塊狀態(tài)返回IDLE狀態(tài)并向讀寫控制模塊報告狀態(tài),等待下一次命令。當eMMC數據線上出現開始信號后,狀態(tài)轉化為DATA,開始接收256個時鐘周期的數據。每個時鐘周期的上升沿和下降沿都會傳輸數據,共接收512字節(jié)數據。在接收數據的同時計算CRC。當接收數據完成后,狀態(tài)轉換為CRC狀態(tài),接收16個時鐘的CRC數據。接收完CRC后轉換為CHECK狀態(tài),將計算得到的CRC和接收到的CRC比較,若一致,則接收成功,否則接收失敗,向讀寫控制模塊報告狀態(tài)后返回IDLE狀態(tài),完成接收。
初始化模塊的作用是初始化eMMC芯片,使其進入傳輸模式,準備好進行讀寫等操作。對于eMMC的初始化,模塊遵循eMMC5.1標準中的初始化流程進行。
初始化模塊通過向命令接口模塊發(fā)送命令,控制命令接口模塊將指定的初始化命令發(fā)送給eMMC芯片;同時獲取命令接口模塊回報的發(fā)送結果。
當系統(tǒng)上電后,初始化模塊首先發(fā)送CMD0,對eMMC芯片進行軟復位,使其進入IDLE狀態(tài)。隨后發(fā)送CMD1,當eMMC芯片準備完成后進入READY狀態(tài)。此時發(fā)送CMD2獲取芯片的CID,使其進入IDENTFICATION狀態(tài)。然后發(fā)送CMD3為芯片設置地址,芯片進入STANDBY狀態(tài)。然后發(fā)送CMD7選中該芯片,進入SETBW狀態(tài)。接著發(fā)送CMD6設置位寬為8位,進入SETHS400狀態(tài)。最后發(fā)送CMD6設置工作模式為HS400模式,進入DONE狀態(tài)。這樣就完成了eMMC芯片的初始化。當在任何狀態(tài)下出現發(fā)送錯誤時,系統(tǒng)均進入ERROR狀態(tài),在此狀態(tài)下發(fā)送CMD0復位eMMC芯片,使其進入IDLE狀態(tài),重復以上過程,直到初始化成功。
在芯片成功完成初始化后,芯片就可以接收讀寫控制命令進行數據傳輸等操作了。初始化模塊會監(jiān)控芯片的工作狀態(tài),當出現異常狀態(tài)時,可以對芯片重新初始化。
讀寫控制模塊實現了對eMMC芯片的數據讀取、寫入和擦除操作。讀寫控制模塊接收上級傳來的命令,并按照eMMC5.1標準中的讀、寫、擦除操作流程進行工作。
當沒有操作命令時,模塊處于空閑狀態(tài)。當收到新的操作命令后,根據命令進行相應的讀取、寫入或者擦除操作。
當收到讀取數據命令時,模塊狀態(tài)從空閑轉入讀取狀態(tài)。首先設置塊長,通過命令接口模塊發(fā)送CMD16設置此次要讀取的數據塊長度,對于HS400,只支持512字節(jié)塊長;然后設置塊數,發(fā)送CMD23設置需要讀取的數據塊個數;然后發(fā)送多塊讀命令,發(fā)送CMD18開始讀取數據;在讀數據狀態(tài)向數據接口模塊發(fā)送讀取數據命令,等待數據讀取完成。當讀取完成后進入檢查狀態(tài),檢查讀取是否成功,并向上返回狀態(tài)。讀取完成后進入空閑狀態(tài)等待下一個命令。
當收到寫入數據命令時,模塊從空閑狀態(tài)轉入寫入狀態(tài)。首先設置塊長和設置塊數,與讀數據命令相同,也是通過命令接口模塊發(fā)送CMD16和CMD23完成。然后發(fā)送多塊寫命令,發(fā)送CMD25開始寫入數據;在寫數據狀態(tài)向數據接口模塊發(fā)送寫入數據命令,等待數據寫入完成。當寫入完成后進入檢查狀態(tài),檢查寫入是否成功,并向上返回狀態(tài)。寫入完成后進入空閑狀態(tài)等待下一個命令。
當收到擦除命令時,模塊從空閑狀態(tài)轉入擦除狀態(tài)。首先通過命令接口模塊發(fā)送CMD35設置需要擦除數據的起始地址,然后發(fā)送CMD36設置結束地址,最后發(fā)送CMD38開始擦除數據,狀態(tài)進入檢查狀態(tài),等待擦除完成。當擦除完成后向上返回狀態(tài),并進入空閑狀態(tài)等待下一個命令。
通過一段時間的編寫調試,成功地完成了該eMMC磁盤陣列控制器的設計。通過使用上位機軟件測試,該控制器能夠以超過1GB每秒的速度讀取eMMC中的數據,實現了高速讀寫eMMC芯片的設計目標。