基于SATAII協(xié)議的CRC32并行算法的研究
串行比特型算法可以很容易通過(guò)帶反饋的移位寄存器的硬件實(shí)現,其吞吐率可以達到200 Mbps,但是遠遠不能達到高速通信系統的要求。
對于查表法生成CRC校驗碼,要預先汁算好所要的有效信息位,并存放信息位表中,然后按信息位的順序計算好所有校驗位,并存放于表中,待要使用時(shí)通過(guò)查表輸出對于的CRC校驗值。但這種方法需要較大的存儲空間存儲長(cháng)度較大的CRC余數表,并且隨著(zhù)并行位數的增加,余數表的長(cháng)度按指數增加,對于CRC32規范也不具有現實(shí)性。
因此,SATA協(xié)議中需采用并行CRC32算法以達到3 Gbps的吞吐率。
3 CRC32并行算法推導
CRC32并行算法可由串行比特型算法推導而出。
令需進(jìn)行校驗的32位數據以Q0表示,32位移位寄存器初始值用M0表示即:
Q0=[D0D1D2D3…D31]T (8)
M0=[C0C1C2C3…C31]T (9)
自反饋的移位運算可以采用狀態(tài)轉移矩陣表示,i+1次移位后寄存器的狀態(tài)Qi+1與i次移位后寄存器的狀態(tài)Qi之間的關(guān)系可通過(guò)狀態(tài)矩陣A表示為:Qi+1=AQi,進(jìn)一步又可得到第i次的狀態(tài)Qi可通過(guò)初始狀態(tài)Q0表示為:

式中狀態(tài)轉移矩陣A可由式(7)和CRC32串行實(shí)現框圖推導得到。首先32位數據串行輸入,與移位寄存器相關(guān)位中的初始值進(jìn)行模2加減運算,32次移位后數據輸入完畢,即:

然后再進(jìn)行32次移位,移位寄存器中的內容即為所求的CRC校驗值,則:

由式(13)可知:CRC校驗值只與CRC校驗初始值M0和需校驗數據Q0有關(guān),其中A64和A32可以由MATLAB計算得出。通過(guò)計算,可以得出CRC校驗最高位為:

4 SATA協(xié)議中CRC32算法實(shí)現
SATA總線(xiàn)主要由應用層、傳輸層、鏈路層和物理層組成,其中傳輸層主要用于傳輸數據命令,鏈路層則是對數據進(jìn)行編碼和解碼以保證數據在鏈路中正確傳輸。SATA總線(xiàn)鏈路中的信息包含兩種結構:原語(yǔ)(Primitive)和幀(Frame),兩者都以雙字為最小的單位,其結構如圖2所示。本文引用地址:http://dyxdggzs.com/article/159619.htm
幀結構由多個(gè)雙字組成,包括幀頭(SOF)、幀數據、幀尾(EOF)和用于控制碼流的控制原語(yǔ)HOLD原語(yǔ)和HOLDA原語(yǔ)。SATA協(xié)議中CRC校驗模塊需自動(dòng)識別出數據流中的原語(yǔ),并不計算這些原語(yǔ)的CRC值。在發(fā)送信息時(shí),需要由幀數據生成CRC碼,即所有非原語(yǔ)數據都要進(jìn)行CRC編碼,并且將生成的CRC值插入到幀尾(EOF)之前進(jìn)行傳輸。在接受到數據時(shí),需要對幀數據進(jìn)行CRC校驗,從而判斷數據在鏈路中傳輸是否出錯。在SATA協(xié)議中規定CRC校驗初始值0x52325032,并且在幀頭和幀尾中的數據不能超過(guò)2 046個(gè)雙字。
評論