代明清,馮西安,耿云輝,李曉花
(西北工業(yè)大學 航海學院,陜西 西安 710072)
數(shù)據(jù)采集與存儲是信號處理的一個重要環(huán)節(jié),已被廣泛應用于雷達、聲納、語音識別、圖像處理等領域。隨著信息技術的發(fā)展,特別是各種數(shù)字信號處理器處理速度的提高,實時處理大量的數(shù)據(jù)已經(jīng)成為現(xiàn)實。但是,由于水下環(huán)境惡劣,實驗成本高、水聲信號復雜多變等不利因素的影響,水聲信號的實時采集一直比較困難。根據(jù)實際問題,本文研制開發(fā)了一種基于FPGA和Flash的高速大容量數(shù)據(jù)采集存儲系統(tǒng)。該系統(tǒng)采用蓄電池供電,能在水下工作,可回收,有效解決了水聲信號的實時采集、存儲及后期處理等問題。
圖1是該數(shù)據(jù)采集存儲系統(tǒng)的總體框圖。系統(tǒng)主要由信號調理模塊、A/D轉換模塊、Flash數(shù)據(jù)存儲模塊和RS-232串行通信模塊組成。FPGA是整個系統(tǒng)的核心,主要完成模數(shù)轉換控制、數(shù)據(jù)存儲控制及數(shù)據(jù)通信控制等功能。
前端信號調理電路負責接收換能器傳來的電壓信號,經(jīng)穩(wěn)壓、放大、濾波、射極跟隨后,將信號轉變?yōu)檫m合A/D轉換的信號進行模數(shù)轉換。FPGA將讀取到的A/D量化后的數(shù)據(jù)存入內部FIFO中,并將數(shù)據(jù)最終寫入Flash。RS-232串口用來實現(xiàn)系統(tǒng)與PC機的通信功能,以便將Flash中存儲的數(shù)據(jù)傳給計算機進行處理。
A/D轉換芯片采用ADI公司的AD9224,其轉換精度為12 bit,最高采樣率可達40 MSPS。FPGA采用Altera公司的EP1C6Q240C8,內部邏輯單元可達到200 60個,RAM可達到288 KB,擁有240個管腳,最大I/O數(shù)目為185。Flash采用SAMSUNG公司的K9WAG08U1A芯片,外部接口速度為 40 MHz,接口寬度 8 bit,存儲容量為 2 GB。
圖1 系統(tǒng)整體框圖
水聲信號在傳播過程中衰減得非常嚴重,換能器接收到的水聲信號往往比較微弱,一般為μV級信號,不適合A/D轉換器直接采樣。因此,必須先經(jīng)過信號調理電路的處理[1]。信號調理電路能夠對目標信號進行適當?shù)姆糯?、濾波,并將單端輸入信號變?yōu)椴罘中盘柼峁┙oA/D轉換器,以減少偶次諧波的產(chǎn)生。
圖2 信號調理模塊框圖
Flash芯片的數(shù)據(jù)與控制引腳均與FPGA相連,由于FPGA沒有數(shù)據(jù)總線和地址總線,因此只能利用FPGA的一般I/O口來模擬總線。此外,還需要使用FPGA的一般I/O口與Flash芯片的控制相連,通過編程實現(xiàn)相應的控制功能。圖3為Flash芯片與FPGA的連接情況。
由于Flash是按頁存儲數(shù)據(jù)的,當寫完一頁后,要重新寫入下一頁地址。因此,為保證采集到的數(shù)據(jù)能及時存入Flash,而不至于在頁與頁的交替間丟失,本系統(tǒng)設計了FIFO用于數(shù)據(jù)緩存。AD9224的采樣精度為12 bit,F(xiàn)lash的存儲位寬為8 bit,F(xiàn)lash需2 B存放一幀數(shù)據(jù),低8 bit存儲低8 bit數(shù)據(jù),高 4 bit加補充碼存儲高 4 bit。另外,在FPGA內設計了專門的地址發(fā)生器,以便于合理分配Flash的存儲空間。
圖3 FLASH芯片與FPGA接口電路
在串行通信中,普遍采用的是RS-232[2]接口標準,該模塊主要由FPGA串口模塊、MAX3232和DB9組成,具體連接如圖4所示。圖中左邊為EIA RS-232-C連接器DB9,與計算機串口相連,右邊 TXD、RXD與FPGA中的UART模塊相連,MAX3232為電平轉換芯片,完成EIA RS-232-C正、負電壓邏輯電平與TTL以高、低電平間的轉換。
圖4 RS-232串口電路圖
本系統(tǒng)主要軟件設計包括FIFO、UART及Flash的讀、寫和擦除控制。開發(fā)工具為Altera公司的QuartusII 7.2,開發(fā)語言為 VHDL[3]。
FIFO是一個帶有控制邏輯模塊的先進先出存儲隊列,控制邏輯模塊能管理讀寫指示器,產(chǎn)生狀態(tài)標志。FIFO將前端傳來的數(shù)據(jù)進行緩存,有效解決了速率匹配、數(shù)據(jù)緩沖和總線匹配等芯片間的通信問題。在本系統(tǒng)中,對Flash芯片寫控制字和寫數(shù)據(jù)都需要一定時間,F(xiàn)IF0容量的大小應大于該時段內所能送來的最多數(shù)據(jù)量,以免堆棧溢出,造成數(shù)據(jù)丟失。本設計采用的緩存為異步FIFO,數(shù)據(jù)位寬12 bit,存儲深度512 bit。圖5為QuartusII環(huán)境下FIFO的仿真結果。
通用異步收發(fā)器(UART)用于計算機和RS232接口間的串行通信,主要由接收模塊和發(fā)送模塊組成,兩模塊均采用狀態(tài)機編程實現(xiàn)。
接收模塊的功能是將外部傳來的串行數(shù)據(jù)轉換為字節(jié),存儲到內部FIFO中。當數(shù)據(jù)線RXD由邏輯1變?yōu)檫壿?時,數(shù)據(jù)傳送開始。為防止誤判,接收時鐘設為波特率時鐘的16倍,起始位至少要保持8個周期的低電平,才算采集到數(shù)據(jù)。起始位后面為數(shù)據(jù)位和停止位,每16個時鐘周期采集1 bit數(shù)據(jù)。
接收狀態(tài)機由 R_start(等待起始位)、R_center(求中點)、R_wait(等待采樣)、R_sample(采樣)和 R_stop(停止位)5個狀態(tài)組成,圖6為UART接收狀態(tài)機狀態(tài)圖。
圖6 UART接收狀態(tài)機狀態(tài)圖
Rsync為數(shù)據(jù)位RXD的同步信號,沒有數(shù)據(jù)時,接收機一直處于R_start狀態(tài),Rsync為邏輯1。當Rsync變?yōu)檫壿?0后,狀態(tài)機進入 R_center狀態(tài),通過 Rcnt計數(shù)到“1000”,尋找到起始數(shù)據(jù)中點,緊接著轉到 R_wait狀態(tài),Rcnt清零。待 Rcnt再次計數(shù)到“1110”時,狀態(tài)機進入R_sample狀態(tài)采集第一位數(shù)據(jù),并將該位數(shù)據(jù)存入移位寄存器,接著采集下一位數(shù)據(jù)。Rbitcnt用于判斷采集到數(shù)據(jù)的位數(shù),Rbitcnt不等于Framelen設定的初始常數(shù)值(數(shù)據(jù)位數(shù) 8)時,繼續(xù)采集。否則,進入 R_stop狀態(tài),將移位寄存器內數(shù)據(jù)送入FIFO,結束本幀數(shù)據(jù)的采集,等待下一幀數(shù)據(jù)的到來。
發(fā)送模塊的功能則是將FPGA內部傳送來的字節(jié)轉換為串行數(shù)據(jù),傳給PC機,該模塊產(chǎn)生的串行數(shù)據(jù)與接收模塊串行數(shù)據(jù)應具有相同的幀格式。發(fā)送模塊由X_idle(空 閑)、X_start(起 始 位)、X_wait(移 位 等 待)、X_shift(移位)和 Xsop(停止位)5個狀態(tài)組成,圖 7為 UART發(fā)送狀態(tài)機狀態(tài)圖。
復位狀態(tài)下,UART處于X_idle狀態(tài),當接到發(fā)送命令Xcmd后,狀態(tài)機進入X_start狀態(tài)。在此狀態(tài)下,UART給TXD發(fā)送16個時鐘周期的邏輯0作為起始位,而后轉入 X_wait狀態(tài)。X_wait、X_shift的原理與發(fā)送模塊相似,實現(xiàn)數(shù)據(jù)的并串轉換。X_stop用于產(chǎn)生停止位1,停止位傳送完畢后,狀態(tài)機回到X_idle狀態(tài),等待下一轉換命令的到來。
圖7 UART發(fā)送狀態(tài)機狀態(tài)圖
Flash的基本操作[5]主要有:讀操作、頁編程操作和塊擦除操作,各種操作必須按順序寫入相應的命令才能順利執(zhí)行。圖8是Flash三種基本操作的流程圖。
圖8 Flash三種基本操作流程圖
Flash的編程是以頁為單位的。首先寫入80h,緊接著寫入5個地址,然后把一頁2 112個數(shù)據(jù)寫入數(shù)據(jù)寄存器,再寫入70h命令,啟動讀狀態(tài)寄存器,讀取寄存器值,如bit0=0的表示編程成功,為1則表示編程失敗。
Flash的擦除操作是以塊為單位的。先寫入60h命令,載入3個地址周期,再寫入D0h命令,啟動當前塊的擦除操作。當擦除完成后,寫入70h命令,啟動讀狀態(tài)寄存器,讀取寄存器值,如bit0=0,則表示擦除成功,為 1則表示擦除失敗。
Flash在讀操作時,首先將00h寫入到命令寄存器,緊接著寫5個地址周期和30h命令,即可讀取相應地址單元的數(shù)據(jù)。
由于在每一片K9WAG08U1A中都包含有少量的不能進行讀寫的無效塊,因而,對K9WAG08U1A開始讀寫操作之前,必須把無效塊檢測出來,形成無效塊信息列表,并存放在FPGA內。SAMSUNG公司確保每個無效塊的第1頁或第2頁的第2 048列地址處會有非FFh的數(shù)據(jù)存在。因此,可以讀取每塊第1頁或第2頁的第2 048列地址處數(shù)據(jù),若不為FFh,則本塊為無效塊,需要標記出來。建立Flash壞塊信息列表如圖9所示。
本文介紹了一種基于FPGA的水聲信號數(shù)據(jù)采集存儲系統(tǒng),對系統(tǒng)硬件電路和軟件設計都進行了詳細介紹。該系統(tǒng)既可以對現(xiàn)場信號進行采集,又可對采集到的信號進行回放,經(jīng)過多次實驗室調試和水池實驗,系統(tǒng)工作正常。該系統(tǒng)利用蓄電池工作,存儲容量大,適用于水下微弱信號的采集處理,且通道數(shù)可根據(jù)需要進行擴展,前景廣闊,值得推廣。
圖9 Flash壞塊檢查流程圖
[1]趙志剛.舷側陣主、被動自導實驗系統(tǒng)的硬件設計[D].西安:西北工業(yè)大學,2007.
[2]王彥.基于 FPGA的工程設計與應用[M].西安:西安電子科技大學出版社,2007.
[3]潘松,黃繼業(yè).EDA技術與VHDL[M].北京:清華大學出版社,2007.
[4]楊夏,王平等.基于 FPGA的簡化 UART電路設計[J].微計算機信息,2008,24(23):226-227.
[5]劉加奎.高速大容量存儲系統(tǒng)設計[D].西安:西安電子科技大學,2008.