李晉濤,任勇峰,2,楊志文,李輝景
(1.中北大學(xué) 電子測(cè)試技術(shù)國(guó)家重點(diǎn)實(shí)驗(yàn)室,山西 太原 030051;2.中北大學(xué) 儀器科學(xué)與動(dòng)態(tài)測(cè)試教育部重點(diǎn)實(shí)驗(yàn)室,山西 太原 030051)
SATA3.0(SerialATA Revision3.0)采用差分信號(hào)傳輸系統(tǒng),該系統(tǒng)對(duì)共模噪聲有很強(qiáng)的抵抗力,因此SATA可以采用更低的電壓去抑制噪聲。在數(shù)據(jù)傳輸這一方面,SATA3.0的傳輸速度在SATA2.0的基礎(chǔ)上翻倍,理論上可以達(dá)到6 Gb/s。另一方面,SATA總線使用了嵌入式時(shí)鐘頻率信號(hào),具備了比以往更強(qiáng)的糾錯(cuò)能力。在傳輸過(guò)程中能對(duì)相應(yīng)的指令進(jìn)行檢查,即使出現(xiàn)錯(cuò)誤的指令,也可以進(jìn)行及時(shí)的修正,因此廣泛地應(yīng)用于實(shí)際工程中。但是,基于測(cè)試系統(tǒng)產(chǎn)生的數(shù)據(jù)愈加地趨向于大體積、高速率,多數(shù)存儲(chǔ)系統(tǒng)采用存儲(chǔ)陣列的方式進(jìn)行存儲(chǔ)。然而,隨著存儲(chǔ)量的增加以及傳輸環(huán)境的復(fù)雜,SATA總線會(huì)出現(xiàn)個(gè)別通道傳輸中斷的現(xiàn)象,雖然只是偶爾現(xiàn)象,但卻能造成不可挽回的損失。
針對(duì)以上問題,該設(shè)計(jì)基于FPGA控制的SATA3.0總線,從硬件和代碼方面優(yōu)化了存儲(chǔ)系統(tǒng)并進(jìn)行驗(yàn)證。實(shí)測(cè)存儲(chǔ)速率不低于800 MB/s,并且數(shù)據(jù)傳輸穩(wěn)定,在大容量存儲(chǔ)應(yīng)用領(lǐng)域具有很好的參考和使用價(jià)值。
圖1 系統(tǒng)總體框圖
基于SATA3.0的存儲(chǔ)電路能夠?qū)崿F(xiàn)對(duì)大量數(shù)據(jù)的快速、穩(wěn)定的存儲(chǔ),該系統(tǒng)的總體設(shè)計(jì)方案如圖1所示。系統(tǒng)由四部分組成,即數(shù)據(jù)接收模塊、FPGA控制模塊、數(shù)據(jù)存儲(chǔ)模塊和數(shù)據(jù)分析模塊。數(shù)據(jù)接收模塊采用了4路SRIO數(shù)據(jù)接口,接收外部數(shù)據(jù),單路傳輸速率為3.125 Gb/s,總體理論傳輸速率為12.5 Gb/s??刂颇K采用FPGA,主要負(fù)責(zé)邏輯控制,即通過(guò)控制SRIO協(xié)議、SATA協(xié)議以及UDP協(xié)議來(lái)完成數(shù)據(jù)的接收、存儲(chǔ)和調(diào)用。數(shù)據(jù)存儲(chǔ)模塊采用4片500 GB的固態(tài)硬盤,以單次記錄的方式,先擦除再寫入,斷電停止記錄。數(shù)據(jù)分析模塊采用UDP協(xié)議,通過(guò)千兆以太網(wǎng)接口進(jìn)行交互[1]。對(duì)試驗(yàn)數(shù)據(jù)進(jìn)行分析時(shí),只需要將硬盤內(nèi)存儲(chǔ)的數(shù)據(jù)讀取到計(jì)算機(jī)上即可。
此模塊采用Xilinx的Kintex-7系列PFGA作為主控芯片,該芯片采用RocketIO技術(shù)進(jìn)行串行數(shù)據(jù)傳輸,即串行收發(fā)器GTX接口,單路最高傳輸速率可達(dá)到12.5 Gb/s[2],串行收發(fā)器配備有可配置的阻抗、擺幅以及耦合等級(jí)。SATA傳輸采用全雙工的方式,2、3引腳作為發(fā)送端將指令或者數(shù)據(jù)發(fā)送至硬盤,5、6引腳作為接收端接收硬盤返回的信息。相比于以往的并行傳輸方式,串行傳輸采用差分走線,具有很強(qiáng)的抗噪聲能力,不需要考慮多排傳輸線之間的干擾,只需要提高時(shí)鐘頻率便可以提高傳輸速率,串行傳輸一次傳輸一個(gè)比特(bit)包含有源同步時(shí)鐘。而時(shí)鐘是通過(guò)PMA PLL將一個(gè)高質(zhì)量的參考時(shí)鐘倍頻出高速串行時(shí)鐘,用來(lái)驅(qū)動(dòng)GTX收發(fā)器工作,本設(shè)計(jì)采用的時(shí)鐘芯片為CDCM61002[3],該芯片內(nèi)置板載鎖相環(huán),可以提供穩(wěn)定的差分時(shí)鐘作為參考時(shí)鐘,并且具有功耗低、高性能、低相位噪聲等優(yōu)點(diǎn)。在時(shí)鐘配置方面,該芯片可配置出專有的SATA時(shí)鐘、PCI Express以及GigE等。根據(jù)芯片手冊(cè),此處選用25 MHz的晶振作為時(shí)鐘輸入,同時(shí)將PR0、PR1、OD2配置為低電平,OD1和OD0配置為高電平,即實(shí)現(xiàn)設(shè)計(jì)需要的SATA參考時(shí)鐘150 MHz。同時(shí),將OS1配置為低電平、OS0配置為高電平,從而控制時(shí)鐘輸出方式為L(zhǎng)VDS。硬件電路圖如圖2所示。
圖2 SATA硬件原理圖
SATA3.0接口主要包括四個(gè)層次:應(yīng)用層、傳輸層、鏈路層以及物理層,總體框架如圖3所示。
圖3 SATA協(xié)議結(jié)構(gòu)圖
(1)物理層主要是由差分對(duì)TX和RX來(lái)實(shí)現(xiàn)串行全雙工傳輸,主要功能是主機(jī)端與設(shè)備端的鏈路初始化[4]。為了提高SATA接口的主機(jī)端和設(shè)備快速建立通信的能力,SATA協(xié)議在物理層引入了OOB信號(hào),通過(guò)原語(yǔ)交互來(lái)完成鏈路初始化和傳輸速度的協(xié)商。
(2)鏈路層主要負(fù)責(zé)的是FIS幀收發(fā),通過(guò)CRC校驗(yàn)和加擾碼解擾碼的方式來(lái)提高數(shù)據(jù)傳輸?shù)臏?zhǔn)確性[5]。當(dāng)鏈路層發(fā)送數(shù)據(jù)時(shí),SATA協(xié)議將0x52325032作為初始值[6],根據(jù) CRC32校驗(yàn)方式,將最多 2 048個(gè) DWORDS有效數(shù)據(jù)依次校驗(yàn),生成一個(gè)最終的校驗(yàn)和,然后將校驗(yàn)和加在所發(fā)送的有效數(shù)據(jù)后,并進(jìn)行加擾,最后進(jìn)行8B/10B編碼后發(fā)送到物理層,在接收到設(shè)備端的數(shù)據(jù)時(shí),先對(duì)數(shù)據(jù)進(jìn)行8B/10B解碼以及解擾,然后將幀頭原語(yǔ)SOF、CRC校驗(yàn)以及幀尾原語(yǔ)EOF去除,再次計(jì)算接收到的有效數(shù)據(jù)的CRC校驗(yàn)和[7],并與接收到的CRC校驗(yàn)和做對(duì)比,然后向傳輸層報(bào)告當(dāng)前傳輸狀態(tài)。CRC32的生成多項(xiàng)式如式(1)所示:
(3)傳輸層主要負(fù)責(zé)將相關(guān)的數(shù)據(jù)或命令構(gòu)造成相應(yīng)的FIS幀。其中,幀類型主要有數(shù)據(jù)幀、寄存器幀以及控制幀這三大類。當(dāng)傳輸層接收到來(lái)自鏈路層的幀時(shí),會(huì)將該幀解析出幀類型以及幀內(nèi)容,并將其中的數(shù)據(jù)寫入寄存器中。當(dāng)檢測(cè)到應(yīng)用層發(fā)出的數(shù)據(jù)傳輸操作請(qǐng)求后,傳輸層作為響應(yīng),會(huì)從寄存器中讀取數(shù)據(jù),并按照相應(yīng)的幀格式組成幀發(fā)送至鏈路層[8]。
(4)應(yīng)用層主要負(fù)責(zé)解析各個(gè)寄存器以及執(zhí)行寄存器中的命令。根據(jù)命令的要求,應(yīng)用層會(huì)接收來(lái)自主機(jī)端傳輸?shù)臄?shù)據(jù),并將數(shù)據(jù)寫入SATA硬盤中,或者將硬盤中的數(shù)據(jù)讀取出來(lái)傳送給主機(jī)端。存儲(chǔ)或者讀取的方式可以是PIO或DMA,為了提高數(shù)據(jù)交互速率,本文采用DMA方式[9]。在數(shù)據(jù)進(jìn)行緩沖時(shí),分別采用一個(gè)讀FIFO和一個(gè)寫FIFO來(lái)完成。寫FIFO負(fù)責(zé)緩存?zhèn)鬏攲咏馕龀鰜?lái)的數(shù)據(jù)幀,而讀FIFO負(fù)責(zé)把來(lái)自總線的數(shù)據(jù)保存下來(lái)[10]。在這一系列動(dòng)作完成之后,應(yīng)用層將構(gòu)造數(shù)據(jù)幀的指令發(fā)給傳輸層。
SATA物理鏈路的建立主要是通過(guò)OOB(Out of Band,OOB)信號(hào)來(lái)實(shí)現(xiàn)的[11]。FPGA和硬盤上電以后,F(xiàn)PGA端首先發(fā)出重置信號(hào)COMREST,硬盤在檢測(cè)到FPGA發(fā)出的COMRESET后,會(huì)發(fā)出初始化信號(hào)COMINIT作為回應(yīng),并且硬盤可以在任意時(shí)間通過(guò)發(fā)送COMINIT來(lái)發(fā)起會(huì)話。收到硬盤回應(yīng)以后,F(xiàn)PGA會(huì)進(jìn)行校準(zhǔn)并發(fā)出COMWAKE信號(hào)。硬盤在RX差分對(duì)上接收到COMWAKE信號(hào)后會(huì)校準(zhǔn)發(fā)送器,并且會(huì)將COMWAKE信號(hào)連續(xù)傳輸六次,接著連續(xù)發(fā)送ALIGN原語(yǔ)與主機(jī)端進(jìn)行傳送速度的協(xié)商。FPGA接收到COMWAKE信號(hào),鎖存硬盤發(fā)來(lái)的原語(yǔ)然后在54.6 μs內(nèi)回傳 ALIGN,并且在 COMWAKE信號(hào)收到之后連續(xù)地發(fā)送D10.2原語(yǔ)。返回ALIGN信號(hào)給硬盤的速率應(yīng)與接收時(shí)保持一致,如在880 μs內(nèi)未檢測(cè)到硬盤返回ALlGN,則進(jìn)入復(fù)位狀態(tài)重新連接。硬盤在檢測(cè)到ALIGN原語(yǔ)后,會(huì)以SYNC同步信號(hào)作為回應(yīng),表示準(zhǔn)備開始正常的傳輸操作。當(dāng)FPGA接收到三個(gè)來(lái)自硬盤的非ALIGN原語(yǔ)后,linkup信號(hào)由低電平變?yōu)楦唠娖?,鏈接建立完成,進(jìn)入正常操作。
圖4 鏈路優(yōu)化前
如圖4所示,以往的數(shù)據(jù)傳輸過(guò)程中,可能會(huì)遇到物理鏈路連接斷開的現(xiàn)象[12],此時(shí)linkup信號(hào)由高變低,數(shù)據(jù)傳輸中斷,OOB狀態(tài)機(jī)停留在當(dāng)前l(fā)inkready狀態(tài)。從硬盤回放的數(shù)據(jù)可以看出,遞增數(shù)已經(jīng)不再連續(xù),雖然這種問題出現(xiàn)的概率比較小,但卻能造成無(wú)法挽回的后果。為了提高系統(tǒng)鏈路的穩(wěn)定性以及抗干擾能力,使得系統(tǒng)建立起來(lái)以后數(shù)據(jù)更加穩(wěn)定地傳輸,避免在系統(tǒng)工作中出現(xiàn)中斷,需要對(duì)OOB狀態(tài)機(jī)增加一個(gè)通路標(biāo)志循環(huán)監(jiān)測(cè)狀態(tài)。當(dāng)出現(xiàn)鏈路斷開時(shí),在物理層立即重新建立物理鏈路,及時(shí)地恢復(fù)數(shù)據(jù)傳輸。圖5是改進(jìn)后的OOB狀態(tài)機(jī)。
圖5 優(yōu)化后的OOB狀態(tài)機(jī)
linkup狀態(tài)之前的狀態(tài)與原來(lái)相同,是物理通路的建立過(guò)程。linkup狀態(tài)下認(rèn)為發(fā)送的已經(jīng)是正常的數(shù)據(jù)幀,在此狀態(tài)下可以檢測(cè)幀頭SOF原語(yǔ)和EOF原語(yǔ)判斷是否有正常數(shù)據(jù)幀的交互。當(dāng)檢測(cè)到幀頭SOF原語(yǔ)后進(jìn)入下一狀態(tài)。linkcheck是鏈路檢測(cè)狀態(tài),也是物理層正常工作時(shí)需要保持的狀態(tài)。在正常工作狀態(tài)下,鏈路需要保持穩(wěn)定,這就需要實(shí)時(shí)檢測(cè)當(dāng)前鏈路的工作狀態(tài),此狀態(tài)下需要檢測(cè)的標(biāo)志位有rxelecidle、linkup等。可以看到鏈路斷開以后,linkup信號(hào)由高變低,此時(shí)OOB狀態(tài)機(jī)立即進(jìn)入 0狀態(tài),即復(fù)位狀態(tài);txcominit拉高,說(shuō)明鏈路開始初始化;經(jīng)過(guò)短時(shí)間的鏈路重建linkup信號(hào)拉高,說(shuō)明鏈路重新恢復(fù)連接,rxelecidle信號(hào)持續(xù)拉低,說(shuō)明數(shù)據(jù)已經(jīng)開始繼續(xù)傳輸。圖6是ILA抓取的一條通路重新建立的采樣圖。
首先,使用外部發(fā)圖機(jī)以800 MB/s的速率循環(huán)發(fā)送遞增數(shù),遞增數(shù)以四個(gè)字節(jié)的幀計(jì)數(shù),再加上EB 90作為幀結(jié)尾[13],每幀包含 256個(gè)字節(jié)。接收數(shù)據(jù)時(shí),F(xiàn)PGA以156.25 MHz的時(shí)鐘接收數(shù)據(jù),然后寫入64位的FIFO。由于SRIO采用8B/10B編碼,4路SRIO接口理論接收速率可達(dá)到 156.25 M×64÷10=1 000 MB/s。緊接著,例化一個(gè) 64位轉(zhuǎn) 128位的 FIFO,讀時(shí)鐘為 150 MHz,此時(shí) FIFO的讀速率為 150 M×128÷10=1 920 MB/s完全大于接收速率。之后FPGA將打包后的128位的數(shù)據(jù)拆分成四路32位的數(shù)據(jù),通過(guò)SATA控制器,將32位的數(shù)據(jù)轉(zhuǎn)為串行的差分?jǐn)?shù)據(jù),通過(guò)SATA串口同時(shí)存儲(chǔ)到四塊硬盤中。圖7為上位機(jī)讀取到的遞增數(shù),圖8為遞增數(shù)校驗(yàn)結(jié)果。
在高溫60℃和低溫-40℃條件下,以800 MB/s的寫入速率每次寫入硬盤600 GB的數(shù)據(jù)進(jìn)行測(cè)試,經(jīng)過(guò)100次測(cè)試及數(shù)據(jù)分析,發(fā)現(xiàn)數(shù)據(jù)傳輸穩(wěn)定,遞增數(shù)連續(xù)且沒有出現(xiàn)傳輸中斷的情況。
圖6 鏈路優(yōu)化后
圖7 接收數(shù)據(jù)回放
圖8 遞增數(shù)校驗(yàn)
本文優(yōu)化了一種基于FPGA控制的存儲(chǔ)系統(tǒng),系統(tǒng)以SATA3.0作為傳輸總線,固態(tài)硬盤陣列作為存儲(chǔ)介質(zhì),對(duì)存儲(chǔ)邏輯進(jìn)行了設(shè)計(jì),并對(duì)硬件電路和OOB狀態(tài)機(jī)進(jìn)行了優(yōu)化。最終實(shí)現(xiàn)了一種高速率,高穩(wěn)定性的存儲(chǔ)系統(tǒng),解決了大容量存儲(chǔ)系統(tǒng)的傳輸穩(wěn)定性問題。經(jīng)過(guò)大量的讀寫測(cè)試,表明該系統(tǒng)可以對(duì)高速數(shù)據(jù)進(jìn)行可靠的存儲(chǔ),滿足多數(shù)遙測(cè)試驗(yàn)的需求,具有很好的應(yīng)用價(jià)值。