












摘 "要: 由于目前采用的串口和USB 2.0檢測壞塊、實現數據讀取的方法存在數據讀取慢以及數據穩定性低的問題,而在高速大容量存儲裝置設計中,存儲器通常采用NAND FLASH,故提出一種基于USB 3.0總線的NAND FLASH數據存儲設計。采用FPGA作為邏輯主控單元,選用USB 3.0芯片CYUSB3014作為FPGA與上位機的通信橋梁,并在FPGA軟件上設計ECC數據校驗糾錯以及NAND FLASH的壞塊管理。用戶可通過上位機實現數據讀取、擦除以及分析。實驗結果表明,所設計系統可通過USB 3.0接口將NAND FLASH中存儲的數據傳輸到上位機,傳輸速度實際可達39 MB/s。
關鍵詞: 數據存儲; NAND FLASH; FPGA; USB 3.0; 壞塊管理; 數據校驗; 高速數據處理; 上位機
中圖分類號: TN791?34; TP391 " " " " " " " " " 文獻標識碼: A " " " " " " " " " " "文章編號: 1004?373X(2024)18?0101?06
Design of NAND FLASH data storage based on USB 3.0
BAI Haoyu, YU Hongying, NIU Yankun
(School of Electrical and Control Engineering, North University of China, Taiyuan 030051, China)
Abstract: In allusion to the problems of slow data reading and low data stability in the current serial port and USB 2.0 methods for detecting bad blocks and implementing data reading, NAND FLASH is commonly used in the design of high?speed and high?capacity storage devices. A NAND FLASH data storage design based on the USB 3.0 bus is designed. FPGA is used as the logic control unit, the USB 3.0 chip CYUSB3014 is used as the communication bridge between FPGA and upper computer, and ECC data verification and error correction as well as bad block management for NAND FLASH are designed on FPGA software. Users can read, erase, and analyze data by means of the upper computer. The experimental results show that the designed system can transfer the data stored in NAND FLASH to the upper computer by means of the USB 3.0 interface, and the actual transmission speed can reach 39 MB/s.
Keywords: data storage; NAND FLASH; FPGA; USB 3.0; bad block management; data verification; high?speed data processing; upper computer
0 "引 "言
NAND FLASH數據存儲廣泛應用于航空航天的高速數據采集存儲設備中[1]。在進行數據分析時,FPGA向計算機高速傳輸數據,最常用的數據連接方式有串口、USB 2.0或千兆以太網等[2]。文獻[3]中采用千兆以太網的方式,其理論速度為125 MB/s,速度較慢,且開發周期長。文獻[4]中則建議采用USB 2.0總線方法,讀出8 MB的數據不足1 s。雖然可以使用上位機進行實時的壞塊管理,但缺乏數據校驗,且傳輸速度較慢。
針對以上總線傳輸以及NAND FLASH控制等問題,選用USB 3.0總線作為FPGA與上位機的通信接口,其理論通信速度為5 Gb/s。較為常用的USB 3.0方案為Cypress Semiconductor(賽普拉斯半導體)的CYUSB3014、TI(德州儀器)的TUSB1310、FDTI的FT600等[5]。其中,TUSB1310沒有USB 3.0通信協議控制器,需要加入外部控制,或直接由主控芯片控制,軟件驅動程序以及開發資源較少,開發時間較長;FT600芯片相較于其他芯片成本較高,可自主編程性較低,不適合自主開發;CYUSB3014內置一個ARM9內核處理器,集成了USB 3.0通信協議控制器,可依據用戶自身需求設計不同的固件程序進行燒寫。芯片公司提供豐富的軟件開發工具和套件,簡化了開發過程;并且針對NAND FLASH數據存儲的問題,設計ECC數據校驗糾錯和NAND FLASH壞塊管理,保證在高速數據記錄中,數據能夠高速穩定傳輸,為高速大容量數據采集和存儲提供技術保障。本文選用CYUSB3014芯片作為USB 3.0通信的主控芯片,選用ALTERA(阿爾特拉)公司的EP4CE10F17C8N作為主控芯片,其具有傳輸速度快、硬件設計簡單、可自主開發、USB 3.0適用場景多等優點。針對NAND FLASH的固有數據存儲問題,在FPGA軟件系統中設計數據校驗和壞塊管理,保證實驗數據存儲的準確性。
1 "總體方案設計
基于USB 3.0總線NAND FLASH的控制總體設計方案由USB 3.0通信單元、FPGA主控單元和上位機單元組成,如圖1所示。選用CYUSB3014芯片實現FPGA主控單元與PC之間的通信。以FPGA為主控單元設計通用I/O口,并合理利用FPGA中的存儲單元,實現對于NAND FLASH的讀、寫、擦、數據校驗以及壞塊管理等工作。設計上位機通過USB 3.0通信單元與FPGA主控單元完成數據交互、命令傳輸以及數據分析等工作。選擇K9WBG08U1M型NAND FLASH作為數據存儲單元。
2 "USB 3.0硬件及固件程序設計
選擇賽普拉斯(CYPRESS)公司的FX3USB 3.0芯片CYUSB3014,相較于USB 2.0,解決了USB 2.0的帶寬限制和單獨開發USB協議困難等難題[6]。賽普拉斯公司把這代USB 3.0芯片CYUSB3014稱為EZ?USB FX3。在使用此芯片時只需下載固件庫進行開發,具有高靈活性。
USB 3.0芯片工作的目的是實現PC機和FPGA信息交流、數據傳輸以及命令傳輸。USB 3.0與FPGA連接的接口為GPIF Ⅱ接口。EZ?USB FX3的GPIF Ⅱ接口可完美實現USB 2.0的GPIF接口以及Slave FIFO接口的功能。GPIF Ⅱ支持32位并行數據總線,接口時鐘的傳輸頻率最大為100 MHz。
采用GPIF Ⅱ接口將EZ?USB FX3配置為SLAVE FIFO模式,CYUSB3014與FPGA的接口如圖2所示。選擇FPGA作為EZ?USB FX3的控制器,通過GPIF Ⅱ接口進行數據讀取,實現FPGA與上位機之間的數據通信[7],具體接口信號如表1所示。EZ?USB FX3通過Micro?B接口與計算機連接,完成數據傳輸以及固件程序的燒寫。24LC256為一個E2PROM為EZ?USB FX3的儲存固件程序。
通過Cypress官方提供的SDK軟件進行具體的固件程序配置,首先配置兩個SLAVE FIFO,FLAGB為FIFO寫滿標志,為FPGA向計算機發送的數據緩沖區,為線程0;FLAGC為FIFO讀空標志,為計算機向FPGA發送命令或數據的緩沖區,為線程1。FX3_IFCLK接口時鐘通過FPGA向GPIF Ⅱ接口提供。FX3_SLWR和FX3_SLRD根據FLAGB與FLAGC信號進行驅動,數據通信總線[8?9]為32位。將固件程序配置好之后,燒寫入EZ?USB FX3,完成USB 3.0固件設計。
3 "FPGA軟件設計
Altera公司的EP4CE10F17C8N使用Verilog語言在Quartus Ⅱ開發環境下進行軟件開發。FPGA內部邏輯結構如圖3所示。FPGA內部結構主要包括USB 3.0通信模塊、NAND FLASH控制模塊、數據校驗模塊以及壞塊管理模塊等。
3.1 "USB 3.0通信
USB 3.0通信模塊主要功能有兩個,一是接收來自NAND FLASH中讀出的數據,通過SLAVE FIFO將該數據打包發送至EZ?USB FX3芯片,實現數據發送;二是把EZ?USB FX3芯片收到的上位機命令進行進一步解析,來控制NAND FLASH完成數據讀寫。
整個USB通信模塊使用狀態機實現,如圖4所示。上電時進入復位狀態FX3_RESET,在FX3_RESET之后的一個時鐘進入下一個狀態。
在FX3_IDLE狀態,此時等待上位機發送命令,當收到命令后,進入下一個狀態FX3_WAIT狀態,分析上位機傳來的數據,獲得NAND FLASH讀取的目標片、塊地址和頁地址,然后判斷FLAGB是否為1,若不為1,則進入下一狀態,FX3_WRITE從NAND FLASH的目標片、目標塊和頁中讀數據寫入到SLAVE FIFO端口中;否則返回FX3_BUSY狀態,等待SLAVE FIFO可寫入數據時,進入FX3_WRITE狀態。當數據寫完成后進入FX3_BUSY,然后返回FX3_IDLE等待下一個命令接收。綜上所述,這樣就完成了FPGA通過EZ?USB FX3實現與上位機的通信。
因FX3與FPGA數據總線為32位并行接口,且NAND FLASH為8位接口,在數據讀取時,在FPGA將8位數據拼成32位數據后賦給FIFO,進而寫入EZ?USB FX3的SLAVE FIFO接口。
3.2 "ECC校驗算法設計
漢明碼是ECC編碼中最簡單且使用最廣泛的編碼方式。漢明碼編碼的實際應用可理解為異或以及二分法。如在4 096個數據作為數據校驗單元進行數據校驗時,本文把4 096個數據劃分為8列4 096行,每個字節中的每1位為1列,每1字節數據代表1行;然后對行和列的每1位進行異或,得到6個列校驗值以及24個行校驗值[10?11]。具體編碼流程如圖5所示。
圖5中,CP0~CP5為列校驗結果。將4 096個數據按照輸入的位進行異或,如CP0為Bit0、Bit2、Bit4和Bit6異或的結果,以此類推可得到剩下的CP。具體計算公式如下:
[CP0=Bit0⊕Bit2⊕Bit4⊕Bit6CP1=Bit1⊕Bit3⊕Bit5⊕Bit7CP2=Bit0⊕Bit1⊕Bit4⊕Bit5CP3=Bit2⊕Bit3⊕Bit6⊕Bit7CP4=Bit0⊕Bit1⊕Bit2⊕Bit3CP5=Bit4⊕Bit5⊕Bit6⊕Bit7]
LP0~LP23為行校驗結果,選擇以n(n=0,1,2,…,11)為最小單位進行分組。奇數行和偶數行分別作為組別,對于每一組別的數據按位異或,得到LP0~LP23共24位的校驗值。將LP0所對應的偶數行組別的數據(Byte 0,Byte 2,Byte 4,…,Byte 4 092,Byte 4 094)按位異或得出每一個字節的異或結果,進而把這2 048個異或結果進行異或得出LP0。將LP2所對應的偶數行組別的數據(Byte 0,Byte 2,Byte 4,…,Byte 4 092,Byte 4 094)按位異或得出每一個字節的異或結果,進而把這2 048個異或結果進行異或得出LP2。由上文可推導4 096個8位數據的校驗碼為30位的校驗值(6位列校驗值,24位行校驗值),按照表2將這30位校驗值拼接成4個字節的校驗數據。
3.2.1 "數據驗證
首先將FLASH存儲的4 096個字節的數據讀出,將讀出的數據進行一次新的漢明碼編碼,得到新的30位(CP0~CP5、LP0~LP23)校驗碼。將新得到的數據校驗碼與寫入數據時的數據校驗碼按位異或,得到30位數據校驗結果N。若N的30位數據全為0時,說明數據正確;N的30位數據每兩位相異或再將異或的結果相與,若結果為1時說明有一位數據錯誤;若N的數據不為以上兩種情況,說明數據有2位或2位以上發生錯誤。
3.2.2 "錯誤糾正
如上文發現1位數據錯誤時,選擇漢明碼解碼的形式對錯誤的單位數據進行地址尋址。將數據存入和讀取之后的校驗碼排序,得到兩組數據,進而對于兩組數據進行按位異或,得到15位數據C。
錯誤的位置在總共4 096個字節中的第C[14:3]字節,并且錯誤數據的位是該字節數據的第C[2:0]位,將該位的數據取反,完成錯誤糾正。
3.3 "NAND FLASH控制
NAND FALSH使用前,需識別初始化無效塊并建立壞塊表。在之后存儲數據時,如果出現了使用壞塊應及時更新壞塊表以保證數據存儲的可靠性。出現使用壞塊有三種情況。
1) 頁編程結束后,讀取編程狀態,如果編程失敗標記為使用壞塊。
2) 塊擦除結束后,讀取擦除狀態,如果擦除失敗標記為使用壞塊。
3) 頁讀取結束后,使用ECC校驗發現讀取過程中出現的位反轉錯誤,若發生位反轉錯誤,不標記為壞塊。
標記為壞塊的塊不會再進行頁編程、塊擦除和頁讀取操作[12?13]。在以上思路的基礎上,本文設計了一種基于ECC校驗算法的NAND FLASH可靠數據管理方法,流程如下[14]。
3.3.1 "識別初始化無效塊
根據使用的芯片官方手冊,芯片出廠時會在出廠之前除了帶有初始無效塊信息的位置沒有被擦除,其余所有位置都會被擦除。初始無效塊的狀態記錄在備用空間的第1 B。芯片廠家保證在初始無效塊的第1頁和第2頁的第2 048 B地址上的數據不是FFh。由于初始無效塊也是能被擦除的,而且一旦擦除就不可恢復,因此系統必須在第一次使用之前通過隨機讀指令識別出初始無效塊。
3.3.2 "建立壞塊表
識別初始無效塊后,根據初始無效塊建立一張壞塊表。該壞塊表一共有2 KB數據,其中每一個bit代表一個塊的好壞(0表示好塊,1表示壞塊),前1 KB數據代表芯片第一片的 8 192個塊,后1 KB數據代表芯片第二片的8 192個塊。將壞塊表建立完成之后,由于芯片廠家保證第1個塊,也就是塊地址為00h的塊一定是有效塊,因此將壞塊表經過ECC編碼后存入第1片第1塊的第1頁中。
3.3.3 "擦除塊
由于NAND FLASH的特性,在每個塊寫入數據之前,都要確保該塊已經被擦除成功。使用的NAND FLASH芯片有一個狀態寄存器,可以通過讀取這個狀態寄存器來判斷是否已完成編程和擦除操作以及這兩種操作已經成功完成。
擦除塊之前要先從NAND FLASH中讀出存儲在第1片第1塊的第1頁中的壞塊表并保存在FPGA的RAM中。擦除時根據壞塊表只對好塊進行擦除,在塊擦除操作完成后,讀取狀態寄存器,如果寄存器顯示擦除失敗,則將該塊在壞塊表中的對應位置寫為1。全部塊擦除完成后將更新的壞塊表重新寫入到NAND FLASH中。
3.3.4 "頁編程
頁編程是往NAND FLASH中寫入數據。與擦除塊一樣,在頁編程之前要將壞塊表讀到FPGA的RAM中。頁編程時要跳過壞塊并且要對每頁數據進行ECC編碼,將存儲數據和校驗數據分別放在NAND FLASH的數據存儲區和數據備用區中。頁編程的具體操作以頁為基本單位,當命令輸入完成判斷芯片是否完成頁編程,當該頁頁編程完成后讀取狀態寄存器,如果頁編程失敗,將正在執行頁編程的塊更新到壞塊表中,并且將該塊數據復制到下一個好塊中。同樣在頁編程完成后將更新的壞塊表重新寫入到NAND FLASH中。
3.3.5 "讀數據
在讀數據之前將壞塊表讀到FPGA的RAM中,讀出數據后在FPGA中進行漢明碼譯碼和糾錯,最后發送給上位機。如果漢明碼譯碼過程中發現位反轉,則將該頁所在塊標定為壞塊,更新到壞塊表中。在讀數據完成后將更新的壞塊表重新寫入到NAND FLASH中[15]。
4 "FPGA驗證
4.1 "ECC校驗算法驗證
ECC編碼模塊每4 096 B數據生成4 B校驗碼,編碼模塊設計為并行接口,實現了對NAND FLASH整頁數據進行編碼。漢明碼編碼結果仿真如圖6所示。圖中,data_in為寫入數據;data_out為編碼得到的校驗碼;“i”表示第幾個周期,如第0個數據為0x80,第1個數據為0x2A。經過4 096個周期,漢明碼編碼完成,漢明碼編碼為256A569A。
將剛才編碼中的第4 095個數據0xD1更改為0xD0。如圖7所示,譯碼模塊檢測出數據的第data_ram_addr_n個字節出現錯誤,對應為這個字節數據的第data_ram_data_n位出現位翻轉。由仿真結果看出,該ECC校驗算法成功實現了對4 096個字節的校驗和糾錯。
4.2 "數據讀取速度實測結果
經過多次重復的數據讀取速度測試,接口速度基本穩定在39 MB/s。速度測試結果如圖8所示。
4.3 "數據讀取實測結果
利用數字信號發生器產生一路周期為10 Hz、峰峰值為488 mV的正弦信號,如圖9所示。通過A/D轉換模塊采集該信號并存儲在NAND FLASH中。通過連接上位機讀出數據并將數據顯示成波形,如圖10所示。實驗結果證明,該系統可以對模擬信號實現精確顯示,并且存儲性能完好。
4.4 "測試結果分析
根據第4.1~4.3節的各種測試結果可得,在NAND FLASH數據傳輸到計算機的過程中,數據傳輸穩定有效,沒有數據的丟失或錯誤。相較于USB 2.0和串口的數據傳輸方式,NAND FLASH數據存儲的速度有較大提升,且對于NAND FLASH的一些存儲可靠性問題,本文設計了數據校驗和壞塊管理模塊。
5 "結 "論
本文設計一個基于USB 3.0的NAND FLASH數據存儲系統,選用CYUSB3014 USB 3.0芯片作為上位機與FPGA的通信模塊,提升了數據與命令傳輸速度;并且設計了NAND FLASH讀寫、數據校驗和壞塊管理來保證數據存儲的準確性。經過FPGA實際驗證,數據傳輸速度達到39 MB/s,且根據上位機的數據分析,通過原數據和存儲數據的比較,后者具有較高的穩定性。綜上,所設計的NAND FLASH數據存儲系統有效解決了實驗數據傳輸速度較慢的問題。
參考文獻
[1] 喬立巖,李元亨,王戈,等.一種NAND FLASH壞塊管理優化方法的實現[J].電子測量技術,2015,38(7):19?21.
[2] 馬賢.基于FPGA的高速數據傳輸接口設計[D].桂林:桂林電子科技大學,2023.
[3] 喬衛東,李躍,郭梁.航空航天相機成像性能測試系統研究[J].電子測量與儀器學報,2020,34(9):9?16.
[4] 申曉敏,錢禮華,杜劍英,等.基于USB 2.0總線的NAND FLASH檢測及控制方法[J].電子技術應用,2023,49(6):44?48.
[5] 李錦明,鄭志旺.基于LVDS和USB 3.0的高速數據傳輸接口的設計[J].電子測量技術,2021,44(7):1?6.
[6] 鄭芳芳,牛廣越,易亮,等.基于USB 3.0的多通道葉尖間隙數據采集系統設計[J].傳感技術學報,2023,36(6):874?880.
[7] 陳松.基于USB 3.0的高速數據傳輸系統的研究與設計[D].成都:電子科技大學,2014.
[8] 劉林仙,喬楠楠,童強,等.基于FPGA的USB 3.0通信接口設計[J].測試技術學報,2021,35(3):261?265.
[9] 華嘉駿.基于AXI總線的USB 3.0控制器的設計與驗證[D].西安:西安電子科技大學,2021.
[10] 趙寬.基于同步FLASH的高速數據記錄儀的設計與實現[D].太原:中北大學,2021.
[11] 朱金瑞,王代華,蘇尚恩,等.存儲式彈載數據記錄儀存儲可靠性技術研究[J].兵器裝備工程學報,2019,40(1):159?162.
[12] 文豐,王雨婷,薛志超,等.某記錄器存儲模塊關鍵技術的研究[J].電子測量技術,2020,43(22):137?141.
[13] 寧飛.大容量存儲中NAND FLASH壞塊的管理方法[J].電子測試,2010(12):64?68.
[14] LI X, NIU Y, YU J, et al. A bad block management design based on space?borne nand FLASH parallel storage system [C]// 2022 14th International Conference on Communication Software and Networks (ICCSN). Chongqing: IEEE, 2022: 114?118.
[15] 張朗,張建華,王鳴濤,等.適用于FPGA與NAND FLASH陣列星載固態存儲器的壞塊管理方法[J].空間電子技術,2023,20(4):98?103.