朱金瑞,王代華,蘇尚恩,王曉楠
(1.中北大學(xué)儀器科學(xué)與動(dòng)態(tài)測(cè)試教育部重點(diǎn)實(shí)驗(yàn)室, 太原 030051; 2.中北大學(xué)電子測(cè)試技術(shù)國(guó)家重點(diǎn)實(shí)驗(yàn)室, 太原 030051; 3.北方導(dǎo)航控制技術(shù)股份有限公司, 北京 100176)
導(dǎo)彈從飛行到落地整個(gè)過(guò)程中,彈載數(shù)據(jù)采集系統(tǒng)對(duì)其內(nèi)部各類參數(shù)信號(hào)進(jìn)行采集分析,能夠判定飛行狀態(tài)是否正常,評(píng)定其性能指標(biāo)。因此,數(shù)據(jù)采集系統(tǒng)的研究在導(dǎo)彈研制過(guò)程中具有重要的作用。彈載數(shù)據(jù)記錄儀是為實(shí)現(xiàn)對(duì)導(dǎo)彈飛行過(guò)程中各通道數(shù)據(jù)的采集存儲(chǔ),并在試驗(yàn)結(jié)束后能夠進(jìn)行準(zhǔn)確回收而研制的一種多通道數(shù)據(jù)采集系統(tǒng)[1-3]。按照存儲(chǔ)介質(zhì)的種類,可分為磁帶式與固態(tài)式存儲(chǔ)系統(tǒng),其中,磁帶式數(shù)據(jù)存儲(chǔ)系統(tǒng)是以磁帶錄音技術(shù)為基礎(chǔ),利用磁性材料上的剩磁效應(yīng)將被測(cè)信號(hào)存儲(chǔ)下來(lái),但因其采用大量機(jī)械元件,致使體積、功耗都比較大,且磁帶式數(shù)據(jù)存儲(chǔ)系統(tǒng)在讀數(shù)時(shí)僅支持順序?qū)ぶ罚x數(shù)過(guò)程耗時(shí)長(zhǎng),為數(shù)據(jù)讀取帶來(lái)很大的困擾[4]。相對(duì)于磁帶存儲(chǔ)系統(tǒng),固態(tài)式存儲(chǔ)系統(tǒng)以半導(dǎo)體介質(zhì)為基礎(chǔ)。半導(dǎo)體存儲(chǔ)介質(zhì)內(nèi)部以半導(dǎo)體電路為基礎(chǔ),具備微體積、存儲(chǔ)速率高以及操作簡(jiǎn)單的優(yōu)點(diǎn)。常用元件有SRAM、DRAM、SDRAM、EPROM、EEPROM以及Flash等,其中Flash存儲(chǔ)芯片具有掉電不丟失、微體積、低功耗的優(yōu)點(diǎn)[5-6]。
本文選用NAND Flash存儲(chǔ)器,以FPGA為主控芯片,設(shè)計(jì)實(shí)現(xiàn)對(duì)彈上16路模擬信號(hào)和8路數(shù)字信號(hào)采集存儲(chǔ)的彈載多通道數(shù)據(jù)記錄儀。針對(duì)導(dǎo)彈飛行過(guò)程中強(qiáng)沖擊、高過(guò)載的惡劣工作環(huán)境,重點(diǎn)開(kāi)展了NAND Flash的無(wú)效塊管理和ECC校驗(yàn)可靠性存儲(chǔ)技術(shù)的研究。
系統(tǒng)主要完成對(duì)彈上各類型傳感器模擬信號(hào)、數(shù)字接口信號(hào)的采集存儲(chǔ),在飛行結(jié)束后,通過(guò)以太網(wǎng)接口對(duì)數(shù)據(jù)進(jìn)行回讀并分析。根據(jù)研制任務(wù)的要求,系統(tǒng)主要完成對(duì)以下各通道信號(hào)的采集存儲(chǔ):
1) 模擬通道參數(shù):4路5 V輸入電壓,采樣率為1 kHz;4路32 V輸入電壓,采樣率為10 kHz;4路±5 V輸入電壓,采樣率為1 kHz,采樣精度優(yōu)于±1%;
2) 數(shù)字通道參數(shù):8路RS422通道,其中4路波特率為115 200 b/s、4路波特率為230 400 b/s。
系統(tǒng)由Xilinx公司Spartan-6系列的FPGA編程實(shí)現(xiàn)對(duì)NAND Flash芯片的時(shí)序控制,進(jìn)而完成對(duì)模擬通道、RS-422數(shù)字通道采樣后數(shù)據(jù)的可靠存儲(chǔ)。基于FPGA的數(shù)據(jù)存儲(chǔ)模塊的邏輯設(shè)計(jì)如圖1所示。
圖1 系統(tǒng)存儲(chǔ)模塊FPGA邏輯設(shè)計(jì)
Flash_ctl模塊用于產(chǎn)生控制NAND Flash的CE、R/B、WE、RE、ALE、CLE等信號(hào);在數(shù)據(jù)存儲(chǔ)狀態(tài)下,接收外部所有通道的采集數(shù)據(jù);在上位機(jī)讀數(shù)狀態(tài)下,讀取芯片內(nèi)部數(shù)據(jù),并發(fā)送至Ethernet控制器。Flash前端的FIFO模塊除在數(shù)字通道數(shù)據(jù)的基礎(chǔ)上加入幀頭、幀尾等識(shí)別字節(jié)的功能之外,主要用于緩存數(shù)據(jù),以匹配模擬通道、RS-422數(shù)字通道的數(shù)據(jù)輸出、Flash的寫(xiě)操作三者間的速率,確保數(shù)據(jù)在Flash頁(yè)編程中不丟失。ECC校驗(yàn)?zāi)K對(duì)采集到的數(shù)據(jù)生成ECC校驗(yàn)碼,以提高數(shù)據(jù)存儲(chǔ)的準(zhǔn)確性。Ethernet控制模塊實(shí)現(xiàn)介質(zhì)訪問(wèn)層(MAC)的功能,對(duì)數(shù)據(jù)編碼封裝,實(shí)現(xiàn)與物理層(PHY)芯片的數(shù)據(jù)和指令的傳輸。
NAND Flash的芯片工藝導(dǎo)致其生產(chǎn)和使用期間會(huì)產(chǎn)生無(wú)效塊,故無(wú)效塊的管理一直是NAND Flash管理的關(guān)鍵和難點(diǎn)[7-9]。傳統(tǒng)無(wú)效塊管理方法是將無(wú)效塊列表存放至NAND Flash的第一塊中,雖然Flash在出廠時(shí)保證第一塊是完好的,但超過(guò)一定的次數(shù),該塊也可能會(huì)變成無(wú)效塊,降低了無(wú)效塊列表存儲(chǔ)的可靠性。本設(shè)計(jì)中,將無(wú)效塊列表存儲(chǔ)至FPGA內(nèi)部RAM中。由于該Flash芯片共有1 024塊,塊地址為10位,則在FPGA內(nèi)部分配一個(gè)2 kB的緩存即可滿足無(wú)效塊表的容量。當(dāng)進(jìn)行存儲(chǔ)操作時(shí),F(xiàn)PGA首先對(duì)要存儲(chǔ)的地址和無(wú)效塊列表中的地址進(jìn)行對(duì)比,之后將數(shù)據(jù)存儲(chǔ)到好塊中;當(dāng)數(shù)據(jù)進(jìn)行讀取操作時(shí),同樣由FPGA依據(jù)無(wú)效塊列表中得出的好塊地址讀取數(shù)據(jù)。無(wú)效塊表的建立和更新流程如圖2所示。
圖2 無(wú)效塊檢測(cè)流程
系統(tǒng)每次上電工作后,首先由FPGA訪問(wèn)NAND Flash,無(wú)效塊檢測(cè)仿真如圖3所示,由隨機(jī)讀命令(05H、E0h)讀取無(wú)效塊標(biāo)志位,若輸出數(shù)據(jù)為“00h”,則表明該塊為無(wú)效塊,之后將相應(yīng)地址寫(xiě)入無(wú)效塊表中。無(wú)效塊管理的設(shè)計(jì)實(shí)現(xiàn)了存儲(chǔ)地址的透明化,使NAND Flash的存儲(chǔ)區(qū)域的邏輯地址仍然能進(jìn)行連續(xù)讀寫(xiě)。
圖3 無(wú)效塊檢測(cè)仿真時(shí)序圖
NAND Flash的結(jié)構(gòu)特點(diǎn)導(dǎo)致數(shù)據(jù)存儲(chǔ)過(guò)程中可能存在誤碼,ECC(Error Correcting Code)作為一種數(shù)據(jù)檢錯(cuò)糾正算法,通過(guò)增加冗余數(shù)據(jù)對(duì)存儲(chǔ)于NAND Flash中的數(shù)據(jù)進(jìn)行編碼,是NAND Flash在使用時(shí)確保數(shù)據(jù)準(zhǔn)確存儲(chǔ)的一項(xiàng)關(guān)鍵技術(shù)[10-12]。本文設(shè)計(jì)了一種基于漢明碼高性能ECC校驗(yàn)方法,采用FPGA實(shí)現(xiàn)并應(yīng)用于NAND Flash存儲(chǔ)邏輯設(shè)計(jì)中。每256 byte原始數(shù)據(jù)通過(guò)計(jì)算得到6 bit列校驗(yàn)碼、16 bit行校驗(yàn)碼,共22 bit,存放于NAND Flash的冗余區(qū),存放格式如表1所示。為加快FPGA的計(jì)算速度,實(shí)現(xiàn)邏輯中事先計(jì)算好256個(gè)數(shù)的各自的列校驗(yàn)碼,并存儲(chǔ)至FPGA內(nèi)部。此方法是以犧牲FPGA內(nèi)部邏輯單元來(lái)?yè)Q取處理速度,利用查找表找出行校驗(yàn)碼和列校驗(yàn)碼。該表以字節(jié)數(shù)做下標(biāo),采用FPGA編程計(jì)算并存儲(chǔ)0~255個(gè)字節(jié)的行校驗(yàn)碼和列校驗(yàn)碼。查找表中的每個(gè)字節(jié)的各bit位的含義如表2所示,各字節(jié)校驗(yàn)的仿真結(jié)果如圖4所示。
表1 ECC校驗(yàn)碼存放格式
表2 查找表中各Bit位對(duì)應(yīng)的內(nèi)容
1) 列校驗(yàn)碼的計(jì)算
校驗(yàn)256字節(jié)的數(shù)據(jù)則相應(yīng)地進(jìn)行256次查表,通過(guò)索引各字節(jié)校驗(yàn)值的查找表,得到ECC索引表的值ecc_pre_data,取出相應(yīng)的列校驗(yàn)值ecc_pre_col,與上字節(jié)的列校驗(yàn)值reg1異或運(yùn)算,由此得到256 byte數(shù)據(jù)的列校驗(yàn)值。仿真結(jié)果如圖5所示。關(guān)鍵代碼如下:
ecc_pre_col<=ecc_pre_data and 0x3F;
reg1<=reg xor ecc_pre_col;
reg<=reg1;
圖5 列校驗(yàn)碼仿真計(jì)算
2) 行校驗(yàn)碼的計(jì)算
由表2可知,ECC索引表中第6位存放每個(gè)字節(jié)的行校驗(yàn)碼,對(duì)輸入數(shù)據(jù)依次索引查表,若ECC校驗(yàn)值的bit6=1,則表示該字節(jié)的行校驗(yàn)為1。根據(jù)行校驗(yàn)原理,RP0只計(jì)算bit0=0的字節(jié),RP1計(jì)算bit0=1的字節(jié),RP2計(jì)算bit1=0的字節(jié),RP3計(jì)算bit1=0的字節(jié),以此類推。因此,將全部行校驗(yàn)為1的輸入數(shù)據(jù)按位異或,得到的結(jié)果保存在reg3中,reg3的bit0、bit1…bit7則分別得出RP1、RP3、RP5…RP13計(jì)算范圍內(nèi)行的數(shù)量。相應(yīng)的寄存器reg2的值表示屬于RP0、RP2、RP4…RP14計(jì)算范圍內(nèi)行的數(shù)量。行校驗(yàn)碼仿真結(jié)果如圖6所示。實(shí)現(xiàn)代碼如下:
if(ecc_pre_data(6)=’1’)then
reg3<=reg3 xor data;
reg2<=reg2 xor (not data);
end if;
256 byte數(shù)據(jù)全部計(jì)算完成后,按表1的格式排序,即可得到最終的ECC校驗(yàn)碼。ECC校驗(yàn)碼仿真結(jié)果如圖7所示。
圖6 行校驗(yàn)碼仿真計(jì)算
圖7 ECC校驗(yàn)碼仿真計(jì)算
3) ECC糾錯(cuò)
原ECC校驗(yàn)碼與讀出數(shù)據(jù)計(jì)算出的ECC校驗(yàn)碼進(jìn)行按位異或,若結(jié)果為0,表示讀數(shù)過(guò)程中不存在錯(cuò)誤;若結(jié)果中11 bit為‘1’,表示有1 bit數(shù)據(jù)傳輸錯(cuò)誤,并可糾正;其它結(jié)果表示傳輸出錯(cuò)且錯(cuò)誤無(wú)法糾正。由列校驗(yàn)生成規(guī)則可知,若256字節(jié)中有1 bit數(shù)據(jù)出現(xiàn)錯(cuò)誤,則列校驗(yàn)結(jié)果中3 bit的數(shù)據(jù)發(fā)生翻轉(zhuǎn),同理,行校驗(yàn)結(jié)果中有11 bit數(shù)據(jù)翻轉(zhuǎn)。
查找出錯(cuò)位的方法是:首先依據(jù)行校驗(yàn)碼確定哪個(gè)字節(jié)出現(xiàn)錯(cuò)誤,然后依據(jù)該字節(jié)的列校驗(yàn)值確定哪個(gè)bit位出現(xiàn)錯(cuò)誤。以列地址為例,根據(jù)列校驗(yàn)值與各bit位之間的關(guān)系,若新舊ECC校驗(yàn)碼異或后,CP5為1,則表明錯(cuò)誤發(fā)生在該字節(jié)的高4位,反之,低4位出現(xiàn)錯(cuò)誤;在檢測(cè)出的4位中,若CP3為1,錯(cuò)誤位置定位在高2位;如此依次檢測(cè),即可確定列地址。同理,通過(guò)檢測(cè)行校驗(yàn)值異或結(jié)果中的RP15、RP13、RP11、RP9、RP7、RP5、RP3、RP1位,即可判斷出具體的字節(jié)位置,從而找出錯(cuò)誤比特位的具體位置。實(shí)現(xiàn)代碼如下:
ECC_old_even<=RP14&RP12&RP10&RP8
&RP6&RP4&RP2&RP0&CP4&CP2&CP0;
ECC_old_odd<= RP15&RP13&RP11&RP9
&RP7&RP5&RP3&RP1&CP5&CP3&CP1;
ECC_new_even<= RP14&RP12&RP10&RP8
&RP6&RP4&RP2&RP0&CP4&CP2&CP0;
ECC_new_odd <= RP15&RP13&RP11&RP9
&RP7&RP5&RP3&RP1&CP5&CP3&CP1;
ERROR_location<=ECC_old_odd xor ECC_new
_ odd;
系統(tǒng)設(shè)計(jì)完成后,從模擬量存儲(chǔ)和數(shù)字量存儲(chǔ)兩個(gè)方面對(duì)系統(tǒng)存儲(chǔ)可靠性進(jìn)行測(cè)試分析。首先,在保證各模擬通道中信號(hào)調(diào)理電路和A/D轉(zhuǎn)換電路達(dá)到設(shè)計(jì)要求的前提下,利用數(shù)字信號(hào)發(fā)生器對(duì)一路模擬通道輸入峰峰值為5 V、頻率為100 Hz的正弦信號(hào),經(jīng)系統(tǒng)采集存儲(chǔ)后通過(guò)上位機(jī)軟件進(jìn)行顯示。圖8為上位機(jī)讀出的該正弦信號(hào)的波形。其次在FPGA中編寫(xiě)一段測(cè)試代碼,生成00H~C7H遞增的232 byte的數(shù)據(jù),循環(huán)寫(xiě)入NAND Flash中,替代模擬通道的每一大幀數(shù)據(jù),通過(guò)上位機(jī)讀取顯示。寫(xiě)入遞增數(shù)據(jù)的目的是為了清晰方便地檢測(cè)數(shù)據(jù)存儲(chǔ)和傳輸過(guò)程中有無(wú)丟幀誤碼等現(xiàn)象。利用軟件HEX EDITOR打開(kāi)上位機(jī)接收到的數(shù)據(jù)包,測(cè)試結(jié)果如圖9所示,其中55H~00H為每個(gè)數(shù)據(jù)幀的以太網(wǎng)幀頭、IP報(bào)文頭部以及UDP首部,“DCCD”為每幀數(shù)據(jù)的幀頭,緊接著“0001”為幀計(jì)數(shù)字節(jié),最后“55AA”為幀尾標(biāo)志。實(shí)驗(yàn)證明,系統(tǒng)可對(duì)模擬信號(hào)進(jìn)行精確采集,且經(jīng)存儲(chǔ)模塊后可在上位機(jī)上顯示完整的數(shù)字化波形;由數(shù)字信號(hào)存儲(chǔ)過(guò)程可看出系統(tǒng)的存儲(chǔ)傳輸性能完好,滿足設(shè)計(jì)指標(biāo)要求。
圖8 頻率為100 Hz的正弦波
圖9 上位機(jī)接收的數(shù)據(jù)包
1) 本文將無(wú)效塊管理和ECC校驗(yàn)兩項(xiàng)存儲(chǔ)可靠性技術(shù)成功應(yīng)用于NAND Flash的存儲(chǔ)方案中,實(shí)現(xiàn)對(duì)無(wú)效塊的有效管理,提高ECC糾錯(cuò)能力,保證了系統(tǒng)數(shù)據(jù)存儲(chǔ)的可靠性和完整性。
2) 通過(guò)FPGA仿真分析和存儲(chǔ)可靠性功能測(cè)試,在對(duì)模擬量和數(shù)字量的采集存儲(chǔ)過(guò)程中,能夠準(zhǔn)確地對(duì)原輸入信號(hào)進(jìn)行波形還原和數(shù)據(jù)顯示。
3) 本文設(shè)計(jì)的NAND Flash數(shù)據(jù)存儲(chǔ)可靠性方案,也適用于其他采用NAND Flash的存儲(chǔ)式數(shù)據(jù)采集系統(tǒng),具有良好的可移植性和實(shí)用性。