1 引言
高速數(shù)據(jù)采集系統(tǒng)目前已在雷達(dá)、聲納、圖像處理、語(yǔ)音識(shí)別、通信、瞬態(tài)信號(hào)測(cè)試等領(lǐng)域得到廣泛應(yīng)用。它的關(guān)鍵技術(shù)是高速ADC技術(shù)、數(shù)據(jù)存儲(chǔ)與傳輸技術(shù)和抗干擾技術(shù)。當(dāng)大量的高速實(shí)時(shí)數(shù)據(jù)經(jīng)過(guò)模數(shù)轉(zhuǎn)換后,必須高速存儲(chǔ),多通道高采樣率的數(shù)據(jù)采集系統(tǒng)會(huì)產(chǎn)生巨大的數(shù)據(jù)流。這樣就需要高速大容量的存儲(chǔ)板將數(shù)據(jù)存儲(chǔ)起來(lái),然后再讀回計(jì)算機(jī)進(jìn)行處理?;谝陨显?,本文設(shè)計(jì)了可以同時(shí)存儲(chǔ)兩通道采樣數(shù)據(jù)的大容量存儲(chǔ)板,板中采用了64片Samsung公司的高速大容量存儲(chǔ)器K9F2G08UOM,使整塊板卡的存儲(chǔ)容量達(dá)到128Gbit。采用FPGA作為控制器,通過(guò)標(biāo)準(zhǔn)的CPCI工控機(jī)箱操作存儲(chǔ)板,并通過(guò)CPCI總線(xiàn)將存儲(chǔ)板上的數(shù)據(jù)高速讀回計(jì)算機(jī),提高了讀取數(shù)據(jù)的速度。
2 K9F2G08UOM簡(jiǎn)介
NOR Flash和NAND Flash是目前市場(chǎng)上的兩種主要的非易失性閃存技術(shù),本設(shè)計(jì)的目的是為了高速存儲(chǔ)大容量的數(shù)據(jù),因此,選擇NAND型K9F2G08U0M存儲(chǔ)器。它的存儲(chǔ)容量是2 Gbit,8位位寬,頁(yè)大小為2 048×8 bit,每塊由64頁(yè)組成,共有2 048塊。每頁(yè)帶有64×8 bit的空閑存儲(chǔ)區(qū),共有8 192 K×8 bit的空閑存儲(chǔ)區(qū)。頁(yè)編程的典型時(shí)間為300μs,最大頁(yè)編程時(shí)間為700μ8。頁(yè)內(nèi)連續(xù)最小訪(fǎng)問(wèn)時(shí)間為30 ns/Byte,即數(shù)據(jù)寫(xiě)入Flash數(shù)據(jù)寄存器的速度可達(dá)33 MB/s。但是單頁(yè)數(shù)據(jù)的典型編程速度為2 048/300μs=6.8 MB/s,最慢的編程速度為2 048/700μs=2.9 MB/s。塊擦除的典型時(shí)間為2 ms。K9F2G08U0M具有硬件數(shù)據(jù)保護(hù)功能,即在電源上電、掉電期間關(guān)閉編程/擦除操作。K9F2G08U0M內(nèi)部寫(xiě)控制器使得所有的編程和擦除操作自動(dòng)進(jìn)行,片內(nèi)包含一個(gè)頁(yè)(2 048+64字節(jié))的數(shù)據(jù)寄存器,讀寫(xiě)過(guò)程中始終是將存儲(chǔ)單元數(shù)據(jù)或外部數(shù)據(jù)先緩存到數(shù)據(jù)寄存器,然后再讀出數(shù)據(jù)或?qū)懭氪鎯?chǔ)單元。因此,它是基于頁(yè)讀寫(xiě),基于塊擦除的。當(dāng)然,它也支持隨機(jī)讀寫(xiě)。但本設(shè)計(jì)目的是高速存儲(chǔ)數(shù)據(jù),因此對(duì)它的讀寫(xiě)操作完全是基于頁(yè)的。K9F2G08U0M的主要引腳有CLE(命令鎖存允許)、ALE(地址鎖存允許)、CE(片選)、WE(寫(xiě)允許)、RE(讀允許)、WP(寫(xiě)保護(hù))、R/B(準(zhǔn)備好/忙)、PRE(上電讀使能)、I/O0~I(xiàn)/O7(輸入,輸出)。其中I/O0~I(xiàn)/O7既可作為數(shù)據(jù)輸入輸出引腳,又可作為命令地址的輸入引腳,命令、地址、數(shù)據(jù)分時(shí)復(fù)用,根據(jù)不同的命令區(qū)分地址和數(shù)據(jù)。一般的操作流程為:
1) 寫(xiě)入命令,通知器件所要完成的操作(讀、寫(xiě)、擦除等);
2) 寫(xiě)入地址,即寫(xiě)入要讀寫(xiě)數(shù)據(jù)的起始地址,包括列地址和頁(yè)地址;
3) 如果是讀或者擦除,寫(xiě)入一個(gè)確認(rèn)命令。如果是寫(xiě)操作,輸人待編程的數(shù)據(jù),完成后輸入編程確認(rèn)命令。
因?yàn)镵9F2G08U0M共有128 K頁(yè),每頁(yè)的大小為(2 048+64)×8 bit,所以在寫(xiě)入地址時(shí)列地址需要12根地址線(xiàn),頁(yè)地址需要17根地址線(xiàn)。這樣就需要5個(gè)時(shí)鐘周期來(lái)寫(xiě)入地址。前兩個(gè)時(shí)鐘寫(xiě)入列地址,后三個(gè)時(shí)鐘寫(xiě)人頁(yè)地址。
3 系統(tǒng)設(shè)計(jì)
3.1 總體硬件設(shè)計(jì)
外部數(shù)據(jù)采集系統(tǒng)是2個(gè)40 MHz采樣的16位A/D通道,所以設(shè)計(jì)時(shí)分成兩個(gè)通道獨(dú)立設(shè)計(jì)。雖然K9F2G08U0M的數(shù)據(jù)寄存器寫(xiě)入速度可達(dá)33MB/s,但在FPGA設(shè)計(jì)時(shí),為了在時(shí)序上更加可靠,選擇使用25 MHz的時(shí)鐘設(shè)計(jì),則K9F2G08U0M的寫(xiě)入速度為50 MB/s(把兩個(gè)K9F2G08U0M并成16bit,寫(xiě)入速度即為25 M×l6 b/s)。這樣,在FPGA內(nèi)部開(kāi)辟3個(gè)頁(yè)大小的雙口RAM作為緩存區(qū)就能滿(mǎn)足40 M×16 b/s的寫(xiě)入速度,即在寫(xiě)第2、3個(gè)RAM的時(shí)間(25 ns×2 048×2=102.4μs)內(nèi),啟動(dòng)第1個(gè)RAM把數(shù)據(jù)寫(xiě) 入Flash的數(shù)據(jù)寄存器,所需時(shí)間為40 ns×2 048=81.92μs,小于102.4μs。
在讀回?cái)?shù)據(jù)時(shí),如以20 MHz讀取Flash,以40MHz讀出緩沖區(qū)中的數(shù)據(jù),3個(gè)雙口RAM就能剛好滿(mǎn)足要求,如圖1。讀取K9F2G08U0M一頁(yè)數(shù)據(jù)能達(dá)到33 MHz的速度,為了讓讀寫(xiě)Flash使用同一時(shí)鐘,讀Flash也采用25 MHz的速度。同時(shí)為了增加系統(tǒng)設(shè)計(jì)的冗余,采用4頁(yè)的雙口RAM作為緩沖區(qū)。所以每片F(xiàn)PGA內(nèi)部至少需要4×2 048×16 bit="131" 072 bit的存儲(chǔ)空間。
由于數(shù)據(jù)在寫(xiě)入Flash后還有較長(zhǎng)的編程時(shí)間,一頁(yè)的編程時(shí)間典型值為300μs,最大值為700μs。數(shù)據(jù)在存儲(chǔ)上不能有任何的停頓,否則就會(huì)丟失數(shù)據(jù),所以不能使用R/B信號(hào)進(jìn)行設(shè)計(jì)。為了系統(tǒng)更加可靠,選擇最大編程時(shí)間700μs。兩次對(duì)同一組Flash進(jìn)行寫(xiě)操作的時(shí)間間隔為700μs+81.92μs=781.92μs,一頁(yè)的數(shù)據(jù)寫(xiě)到雙口RAM要用25ns×2 048=51.2μs??倳r(shí)間除以寫(xiě)一頁(yè)數(shù)據(jù)的時(shí)間:781.92/51.2=15.3μs,說(shuō)明一個(gè)循環(huán)內(nèi)至少需要16組Flash才能滿(mǎn)足要求。所以在設(shè)計(jì)中,對(duì)于每路A/D采樣通道都用一片F(xiàn)PGA作為緩沖和控制系統(tǒng),在每片F(xiàn)PGA內(nèi)部都采用4個(gè)緩沖區(qū),每個(gè)緩沖區(qū)對(duì)應(yīng)一條外部總線(xiàn),每條總線(xiàn)上掛有4組K9F2G08U0M×2(將兩片F(xiàn)lash并成16位操作,即把I/O并成16位,共用控制信號(hào)線(xiàn))。系統(tǒng)整體框圖如圖2所示。
圖2中2個(gè)外部接口連接2個(gè)A/D通道,采用兩片F(xiàn)PGA作為控制和緩沖區(qū),每片控制16組Flash。存儲(chǔ)板通過(guò)PCI9054與CPCI總線(xiàn)相連,通過(guò)CPCI總線(xiàn)可以將存儲(chǔ)板數(shù)據(jù)高速讀回計(jì)算機(jī)。
3.2 系統(tǒng)設(shè)計(jì)思想
為了解決高速的數(shù)據(jù)采集和低速的Flash訪(fǎng)問(wèn)速度之間的矛盾,采取將數(shù)據(jù)流串并轉(zhuǎn)換,復(fù)制多個(gè)操作模塊并行處理的設(shè)計(jì)方法。通過(guò)利用FPGA內(nèi)部的存儲(chǔ)區(qū)實(shí)現(xiàn)4個(gè)雙口RAM作為緩沖區(qū)。每條外部Flash總線(xiàn)用一個(gè)雙口RAM,采集到的數(shù)據(jù)分時(shí)加載到4個(gè)RAM中,然后再寫(xiě)入Flash。寫(xiě)入Flash的操作以流水方式進(jìn)行,具體方式如圖3所示。首先,外部A/D采樣通道寫(xiě)數(shù)據(jù)到RAM1。當(dāng)RAM1寫(xiě)滿(mǎn)時(shí),加載數(shù)據(jù)到第一組Flash數(shù)據(jù)寄存器,加載完成后第一組Flash進(jìn)入自動(dòng)編程階段;當(dāng)RAM2寫(xiě)滿(mǎn)時(shí),第2組Flash加載開(kāi)始,數(shù)據(jù)加載完成后,進(jìn)入自動(dòng)編程階段。依次加載RAM3,當(dāng)RAM4寫(xiě)滿(mǎn),第4組Flash開(kāi)始加載后,F(xiàn)PGA內(nèi)部控制重新寫(xiě)RAM1,開(kāi)始對(duì)第5組Flash操作,然后依此循環(huán)方式對(duì)第6~16組Flash進(jìn)行操作;當(dāng)?shù)?6組數(shù)據(jù)加載完成后,第1組Flash已經(jīng)編程結(jié)束,接著從第1組Flash開(kāi)始加載和編程??煽闯鱿?6組Flash寫(xiě)入數(shù)據(jù)是并行的,通過(guò)并行寫(xiě)操作,可存儲(chǔ)高速采集的數(shù)據(jù)。
FPGA內(nèi)部設(shè)計(jì)大體可劃分為PCI9054操控部分和數(shù)據(jù)錄放部分。PCI9054操控部分一方面跟PCI9054接口,一方面要完成對(duì)Flash的操作。數(shù)據(jù)錄放部分主要完成外部數(shù)據(jù)寫(xiě)入、讀出以及擦除、建立無(wú)產(chǎn)塊信息列表等功能。由于對(duì)4組Flash的操作都是一樣的,所以數(shù)據(jù)錄放部分可以分為數(shù)據(jù)流控制部分和Flash操控部分。數(shù)據(jù)流控制部分控制數(shù)據(jù)寫(xiě)入或讀取哪組Flash;Flash操控部分用于對(duì)Flash的具體操作。圖4為數(shù)據(jù)錄放部分FPGA功能結(jié)構(gòu)。為了節(jié)省內(nèi)部存儲(chǔ)單元的數(shù)量,寫(xiě)入和讀取數(shù)據(jù)要使用同樣的緩存區(qū)。
3.3 無(wú)效塊的建立和操作
當(dāng)一個(gè)塊中有一位或更多位不能正確操作時(shí),就定義此塊為無(wú)效塊。無(wú)效塊并不影響其他塊的正常工作,各個(gè)塊之間是相互獨(dú)立的。所選的K9F2G08U0M在出廠(chǎng)時(shí)可能存在無(wú)效塊,在使用中也可能產(chǎn)生新的無(wú)效塊,但是器件的第一個(gè)塊一定不是無(wú)效塊。NAND Flash在出廠(chǎng)時(shí)就標(biāo)記本身的無(wú)效塊,每個(gè)塊的第一頁(yè)或第二頁(yè)的空閑區(qū)的第一個(gè)數(shù)據(jù)不是FFh,則表示此塊為無(wú)效塊。為了保證Flash的正確操作,必須在操作之前建立無(wú)效塊信息表。在每片F(xiàn)PGA中設(shè)計(jì)了4個(gè)2 048×1 bit的RAM用于存儲(chǔ)無(wú)效塊的信息。RAM的每一個(gè)存儲(chǔ)單元存儲(chǔ)相應(yīng)總線(xiàn)上的4組Flash的無(wú)效塊信息。其中某一塊的無(wú)效塊信息是4組Flash的無(wú)效塊信息相“與”后的結(jié)果(1表示正常,0表示無(wú)效塊)。在對(duì)Flash進(jìn)行讀、寫(xiě)或擦除操作之前,應(yīng)先從RAM中讀取無(wú)效塊信息,然后根據(jù)無(wú)效塊信息決定是否對(duì)當(dāng)前塊操作。
3.4 讀寫(xiě)Flash操作
對(duì)Flash的讀寫(xiě)操作都是基于頁(yè)的,讀寫(xiě)操作的時(shí)序分別如圖5和圖6所示。計(jì)算機(jī)通過(guò)CPCI總線(xiàn)發(fā)送出讀或?qū)懨詈?,F(xiàn)PGA內(nèi)部根據(jù)接收到的命令執(zhí)行相應(yīng)操作。寫(xiě)Flash時(shí),外部采集的數(shù)據(jù)輸入RAM1,RAM1滿(mǎn)后,開(kāi)始向RAM2寫(xiě)入數(shù)據(jù),同時(shí)選通第一條總線(xiàn)上第一組Flash的寫(xiě)模塊,在寫(xiě)模塊中通過(guò)計(jì)數(shù)器產(chǎn)生ALE、CLE、WE、RE等控制寫(xiě)Flash的相應(yīng)時(shí)序,將數(shù)據(jù)從RAM中編程到Flash內(nèi)存,并令頁(yè)地址加1,依次循環(huán)(循環(huán)流程見(jiàn)圖3)。當(dāng)總線(xiàn)上的第4組Flash的頁(yè)地址為64時(shí),塊地址加1,并讀取無(wú)效塊信息,如果為無(wú)效塊,則屏蔽此塊,重新讀取下一塊信息,直至讀取到正常塊為止。如果是正常塊,則向此塊中寫(xiě)入數(shù)據(jù),同時(shí)將頁(yè)地址清零。讀操作與寫(xiě)操作類(lèi)似,只不過(guò)是將Flash中的數(shù)據(jù)讀出先送到RAM,然后依循環(huán)次序讀取RAM即可。
3.5 PCI9054操控部分的設(shè)計(jì)
通過(guò)編寫(xiě)PCI9054專(zhuān)用的驅(qū)動(dòng)和應(yīng)用軟件,實(shí)現(xiàn)由計(jì)算機(jī)通過(guò)CPCI總線(xiàn)操控存儲(chǔ)板卡。在應(yīng)用軟件中,對(duì)Flash讀寫(xiě)或者擦除等命令自定義為對(duì)CPCI總線(xiàn)發(fā)送特定的數(shù)據(jù)。而在FPGA內(nèi)部根據(jù)PCI9054發(fā)送的局部端數(shù)據(jù)線(xiàn)上的特定數(shù)據(jù)判斷是何種操作,并執(zhí)行相應(yīng)操作。FPGA和PCI9054通信的主要信號(hào)線(xiàn)有LHOLD、LHOLDA、READY、ADS、ADDR、DATA,利用這些信號(hào)線(xiàn)可以實(shí)現(xiàn)PCI9054局部端和FPGA握手。將數(shù)據(jù)寫(xiě)到計(jì)算機(jī)中。在PCI9054專(zhuān)用的驅(qū)動(dòng)和應(yīng)用軟件中,利用DMA方式讀取Flash,讀取速度可提高至1.3 MHz×16 bit。
4 結(jié)束語(yǔ)
本設(shè)計(jì)采用流水、并行處理技術(shù),利用FPGA內(nèi)部嵌入的存儲(chǔ)塊設(shè)計(jì)一組高速數(shù)據(jù)緩沖區(qū),使得多個(gè)慢速的存儲(chǔ)器件并行工作,令系統(tǒng)內(nèi)外部數(shù)據(jù)的速率匹配,避免了外置高速緩存,簡(jiǎn)化了硬件電路,且極大地提高了存儲(chǔ)數(shù)據(jù)的速率。大容量高密度閃存器件可使單片存儲(chǔ)板容量高達(dá)128 Gbit。在FP-GA內(nèi)部設(shè)計(jì)中,建立Flash無(wú)效塊信息列表,并在此基礎(chǔ)上對(duì)Flash進(jìn)行讀、寫(xiě)、擦除及重建無(wú)效塊信息等操作。使系統(tǒng)具有集成度高、靈活性好、可移植性強(qiáng)、速度快等特點(diǎn)。通過(guò)CPCI總線(xiàn)采取DMA方式讀取,極大地提高了讀取速度。當(dāng)接收到的數(shù)據(jù)帶寬很大,速度很高時(shí),可將存儲(chǔ)板并聯(lián)起來(lái),多個(gè)存儲(chǔ)板級(jí)聯(lián)可滿(mǎn)足更大的存儲(chǔ)容量需求,也可將級(jí)聯(lián)并聯(lián)二者結(jié)合起來(lái)以滿(mǎn)足不同系統(tǒng)的要求。整個(gè)系統(tǒng)基于CPCI工控機(jī)箱,更適合于野外的工作環(huán)境,并能及時(shí)保存、分析數(shù)據(jù)。