葉聰相,章增優
(浙江工貿職業技術學院 人工智能學院,浙江 溫州 325000)
隨著信息時代的蓬勃發展,各行業對信息數據的需求更加迫切。產品研制階段需要大量的數據支撐,通過分析數據能夠實現對產品性能的不斷優化,因此大容量數據的存儲技術持續受到各行各業的關注。首先,傳統的存儲芯片Flash隨著芯片制造工藝的不斷改進,不同廠商生產的芯片也存在差異[1],因此雖然Flash存儲空間越來越大,但其可移植性降低,進一步影響軟件的開發周期[2]。其次,在對FLASH芯片進行讀寫控制時過程較復雜,產品異常斷電時Flash芯片內部指針可能會隨意跳轉,導致數據讀寫錯誤[3],且數據通過FLASH芯片接口傳輸時速率低[4]。針對以上問題,提出采用eMMC存儲芯片來對數據進行存儲。eMMC芯片與其他存儲芯片最大的不同是其內部包含了FLASH芯片以及FLASH芯片控制模塊[5],解決了不同型號存儲芯片兼容性的問題,極大地提高了軟件的可移植性,節省了產品開發周期。該存儲芯片存儲容量大,接口傳輸速率高,可實現數據的高速傳輸[6]。因此,這種嵌入式芯片獲得了越來越多的青睞。
由于FPGA具有強大的并行處理數據的能力,且內部集成了很多硬核,對其進行編程時可直接調用,縮短了軟件開發時間[7],系統選用FPGA作為控制芯片,利用其內部集成的IP核實現對外部數據的高速收發,然后對數據進行暫存及數據組幀處理,使用MMC接口實現對對8片eMMC芯片的讀寫操作,完成高速大容量數據的存儲。本設計對于產品進行后續測試提供了保障。
設計主要由RS422收發模塊、主控模塊、eMMC存儲控制模塊、數據緩存模塊、GTX控制模塊及電源模塊等模塊組成。系統總體設計如圖1所示。

圖1 系統總體設計框圖
系統上電復位完成后,eMMC控制模塊以及GTX控制器模塊自動進入初始化流程。FPGA通過RS422接口接收到上位機發送的啟動采數命令時,首先對eMMC控制模塊以及GTX控制模塊的狀態進行判斷,若其初始化未完成,則將回應幀中的Busy標志位置‘1’;若初始化流程結束,則Busy標志位清‘0’,并準備數據的采集。GTX控制模塊啟動對外部串行數據的高速采集,為匹配數據傳輸速率,使用數據緩存模塊對高速收發控制器模塊輸出的數據進行暫存,FPGA主控模塊根據緩存模塊輸出的空滿標志,一方面控制eMMC存儲控制模塊對eMMC芯片進行讀、寫、擦除等工作;另一方面對GTX控制模塊的收發也進行控制。eMMC控制模塊對數據按照傳輸協議組幀后,通過MMC接口將數據存儲至外部eMMC芯片中。回讀是數據寫入的逆過程。經系統實測,eMMC接口傳輸速率為2.4 Gbps,實現了設計需求。
設計選用Virtex-6系列的FPGA作為邏輯控制器,采用其內部集成的IP硬核GTX實現對大容量數據的高速傳輸[8]。GTX內部由兩部分構成,分別為接收模塊和發送模塊[9]。其中,接收模塊主要實現的功能依次對輸入信號進行整形濾波,從輸入串行數據流中將時鐘與數據恢復出來,串并轉換,數據字符對齊,解碼,時鐘糾正,位寬轉換輸出[10]。發送模塊實現數據發送的步驟大致與接收相反,依次為位寬轉換輸入,編碼,并串轉換,信號預加重,信號轉差分輸出[11]。發送模塊與接收模塊傳輸時互不影響,GTX模塊通過SMA接口與用戶設備進行連接,信號輸入為差分方式,使得數據傳輸更穩定[12]。GTX控制模塊在進行數據傳輸時,其接口的傳輸速率理論值為6.6 Gbps[13],完全符合設計對數據傳輸速率的要求。GTX控制模塊接口原理如圖2所示。

圖2 GTX接口原理圖
設計采用美國美光公司的eMMC芯片(MTFC64GJVDN-4MIT)進行大容量數據的存儲[14]。通過該芯片進行數據的傳輸時,其接口的傳輸速率為3.2 Gbps,能夠實現數據的高速收發[15]。由于eMMC芯片集成了Flash芯片及Flash控制器,FPGA只需通過簡單的接口就可對其進行操作[16]。FPGA與eMMC芯片通訊的接口原理如圖3所示,設計采用6片eMMC芯片進行數據存儲,每片可以存儲的空間大小為64 GB[17]。FPGA與eMMC陣列之間主要通過時鐘線、數據線、命令線、電源線以及地線進行通訊。其中,時鐘線、電源線以及地線是共用線,數據線和命令線則各自獨立[18]。硬件在設計時,為降低干擾,在電源接口處引入濾波網絡,從而保證電源的可靠性[19]。同時硬件上將數據線及命令線均進行上拉,提高了芯片管腳的驅動力[20]。

