唐超
(深圳市匯頂科技股份有限公司,四川 成都610041)
該基于FPGA 的Nandflash 存儲(chǔ)模塊的設(shè)計(jì)是隸屬于隨鉆測(cè)井系統(tǒng)的科研子項(xiàng)目,總體上要求該模塊達(dá)到以下指標(biāo):a.數(shù)據(jù)出錯(cuò)概率不大于0.1%。存儲(chǔ)模塊作為隨鉆測(cè)井系統(tǒng)中保存原始數(shù)據(jù)的唯一單元,其可靠性和安全性就是儀器的生命線,保證數(shù)據(jù)安全可靠將是本設(shè)計(jì)的重中之重。b. 存儲(chǔ)容量不小于32Gb,電路面積盡可能小。隨鉆測(cè)井系統(tǒng)一次工作會(huì)生成大量的數(shù)據(jù),一般最大可達(dá)30Gb,為保證測(cè)井?dāng)?shù)據(jù)不丟失,存儲(chǔ)模塊必須有足夠的空間容納數(shù)據(jù),同時(shí)要留出一定裕量空間。另外儀器上的空間資源是非常珍貴的,要求在設(shè)計(jì)存儲(chǔ)模塊時(shí)在保證存儲(chǔ)容量的前提下應(yīng)盡量減小電路面積。c.數(shù)據(jù)下載速率不小于5Mbps。
Nandflash 屬于閃存的一種,是一種非易失性存儲(chǔ)器,相較于Norflash 具有單片容量大、讀寫速度快、功耗低、溫度性能好等優(yōu)點(diǎn)[1],但其控制器設(shè)計(jì)相對(duì)也更加復(fù)雜。目前常見的隨鉆密度測(cè)井系統(tǒng)的存儲(chǔ)介質(zhì)一般都是Norflash,主要是因?yàn)镹orflash控制簡(jiǎn)單、操作方便,但由于Norflash 單片容量較小,常見的有512Mb/1Gb/2Gb[2],一般使用Norflash 的隨鉆測(cè)井系統(tǒng)的存儲(chǔ)容量都較小,因?yàn)橐雽?shí)現(xiàn)較大的存儲(chǔ)容量將會(huì)占隨鉆測(cè)井儀器上很大的物理空間,這在實(shí)際應(yīng)用中是不被允許的。因此本設(shè)計(jì)使用Nandflash 作為存儲(chǔ)介質(zhì),犧牲控制器的復(fù)雜度換取存儲(chǔ)大容量、小面積的特性。
對(duì)于Nandflash 控制器的選擇,本設(shè)計(jì)在全面比較FPGA 和MCU 的基礎(chǔ)上,決定采用并行處理能力更強(qiáng)的FPGA 作為控制器,同時(shí)由于FPGA 的設(shè)計(jì)更為靈活,發(fā)現(xiàn)問題可直接更改設(shè)計(jì),減少了投片的風(fēng)險(xiǎn),節(jié)省開支[3]。
Nandflash 存儲(chǔ)模塊包括數(shù)據(jù)采集、實(shí)時(shí)存儲(chǔ)以及數(shù)據(jù)下載三個(gè)單元。采集單元由FPGA 控制高速ADC 實(shí)現(xiàn);實(shí)時(shí)存儲(chǔ)單元由FPGA 控制Nandflash 實(shí)現(xiàn),同時(shí)使用RAM緩存數(shù)據(jù);數(shù)據(jù)下載單元由FPGA 控制UART 收發(fā)器實(shí)現(xiàn)。按照數(shù)據(jù)采集- >緩存- >存儲(chǔ)- >下載流程,硬件設(shè)計(jì)考慮如下。
構(gòu)建“FPGA+ADC”的數(shù)據(jù)采集架構(gòu),通過FPGA 控制高速ADC 采樣、量化函數(shù)信號(hào)發(fā)生器輸出的穩(wěn)定模擬信號(hào),將采樣數(shù)據(jù)作為存儲(chǔ)模塊的輸入數(shù)據(jù)存入存儲(chǔ)器中。
構(gòu)建“FPGA+雙RAM”數(shù)據(jù)緩存架構(gòu),采用乒乓切換技術(shù)[4],一片RAM用于實(shí)時(shí)緩存ADC 采集到的數(shù)據(jù),另一片RAM 用于將緩存的數(shù)據(jù)存入Nandflash,以保證數(shù)據(jù)連續(xù)采集。在數(shù)據(jù)下載階段,一片RAM用于接收緩存從Nandflash 中讀取的數(shù)據(jù),另一片RAM用于將已緩存好的數(shù)據(jù)上傳到PC 端,可實(shí)現(xiàn)數(shù)據(jù)的連續(xù)不間斷下載。
以Nandflash 為存儲(chǔ)介質(zhì),FPGA 為控制器, 構(gòu)建“FPGA+Nandflash”數(shù)據(jù)實(shí)時(shí)存儲(chǔ)架構(gòu),由FPGA 控制Nandflash實(shí)現(xiàn)數(shù)據(jù)的實(shí)時(shí)存儲(chǔ)。
采用UART 串口總線為數(shù)據(jù)下載總線,以FPGA 為串口控制器,構(gòu)建“FPGA+ UART 收發(fā)器”數(shù)據(jù)下載架構(gòu),同時(shí)使用乒乓切換技術(shù),實(shí)現(xiàn)數(shù)據(jù)連續(xù)不間斷下載。
基于以上考慮,設(shè)計(jì)的基于FPGA 的Nandflash 存儲(chǔ)模塊結(jié)構(gòu)框圖如圖1 所示。FPGA 通過標(biāo)準(zhǔn)的O NFI 接口與Nandflash通信,實(shí)現(xiàn)數(shù)據(jù)的寫入與讀出;使用兩塊乒乓RAM 緩存數(shù)據(jù);通過UART 串口將數(shù)據(jù)傳輸下載搭配PC 端。
圖1 基于FPGA 的Nandflash 存儲(chǔ)模塊硬件框圖
軟件設(shè)計(jì)的主要任務(wù)是在FPGA 內(nèi)設(shè)計(jì)實(shí)現(xiàn)各種功能接口,保證各功能單元正常運(yùn)行,下面逐一介紹各功能接口。
在FPGA 內(nèi)實(shí)現(xiàn)一個(gè)ADC 接口控制器單元,控制高速ADC定時(shí)連續(xù)采集量化信號(hào)發(fā)生器輸出的信號(hào),并將采樣得到的數(shù)據(jù)作為存儲(chǔ)模塊的輸入數(shù)據(jù)。
在FPGA 內(nèi)實(shí)現(xiàn)RAM接口控制單元,該接口控制單元可由FPGA 廠商提供的IP 核生成。數(shù)據(jù)緩存采用的是乒乓切換技術(shù)將數(shù)據(jù)依次緩存于在兩塊RAM中,在RAM接口單元內(nèi),ADC端的輸入數(shù)據(jù)將被轉(zhuǎn)換為RAM地址,然后在對(duì)應(yīng)的地址上執(zhí)行加一操作,完成數(shù)據(jù)記錄。上電初始,系統(tǒng)默認(rèn)設(shè)置RAM1 為用于緩存數(shù)據(jù)的RAM,RAM2 為空閑態(tài);正常工作期間,當(dāng)接收到切換RAM命令時(shí),RAM接口控制單元首先檢測(cè)當(dāng)前RAM是否正在被占用,如果有程序正在對(duì)RAM進(jìn)行操作,那么RAM接口控制單元就會(huì)等到RAM空閑的時(shí)候再切換RAM,否則立即切換。
在FPGA 內(nèi)實(shí)現(xiàn)Nandflash 控制器模塊。設(shè)計(jì)的重點(diǎn)是壞塊管理和ECC 校驗(yàn)的實(shí)現(xiàn),本設(shè)計(jì)中使用的是基于塊替換的壞塊管理辦法,基于漢明碼的ECC 校驗(yàn)方法??刂破髂K邏輯結(jié)構(gòu)圖2 所示,分為底層邏輯和上層邏輯,其中底層邏輯是對(duì)Nandflash 的基本操作,上層邏輯是將基本的Flash 操作進(jìn)行封裝以實(shí)現(xiàn)實(shí)際功能需求。
3.3.1 壞塊管理
壞塊是指Nandflash 中不能保證數(shù)據(jù)可靠的block 塊,壞塊一般有兩種來源:一個(gè)是出廠壞塊,廠商會(huì)進(jìn)行標(biāo)記,另一個(gè)是用戶壞塊,是用戶在使用過程中產(chǎn)生的[5],所謂壞塊管理就是正確識(shí)別、標(biāo)識(shí)壞塊并采用一定的辦法保證壞塊的存在不影響Nandflash 的使用。設(shè)計(jì)中使用了三種方法來認(rèn)定壞塊:第一,第一次上電時(shí)讀取特定位置的出廠信息,找到出廠壞塊;第二,當(dāng)擦除某個(gè)block 失敗時(shí),將該塊標(biāo)識(shí)為壞塊;第三,當(dāng)發(fā)生編程失敗時(shí),直接將當(dāng)前block 標(biāo)識(shí)為壞塊。本設(shè)計(jì)采用的是基于塊替換的壞塊管理辦法,基本思路是將Nandflash 存儲(chǔ)空間劃分為劃分為工作區(qū)和保留區(qū),保留區(qū)占比一般為2%左右[6],工作區(qū)是數(shù)據(jù)存儲(chǔ)區(qū);當(dāng)工作區(qū)出現(xiàn)壞塊時(shí),從保留區(qū)找出一塊空閑的好塊,更新邏輯地址- 物理地址映射表,將壞塊對(duì)應(yīng)的邏輯地址映射到保留區(qū)的好塊上,從而達(dá)到規(guī)避壞塊的目的?;趬K替換的壞塊管理辦法可使邏輯地址始終保持聯(lián)系,對(duì)上層用戶來說是感覺不到壞塊有壞塊存在的。
3.3.2 ECC 校驗(yàn)
圖2 Nandflash 控制器邏框圖
Nandflash 由于其物理特性和制造工藝的限制,存在bit 翻轉(zhuǎn)誤碼現(xiàn)象,需要進(jìn)行糾錯(cuò)處理。因此使用了基于漢明碼(hanmming code)的ECC 校驗(yàn)方法,該方法能夠糾正1-bit 錯(cuò)誤,發(fā)現(xiàn)2-bit 錯(cuò)誤[7]。ECC 校驗(yàn)方法的基本思路是當(dāng)往Nandflash中寫入數(shù)據(jù)時(shí),把每256 字節(jié)的原始數(shù)據(jù)按照一定的規(guī)則進(jìn)行異或運(yùn)算生成3 字節(jié)的ECC 校驗(yàn)碼,然后將ECC 校驗(yàn)碼寫入OOB 區(qū)(out-of-band);當(dāng)從Nnandflash 中讀取數(shù)據(jù)時(shí),把每256字節(jié)的讀出數(shù)據(jù)再按相同的規(guī)則進(jìn)行異或運(yùn)算生成3 字節(jié)的ECC 校驗(yàn)碼,最后將寫入時(shí)生成的ECC 校驗(yàn)碼和讀出是生成的ECC 校驗(yàn)碼按位異或,若結(jié)果為全0,則表示無錯(cuò)誤(或出現(xiàn)了ECC 無法糾正的錯(cuò)誤),若結(jié)果中有11 個(gè)bit 為1,則表示存在一個(gè)錯(cuò)誤且可以糾正,若結(jié)果中自存在1 個(gè)bit 為1,則表示OOB 去發(fā)生錯(cuò)誤,其余情況表示出現(xiàn)了無法糾正的錯(cuò)誤。
在FPGA 內(nèi)實(shí)現(xiàn)UART 串口控制單元。串口控制單元的核心是UART 收發(fā)串口,再輔以命令解析、執(zhí)行模塊,當(dāng)收到下載數(shù)據(jù)的命令后,自動(dòng)完成數(shù)據(jù)下載。
實(shí)驗(yàn)條件如下:
4.1 FPGA 芯 片 為 Xilinx 的 XA3S500E-4PQ G208;Nandflash 存儲(chǔ)器為青島智騰的LDMF4GA;ADC 為TI 的ADS7883;SRAM 為CYPRESS 的CY7C1049CV 33;UART 串 口芯片為HO LT 公司的HI-4853。
4.2 測(cè)試環(huán)境:Nandflash 控制模塊、上位機(jī)PC。使用FPGA內(nèi)部生成的模擬數(shù)據(jù)測(cè)試,通過寫入1Gb 數(shù)據(jù)后再讀出,觀察數(shù)據(jù)是否與預(yù)期一致,表1 列出了數(shù)據(jù)可靠性測(cè)試結(jié)果,共進(jìn)行了4 組測(cè)試。
表1 模塊讀寫可靠性測(cè)試
使用 FPGA 內(nèi)部生產(chǎn)的模擬數(shù)據(jù), 分批寫入1Gbit.2Gbit,3Gbit,… … ,30Gbit, 31Gbit, 32Gbit,測(cè)試模塊的數(shù)據(jù)下載速率。圖3 為下載速率測(cè)試結(jié)果,其中值為100 次實(shí)驗(yàn)平均值。
圖3 下載速率測(cè)試曲線
結(jié)果分析,基于FPGA 的Nandflash 存儲(chǔ)模塊相較于常規(guī)的以Norflash 為存儲(chǔ)介質(zhì)的存儲(chǔ)模塊在容量上有了很大的提高,同時(shí)電路面積也減小了很多,數(shù)據(jù)錯(cuò)誤概率約為0.029%,數(shù)據(jù)下載的平均速率約5Mbps,以上指標(biāo)均滿足設(shè)計(jì)要求。此外,所有的控制接口單元均在FPGA 內(nèi)部以硬件電路的形式實(shí)現(xiàn),降低了對(duì)操作系統(tǒng)的依賴。
本文介紹了基于FPGA 的Nandflash 存儲(chǔ)模塊的性能指標(biāo)要求、軟硬件設(shè)計(jì),該型存儲(chǔ)模塊針對(duì)隨鉆測(cè)井系統(tǒng)對(duì)數(shù)據(jù)可靠性要求高、數(shù)據(jù)量大的特點(diǎn),定制化的給出了基于“FPGA+Nandflash”架構(gòu)的設(shè)計(jì)方案,其核心就是通過FPGA 對(duì)Nandflash 進(jìn)行讀寫調(diào)度和差錯(cuò)控制,輔以數(shù)據(jù)采集和下載功能。本設(shè)計(jì)的重點(diǎn)難點(diǎn)是Nandflash 控制核心的設(shè)計(jì),其中尤以壞塊管理和ECC 校驗(yàn)的實(shí)現(xiàn)最為重要,這是保證數(shù)據(jù)可靠性的關(guān)鍵。
當(dāng)前,該型存儲(chǔ)模塊已成功實(shí)現(xiàn)商用,各項(xiàng)性能指標(biāo)均滿足用戶需求。下一步考慮從數(shù)據(jù)的實(shí)時(shí)壓縮和Nandflash 磨損均衡的實(shí)現(xiàn)這兩方面入手,以期大幅提升模塊的存儲(chǔ)容量、數(shù)據(jù)的可靠性以及延長(zhǎng)Nandflash 的使用壽命。