圖3 eMMC陣列接口原理圖
系統采用Verilog語言在ISE14.6開發環境下實現軟件代碼的編寫,軟件整體架構如圖4所示。系統上電后,上位機通過RS422接口發送命令給FPGA,待FPGA各模塊初始化完成后,啟動對外部數據的接收存儲。首先外部設備的數據經過GTX模塊快速接收后,設計為匹配數據傳輸速率,保證數據傳輸無誤,將數據進行緩存后再發送至eMMC控制模塊。eMMC控制模塊根據上位機命令對eMMC芯片進行相應的操作,通過命令接口、數據接口實現對eMMC芯片的初始化、寫入、讀出等功能。

圖4 系統軟件總體架構圖
3.1.1 數據幀格式
FPGA作為主機,控制數據總線與eMMC芯片進行數據交互。在對eMMC芯片寫入數據時,需要按照正確的傳輸格式對數據進行重新組幀才可以實現數據的正常發送[21]。其協議幀格式如圖5所示,主要由4部分構成。其中,起始位為固定值‘0’,結束位為固定值‘1’,CRC為2選擇字節,數據包長度不定。數據在SDR模式下傳輸時,可以選擇1 bit、4 bit或者8 bit的傳輸位寬,且數據均在時鐘上升沿進行采樣。

圖5 eMMC協議數據幀格式
3.1.2 命令幀格式
FPGA作為主機,控制命令總線與eMMC芯片進行命令交互。為確保命令發送有效,當eMMC芯片接收到命令時,會發送命令響應至FPGA。FPGA通過發送不同的命令實現對芯片的操作,但這些命令都具有相同的幀格式,如表1所示。命令幀長度固定,均為6個字節。

表1 eMMC命令幀格式
主機發送不同的命令,接收到的響應長度各不相同。且命令發出后,將在各自要求的時間后收到響應信息。如圖6所示,當主機發送命令給單片eMMC芯片設置初始地址時,等待NCR個周期后,得到eMMC芯片發送的響應信息。

圖6 eMMC協議命令和響應時序圖
系統上電后,通過發送命令實現對eMMC芯片內的寄存器進行配置,從而完成eMMC芯片的初始化工作。首先,根據eMMC芯片特性,芯片上電復位完成后,配置200 Hz的時鐘作為eMMC芯片的初始化主頻。然后,發送CMD1命令完成對工作條件寄存器的配置,實現eMMC工作電壓的檢驗與匹配。發送CMD2命令可獲取產品出場信息等。由于設計選用6片eMMC芯片用于大容量數據的存儲,因此當FPGA對其進行訪問時,需要唯一的芯片地址與之對應,因此在配置芯片時,可以通過寫入CMD3命令對其內部相對地址寄存器進行每片芯片地址的配置,使得數據在傳輸時具有一對一的效果。根據eMMC傳輸幀格式,一幀數據中除去開始位、結束位以及校驗位以外,數據字節長度不定。通過發送命令CMD9,可以查詢到eMMC芯片在數據傳輸過程中支持的數據字節長度等信息。然后發送CMD7命令選定eMMC芯片參與初始化流程結束后的數據讀寫工作。最后發送CMD6命令將輸入時鐘切換至5 MHz,并重復發送該命令確認數據傳輸位寬及采樣時刻,初始化流程結束。eMMC控制模塊初始化流程如圖7所示。

圖7 eMMC控制模塊初始化流程圖
將大容量數據寫入eMMC存儲芯片時,首先由FPGA通過命令線串行輸出48 bit的CMD7至eMMC存儲器,用于指定6片eMMC存儲器之一作為從機。然后發送命令CMD16配置有效的數據包長度。完成以上命令的發送后,FPFA發送寫指令CMD24至eMMC芯片,并且在FPGA收到正確的命令響應之后開啟數據的傳輸。eMMC芯片開始接收時,首先將數據接收到內部緩存器中,同時對接收到的每1 bit數據進行校驗,當接收完一幀數據時,會將CRC正確與否的標志通過數據線0發送至FPGA,該標志包括3位,若該標志為2時表示數據寫入正確,此時緩存器中的數據才會編程至內部Flash;若該標志位5時,表示數據寫入過程中出錯,該數據將丟棄。數據在寫入Flash的過程中,不允許其他寫入操作,因此通過拉低數據線0表示數據正在寫入。eMMC寫時序如圖8所示。

圖8 eMMC寫時序圖
對eMMC模塊的讀操作與寫操作大致相同。發送讀命令之前均先發送CMD7、CMD16,分別完成芯片的選擇及數據包長度的配置工作。通過輸入讀命令CMD17,根據該命令中的參數選擇指定地址的芯片進行數據的讀取。等待命令線收到來自eMMC存儲器的響應后,開啟數據的回讀操作。eMMC模塊讀流程如圖9所示。

圖9 eMMC模塊讀流程圖
FPGA與eMMC進行數據或命令的交互時,需要對數據及命令分別按照不同的傳輸格式進行組幀,并計算CRC。對數據進行組幀的功能由eMMC控制模塊中的子模塊數據處理模塊完成。為檢驗數據處理模塊邏輯設計的嚴密性,編寫仿真文件對模塊內相關信號進行觀察。由于數據及命令在組幀過程中遵循不同的幀格式,其CRC計算方法也不一致。命令幀的7位CRC按照CRC7校驗方法計算,仿真圖如圖10所示。輸入復位命令0x400000000095的高40位進行校驗計算,得到校驗結果為16’ h4 a,即十進制數95。與輸入數據組幀后即為復位指令,因此可驗證該模塊對于命令幀CRC的計算仿真正確。

圖10 命令幀CRC計算仿真圖
數據幀的16位CRC按照CRC16校驗方法計算,仿真圖如圖11所示。由于系統采用的是8 bit位寬進行數據的傳輸,過程中每一條數據線都會針對本條數據線上的串行數據進行CRC計算。為方便觀察驗證,發送數據從0開始遞增。從圖中可以看出,計算得到的首個CRC為0x1021,設計正確。

圖11 命令幀CRC計算仿真圖
采用在線邏輯分析儀Chipscope對GTX控制模塊進行仿真。為使得驗證結果更加直觀,對GTX模塊進行閉環驗證,即收發模塊進行連接,輸入16 bit的遞增數據,對數據收發同時進行測量并繪制折線圖,如圖12所示。從圖中可以看出,數據收發一致。該模塊可以實現數據的高速傳輸功能。

圖12 GTX模塊收發數據曲線圖
eMMC模塊的初始化是對eMMC模塊進行其他操作的前提。為驗證eMMC控制模塊是否能正確實現對eMMC芯片的初始化操作,采用Chipscope對該模塊的相關信號進行在線監測。首先按照初始化流程,輸入相應的指令,完成對eMMC芯片內部相關寄存器的配置。然后通過命令線觀察回應,判斷初始化完成狀態。如圖13所示,從圖中可以看出,當主機發送完時鐘切換指令0x4603b901002f后,命令線上的回應為0x0600000800cb,表明eMMC芯片初始化已完成。

圖13 eMMC模塊初始化驗證圖
為加快數據的寫速率,簡化寫入步驟。在FPGA對eMMC芯片進行寫操作時,采用多塊寫的方式進行。數據傳輸前,設置好寫入數據的塊數據寫入后,將自行完成塊數的遞增,并完成數據的寫入。發送完預設的數據字節長度后,不斷查詢數據線0上的校驗標志,來確認數據寫入的正確性。如圖14所示,經系統驗證,數據線0返回的3bit CRC標志為0x010,表示多塊寫成功。

圖14 eMMC模塊多塊寫驗證圖
eMMC模塊數據讀操作同樣采取預先設置指定讀塊數,然后發送讀命令后,自動讀取相應eMMC地址的數據。通過對比塊數預設值和讀取值,來判定讀流程是否結束。經系統驗證,預設讀取6塊數據幀,同時對讀取的數據幀進行計數,結果數值一致,驗證正確。完成的方式。eMMC模塊的數據讀過程如圖15所示。

圖15 eMMC模塊多塊讀驗證圖
對系統各模塊功能進行驗證后,需針對全局時序進行仿真驗證。FPGA主控模塊識別上位機輸入的寫命令,控制GTX模塊啟動對外部數據的接收,然后經過eMMC控制模塊對數據重新組幀處理后,將其串行輸入至eMMC陣列中。對該過程采用Chipscope進行在線監測,如圖16所示。根據數據的采樣點,計算其傳輸速度為2.4 Gbps,從而驗證了本設計可以實現數據的高速存儲。

圖16 系統寫驗證圖
上位機輸入讀命令后,啟動對eMMC陣列的數據讀取。然后將讀取的數據進行相應的處理后,發送給GTX控制模塊發送至外部設備。對該過程采用Chipscope進行在線監測,如圖17所示。根據數據采樣點,計算其傳輸速度為3.0 Gbps,實現了數據的高速讀取。

圖17 系統讀驗證圖
測試設備采用對比工具,將回讀的數據與發送的數據進行比較后,確認數據的一致性。驗證了數據傳輸存儲的正確性和可靠性。
系統為實現對某飛行仿真數據的快速存儲,設計了基于eMMC陣列的高速大容量數據的存儲設計。采用GTX控制模塊與eMMC控制模塊相協作,實現了對大容量數據的高速存儲,數據存儲速率為2.4 Gbps。通過對數據回讀驗證,系統傳輸存儲設計穩定可靠,數據未出現錯幀丟幀的現象。系統采用eMMC陣列進行數據的存儲,簡化了FPGA對存儲器的讀寫控制,縮短了研發周期,節約了成本,為大容量數據的測試提供了良好的保障。