薛俊 段發(fā)階 蔣佳佳 李彥超 袁建富 王憲全
摘要:
在水聲信號探測數(shù)據(jù)的傳輸過程中,現(xiàn)場可編程門陣列(FPGA)通過傳統(tǒng)串行方法對長數(shù)據(jù)幀進(jìn)行循環(huán)冗余校驗(yàn)(CRC)時(shí)無法達(dá)到速度要求,而更快速的并行校驗(yàn)方法存在因編程復(fù)雜帶來的實(shí)際工程應(yīng)用困難問題。為了滿足傳輸對校驗(yàn)速度的需求,降低編程難度和縮短編程時(shí)間,設(shè)計(jì)了一種借助Matlab對任意長度數(shù)據(jù)幀自動編寫并行CRC程序語句的方法。該計(jì)算方法基于矩陣法數(shù)學(xué)原理,借助Matlab完成所有數(shù)學(xué)推導(dǎo)計(jì)算過程,然后直接輸出符合Verilog HDL語法規(guī)則的并行CRC校驗(yàn)程序語句。通過在Quartus Ⅱ 9.0中仿真,進(jìn)一步在民用拖曳聲吶陣列系統(tǒng)上進(jìn)行數(shù)據(jù)傳輸實(shí)驗(yàn),驗(yàn)證了Matlab自動編程方法的有效性:校驗(yàn)程序的自動編寫輸出能在幾十秒內(nèi)完成,同時(shí)生成的并行CRC校驗(yàn)程序能在滿足數(shù)據(jù)傳輸速度要求的情況下正確地計(jì)算出系統(tǒng)中傳輸協(xié)議定義的長數(shù)據(jù)幀的校驗(yàn)碼。
關(guān)鍵詞:
循環(huán)冗余校驗(yàn);并行計(jì)算;Matlab;Verilog硬件描述語言;現(xiàn)場可編程門陣列
中圖分類號:
TN919.3+3
文獻(xiàn)標(biāo)志碼:A
Abstract:
During underwater signal data transmission process, using Field Programmable Gate Array (FPGA) to calculate Cyclic Redundancy Check (CRC) code with traditional serial calculating method cannot meet the demand of fast computation; however, parallel checking method, which is much faster, has difficulty in practical engineering application because of programming complexity. In order to meet the demand of transmission speed, to eliminate programming difficulty and time waste, a method was proposed to automatically generate parallel CRC calculating code for any length data frames by Matlab. It finished all the mathematical deductions based on matrix method and calculations with the help of Matlab and then generated parallel CRC calculating program which conforms to the Verilog HDL grammar rules. Finally, the CRC calculation program statements generated by Matlab were first simulated in Quartus II 9.0 and then demonstrated by data transmission experiments on a civil towed sonar system. The results prove the validity of the proposed method, its programming and generation can be finished in tens of seconds, and the CRC module can accurately figure out CRC code of every long data frame defined by transmission protocol within requested time.
英文關(guān)鍵詞Key words:
Cyclic Redundancy Check (CRC); parallel computing; Matlab; Verilog Hardware Description Language (Verilog HDL); Field Programmable Gate Array (FPGA)
0引言
在現(xiàn)代數(shù)字通信中,循環(huán)冗余校驗(yàn)(Cyclic Redundancy Check, CRC)是一種廣泛運(yùn)用于通信網(wǎng)絡(luò)以及自定義數(shù)據(jù)傳輸協(xié)議中的數(shù)據(jù)傳輸檢錯(cuò)方法[1-3] 。CRC校驗(yàn)主要分為串行法和并行法兩類。采用串行方法計(jì)算校驗(yàn)碼時(shí),待校驗(yàn)數(shù)據(jù)隨時(shí)鐘節(jié)拍依次逐位移入線性反饋移位寄存器(Linear Feedback Shift Register, LFSR)中,當(dāng)數(shù)據(jù)輸入完成時(shí)獲得CRC校驗(yàn)碼[4]。該方法實(shí)現(xiàn)簡單,是目前較常用方法,但該方法受時(shí)鐘節(jié)拍頻率限制。在許多大規(guī)模數(shù)據(jù)傳輸應(yīng)用場合,如使用拖曳聲吶陣列進(jìn)行水聲信號探測,石油、地質(zhì)勘探等,當(dāng)數(shù)據(jù)幀傳輸頻率達(dá)到幾百兆赫茲且數(shù)據(jù)在處理器內(nèi)部不再是逐位串行輸入輸出時(shí),在常用處理芯片如現(xiàn)場可編程門陣列(Field Programmable Gate Array, FPGA)中采用串行方法進(jìn)行CRC校驗(yàn)難以滿足速度需求。此時(shí),必須對傳統(tǒng)的LFSR 結(jié)構(gòu)進(jìn)行改進(jìn)或采用新的并行CRC計(jì)算結(jié)構(gòu)來提升校驗(yàn)速度[5-6]。
目前,國內(nèi)外學(xué)者提出了許多種提升CRC校驗(yàn)速度的方法。如Cheng等[7]通過改進(jìn)LFSR結(jié)構(gòu),使其具有一定的并行能力并提高了運(yùn)算速度。文獻(xiàn)[8-9]介紹了通過查詢碼表的方法來計(jì)算校驗(yàn)碼的方法,但該方法需要預(yù)先計(jì)算出CRC校驗(yàn)碼值,當(dāng)數(shù)據(jù)幀位數(shù)較長時(shí),對應(yīng)碼表將會變得比較復(fù)雜,同時(shí)會占用較多的處理器內(nèi)部儲存空間。文獻(xiàn)[10]提出了一種多通道同步CRC計(jì)算的方法,將整個(gè)數(shù)據(jù)分成E段,每段同時(shí)計(jì)算該段校驗(yàn)碼,最后由E個(gè)子校驗(yàn)碼共同計(jì)算出數(shù)據(jù)整體的CRC校驗(yàn)碼;該方法在數(shù)據(jù)幀長度較長時(shí)數(shù)學(xué)理論推導(dǎo)繁瑣,實(shí)際在FPGA中編程較復(fù)雜。文獻(xiàn)[11-12]對并行CRC計(jì)算實(shí)現(xiàn)方法之一的矩陣法進(jìn)行了介紹。矩陣法以向量和矩陣的數(shù)學(xué)形式表示出每個(gè)時(shí)鐘周期輸入LFSR中的數(shù)據(jù)與該時(shí)鐘周期前、后兩次CRC校驗(yàn)碼寄存器值的關(guān)系。通過該關(guān)系逐次遞推,最終遞推出m(m表示待校驗(yàn)數(shù)據(jù)位數(shù))位數(shù)據(jù)串行輸入后的CRC校驗(yàn)碼值。矩陣法具有數(shù)學(xué)推導(dǎo)邏輯關(guān)系相對簡明、易于向位數(shù)更多的數(shù)據(jù)擴(kuò)展等優(yōu)點(diǎn)。但隨著待校驗(yàn)數(shù)據(jù)幀長度的增加,該方法中矩陣迭代次數(shù)也隨即增多,線性代數(shù)計(jì)算過程愈加復(fù)雜,同時(shí)得出的CRC校驗(yàn)程序語句更加冗長,使得人工程序編寫、輸入的過程容易產(chǎn)生差錯(cuò)。以上兩點(diǎn)因素制約了矩陣法在FPGA中對多字節(jié)長數(shù)據(jù)幀進(jìn)行CRC校驗(yàn)的應(yīng)用。同時(shí),在數(shù)據(jù)傳輸量大、傳輸速度快的實(shí)際工程應(yīng)用場合,如地震勘探儀器、海洋聲學(xué)儀器等由于串行CRC校驗(yàn)方式無法滿足速度需求,它們也需要一種有效的、方便的并行CRC校驗(yàn)編程方法。
綜上所述,本文設(shè)計(jì)了一種通過Matlab自動完成基于Verilog語言的 CRC并行校驗(yàn)程序編寫的方法。該方法借助Matlab自動完成了所有線性代數(shù)運(yùn)算,并將獲得的結(jié)果翻譯輸出成符合Verilog 語法要求的CRC校驗(yàn)程序語句。將輸出的程序語句在Quartus Ⅱ 9.0開發(fā)環(huán)境中生成并行CRC校驗(yàn)?zāi)K,該模塊可直接應(yīng)用。同時(shí),該方法可以生成任意長度數(shù)據(jù)的CRC校驗(yàn)程序,方便向更長位數(shù)數(shù)據(jù)幀拓展。
將式(2)依次遞推m次,就能將寄存器中的最終計(jì)算出的CRC校驗(yàn)碼值Dm通過第0時(shí)鐘周期的初值D0以及在m時(shí)鐘周期內(nèi)移入的m位數(shù)據(jù)ij表示出來,即如式(5)所示:
Dm=TmD0+Tm-1Si0+…+TSim-2+Sim-1(5)
如果同時(shí)輸入m位數(shù)據(jù)ij,式(5)中所有的參數(shù)將都成為已知量。此時(shí)只需要一個(gè)時(shí)鐘周期就能計(jì)算得到列向量Dm的具體值。因此,采用并行計(jì)算的方式將不用等待每位待校驗(yàn)數(shù)據(jù)隨時(shí)鐘節(jié)拍移入計(jì)算結(jié)構(gòu),僅需要較短的幾個(gè)時(shí)鐘周期便能計(jì)算出數(shù)據(jù)的CRC校驗(yàn)碼。但矩陣法中大量的矩陣、向量間加法、異或計(jì)算以及多次乘法帶來了龐大的計(jì)算量,給人工計(jì)算和編程帶來困難??梢杂?jì)算出式(5)中總共進(jìn)行加法和異或運(yùn)算的次數(shù)Ca為:
Ca=(n-1)n2×(m-1+m-2+…+1)+(n-1)
n×m+n×m=n2(n-1)m(m-1)/2+n2m(6)
總共需要的矩陣向量間乘法次數(shù)Cm為:
Cm=n3×(m-1+m-2+…+1)+n×m+
n×n×m=n3m(m-1)/2+n2m+nm(7)
可以看出,矩陣法的運(yùn)算量十分巨大,并且將隨著待編碼數(shù)據(jù)幀長度m以及校驗(yàn)碼位數(shù)n的增加而迅速增加。
2Matlab程序?qū)崿F(xiàn)
Matlab中程序主要分成兩個(gè)部分。第一步是完成其中復(fù)雜的線性代數(shù)運(yùn)算,即計(jì)算式(5),并將結(jié)果信息保存到一個(gè)建立的n×m維度儲存空間A中,其中n與m表示的含義與前文定義相同。第二步將A中存儲的信息翻譯成對應(yīng)的CRC計(jì)算程序語句信息,然后根據(jù)A中信息自動生成符合Verilog HDL語法規(guī)則的CRC校驗(yàn)碼計(jì)算程序語句,并將生成的程序語句保存在一個(gè)外部txt文件中。Matlab中程序的流程如圖1所示。
2.1Matlab數(shù)學(xué)計(jì)算
由于CRC校驗(yàn)存在多種不同的校驗(yàn)類型(如CRC8,CRC16,CRCCCITT,CRC32等),校驗(yàn)計(jì)算使用的相關(guān)參數(shù)也不相同,在Matlab編程時(shí)預(yù)先輸入不同校驗(yàn)類型對應(yīng)的不同參數(shù),其中包括每種校驗(yàn)類型對應(yīng)的n維矩陣T與向量S等。在實(shí)際使用時(shí),只需要根據(jù)CRC校驗(yàn)類型選擇調(diào)用對應(yīng)的參數(shù)以及輸入待校驗(yàn)數(shù)據(jù)幀長度m,Matlab將根據(jù)前面選擇和輸入的參數(shù)創(chuàng)建一個(gè)n×m維空間A來儲存計(jì)算過程中的結(jié)果。接下來通過循環(huán)計(jì)算Dm表達(dá)式中每項(xiàng)Tm-jS,即得到m個(gè)n維列向量Ej。
對Matlab編程時(shí)需要注意以下幾點(diǎn):首先,Matlab中能精確存儲的整形數(shù)位數(shù)遠(yuǎn)低于Tm-jS計(jì)算過程中產(chǎn)生數(shù)據(jù)的位數(shù);若直接計(jì)算Tm-jS,計(jì)算過程將產(chǎn)生截?cái)嗾`差或產(chǎn)生報(bào)錯(cuò)導(dǎo)致程序無法運(yùn)行。因此,需要先將矩陣、向量轉(zhuǎn)換為symbol型對象,以symblol型數(shù)據(jù)類型參加數(shù)學(xué)運(yùn)算,否則即使計(jì)算得出結(jié)果也將因?yàn)閬G失精度而失去意義。其次,Ej中第k位元素值Ej[k]的數(shù)學(xué)含義是:m數(shù)據(jù)中的im-1-j位在16位校驗(yàn)碼中第k位的計(jì)算中進(jìn)行異或計(jì)算的總次數(shù)。由異或運(yùn)算的定義可知:數(shù)據(jù)a與數(shù)據(jù)b進(jìn)行偶數(shù)次異或運(yùn)算時(shí),結(jié)果仍然是a本身,與b無關(guān);只有它們進(jìn)行奇數(shù)次異或運(yùn)算時(shí),結(jié)果才由a、b共同決定。因此,若元素Ej[k]的值是偶數(shù),表示數(shù)據(jù)幀中的im-1-j位對校驗(yàn)碼第k位的計(jì)算不產(chǎn)生影響;反之,Ej[k]是奇數(shù)時(shí)則表示im-1-j位對校驗(yàn)碼中的第k位計(jì)算有貢獻(xiàn),需要在計(jì)算式中反映出該位數(shù)據(jù)值。為了得到數(shù)據(jù)的奇偶性,可將Ej中每個(gè)元素轉(zhuǎn)化為char型后提取末位數(shù)數(shù)值,進(jìn)行mod(Ej[k],2)判斷。結(jié)果是奇數(shù)則將1儲存到前面定義的儲存空間A中第k行第j列,反之在對應(yīng)位置儲存0。
從表1可以看出:在CRC校驗(yàn)種類確定后,Matlab生成校驗(yàn)?zāi)K的時(shí)間較短,可在幾十秒鐘內(nèi)完成,并且運(yùn)行時(shí)間與待校驗(yàn)數(shù)據(jù)長度m基本成正比。
與項(xiàng)目之前采用的人工程序編寫方式進(jìn)行比較。人工CRC校驗(yàn)程序編寫方式是:手動操作數(shù)學(xué)計(jì)算軟件進(jìn)行一次向量、矩陣運(yùn)算,產(chǎn)生一次結(jié)果。編程者根據(jù)CRC運(yùn)算的數(shù)學(xué)含義,將線性代數(shù)運(yùn)算的結(jié)果翻譯為對應(yīng)計(jì)算程序語句并輸入開發(fā)環(huán)境。以拖曳聲吶陣列系統(tǒng)項(xiàng)目中數(shù)據(jù)傳輸為例,傳輸協(xié)議規(guī)定每一個(gè)電子艙所負(fù)責(zé)收集的16道水聽器數(shù)據(jù)在打包完成后數(shù)據(jù)幀總長度是78B(702b)。這表示當(dāng)人工編程時(shí),需要對應(yīng)進(jìn)行線性代數(shù)計(jì)算和對應(yīng)程序輸入702次。如果僅考慮每次編程者程序輸入的時(shí)間,編程者在操作熟練后至少需要2min。在輸入完成后也需要至少一次相同長時(shí)間的檢查來防止人工操作產(chǎn)生差錯(cuò)。所以僅校驗(yàn)計(jì)算式程序輸入這一項(xiàng)需要的總時(shí)間至少是:702×2×2=2808min,約等于47h。同時(shí),這個(gè)時(shí)間還不包括其他因素,如操作軟件時(shí)間、校正差錯(cuò)時(shí)間等額外時(shí)間。而借助于軟件自動生產(chǎn)程序,從表1可知即使對1024b長數(shù)據(jù)幀進(jìn)行并行CRC校驗(yàn)編程也僅需要約38s,顯著少于人工操作時(shí)至少需要的47h時(shí)間,極大地提高了編程的效率,降低了項(xiàng)目成員編程負(fù)擔(dān)。同時(shí),由Matlab自動產(chǎn)生的程序語句準(zhǔn)確率高,避免了人工操作可能產(chǎn)生的差錯(cuò)。
3仿真與實(shí)驗(yàn)
3.1仿真部分
選擇CRC16校驗(yàn)形式,輸入一次并行校驗(yàn)數(shù)據(jù)寬度128b, Matlab將生成的CRC校驗(yàn)程序儲存在txt文件中。將程序直接拷貝到Quartus Ⅱ 9.0開發(fā)環(huán)境中,在工程中生成CRC校驗(yàn)功能模塊,并對該模塊進(jìn)行仿真。仿真FPGA的型號采用的是實(shí)驗(yàn)室在研究用聲吶拖曳陣?yán)|系統(tǒng)上正在使用的ALTERA公司Cyclone Ⅲ系列EP3C25F324I7N型。仿真實(shí)驗(yàn)工程頂層.bdf文件中各個(gè)模塊如圖2所示。
通過計(jì)算機(jī)產(chǎn)生偽隨機(jī)序列來模擬實(shí)際使用中可能遇到的各種數(shù)據(jù)信號。左側(cè)模塊是偽隨機(jī)序列產(chǎn)生模塊rand_num_gene,通過它產(chǎn)生128b長度的偽隨機(jī)序列,傳入右側(cè)的并行CRC校驗(yàn)?zāi)Kcrc16_paral和下方的基于LFSR結(jié)構(gòu)的串行CRC校驗(yàn)?zāi)Kcrc16_serial。由偽隨機(jī)序列模擬的待校驗(yàn)數(shù)據(jù)分別以并行和串行的方式分別隨時(shí)鐘節(jié)拍pclk與sclk進(jìn)入到兩個(gè)模塊中進(jìn)行CRC校驗(yàn),分別按照兩種方式計(jì)算出CRC校驗(yàn)碼,并在串行校驗(yàn)?zāi)K計(jì)算完成后比較兩組CRC校驗(yàn)碼值。通過比較兩個(gè)模塊對相同的2000組偽隨機(jī)序列的校驗(yàn)結(jié)果,發(fā)現(xiàn)兩個(gè)模塊計(jì)算得出的CRC校驗(yàn)碼完全相同,只存在計(jì)算消耗時(shí)間的不同,并行校驗(yàn)?zāi)K僅需要2個(gè)時(shí)鐘周期即可計(jì)算出校驗(yàn)碼值,而串行校驗(yàn)?zāi)K需要128個(gè)時(shí)鐘周期。這表明由Matlab自動生成的并行CRC校驗(yàn)計(jì)算程序的正確性。圖3表示顯示的是crc16_paral的時(shí)序圖,圓框圈出的數(shù)據(jù)是并行計(jì)算得到的CRC校驗(yàn)碼值。
3.2拖曳陣?yán)|系統(tǒng)上實(shí)驗(yàn)
將自動生成的并行CRC校驗(yàn)?zāi)K運(yùn)用到民用拖曳聲吶陣?yán)|系統(tǒng)項(xiàng)目中的水聲數(shù)據(jù)傳輸過程中進(jìn)行實(shí)驗(yàn)。
拖曳聲吶系統(tǒng)的作用是將拖曳陣?yán)|內(nèi)呈直線陣列分布的各道水聽器采集的水聲信號收集、處理后上傳至上位機(jī)進(jìn)行后續(xù)處理和使用。由于拖纜較長,水聽器分布距離較遠(yuǎn),數(shù)據(jù)的遠(yuǎn)距離傳輸需要通過纜間電子艙集中處理以及進(jìn)行中繼。同時(shí),拖曳聲吶陣?yán)|在水下環(huán)境工作時(shí)存在著如低溫、振動、外部拖曳產(chǎn)生的拉、壓應(yīng)力等可能影響數(shù)據(jù)傳輸可靠性的因素。所以為了保證數(shù)據(jù)幀傳輸?shù)目煽啃?,有必要對向岸基、船基上位機(jī)上傳的數(shù)據(jù)進(jìn)行CRC校驗(yàn)。在拖曳聲吶系統(tǒng)的數(shù)據(jù)傳輸協(xié)議中,定義每幀數(shù)據(jù)在不包含2B CRC校驗(yàn)碼時(shí),由14B幀頭加64B數(shù)據(jù)共78B組成,協(xié)議同時(shí)規(guī)定每字節(jié)數(shù)據(jù)是9b。因此每次組幀完畢后需同時(shí)校驗(yàn) 702b長度數(shù)據(jù)。在幾千赫茲頻率的高速率采樣下,總體成百上千道數(shù)的水聽器將帶來巨大的數(shù)據(jù)量,如果依靠傳統(tǒng)串行方式,F(xiàn)PGA內(nèi)部時(shí)鐘頻率無法達(dá)到速度要求。
在天津大學(xué)青年湖內(nèi)進(jìn)行的聲吶系統(tǒng)數(shù)據(jù)傳輸實(shí)驗(yàn)如圖4所示。
電子艙1與電子艙2經(jīng)過一段75m長的內(nèi)含水聽器的聲吶陣?yán)|相連。為了便于實(shí)驗(yàn)操作,將電子艙1與艙2從湖中移出,放置于岸上靠近位置;并將艙1、2內(nèi)電路板(傳輸板Tr與采集板Cl)從不銹鋼水密外殼中取出。陣列其余纜段與電子艙仍然以直線陣列形式布放于湖中采集水下聲信號。系統(tǒng)正常工作時(shí),電子艙2本級以及下級艙采集的水聲數(shù)據(jù)經(jīng)艙2逐級上傳到電子艙1中(如圖中②部分)。另一方面,為了檢驗(yàn)傳輸數(shù)據(jù)的正確性,將電子艙2的傳輸板通過4根15cm長的屏蔽雙絞線(如圖4中電子艙1、2間連線①所示)與在一旁的電子艙1上傳輸板相連,直接進(jìn)行數(shù)據(jù)的傳輸。此時(shí),下級到達(dá)艙2的每一幀數(shù)據(jù)同時(shí)經(jīng)過兩條傳輸通路上傳:一條通路是按照正常工作時(shí)經(jīng)過75m拖纜上傳。該通路傳輸距離較長且位于水下,可能受到的環(huán)境影響因素較多。另一條通路是近距離的直接數(shù)據(jù)交換,位于岸上穩(wěn)定環(huán)境,傳輸距離較短,不易出現(xiàn)差錯(cuò)。因此,實(shí)驗(yàn)將通路1選作對照組,以它作為正確的基準(zhǔn),將經(jīng)過通路2上傳的數(shù)據(jù)幀與CRC校驗(yàn)碼與由通路1上傳的數(shù)據(jù)幀與校驗(yàn)碼對比,即可知道數(shù)據(jù)上傳是否出現(xiàn)差錯(cuò)以及檢驗(yàn)CRC校驗(yàn)是否有效。同時(shí)在電子艙1的傳輸板程序中設(shè)置一個(gè)計(jì)數(shù)器,記錄通道1與通道2上傳的數(shù)據(jù)的不同次數(shù)。
聲吶陣列采集的水下數(shù)據(jù)為湖中背景噪聲。該背景噪聲是一個(gè)無規(guī)律的連續(xù)信號,數(shù)值隨機(jī),適合作為拖纜長時(shí)間采集的數(shù)據(jù)。聲吶陣列以4000Hz的采樣頻率采集10組水下背景噪聲,每次連續(xù)采集6×106次數(shù)據(jù),每次采集持續(xù)約25min。
在實(shí)驗(yàn)的過程中計(jì)算機(jī)通過USB blaster連接到電子艙1傳輸板上FPGA,通過Quartus內(nèi)的Signal Tap II邏輯分析儀實(shí)時(shí)查看數(shù)據(jù)波形。如圖5所示,dat_out通道顯示電子艙1接收到的電子艙2經(jīng)由通道1雙絞線直接上傳的數(shù)據(jù)與CRC碼。在兩字節(jié)0前的兩個(gè)9b字節(jié)02Eh與0B6h是CRC16校驗(yàn)碼(最高位補(bǔ)充0);sig79與sig80兩個(gè)通道顯示的是艙1接收到的通過傳輸通道2上傳的CRC校驗(yàn)碼;out11與out22兩個(gè)通道顯示的是電子艙1傳輸板本地再次對傳輸通道2上傳數(shù)據(jù)進(jìn)行CRC校驗(yàn)得到的校驗(yàn)碼??梢钥吹?, sig79和sig80以及out11和out22分別與的兩字節(jié)CRC校驗(yàn)碼相同,均為02Eh和0B6h。此時(shí)error_flag信號也一直置于高電平,10組采集結(jié)束后,每組完成后計(jì)數(shù)器記錄數(shù)值是0。
實(shí)驗(yàn)結(jié)果說明在10次數(shù)據(jù)采集過程中,正常情況下經(jīng)75m拖纜上傳的數(shù)據(jù)與經(jīng)過通路1上傳的艙2數(shù)據(jù)和校驗(yàn)碼完全相同,電子艙1到電子艙2間數(shù)據(jù)傳輸沒有出現(xiàn)錯(cuò)誤,并且CRC校驗(yàn)碼也正確計(jì)算。實(shí)驗(yàn)結(jié)果符合預(yù)期。
進(jìn)一步實(shí)驗(yàn):改變傳輸通路,使傳輸通路2產(chǎn)生數(shù)據(jù)傳輸錯(cuò)誤。由于聲吶拖纜內(nèi)電線包裹在專用復(fù)合材料拖纜皮中且充有特殊專用液體,難以干擾,不易破壞。于是實(shí)驗(yàn)選擇通過人為將裸露的電子艙2與相連拖纜段之間的艙纜接插件接口故意擰松,造成傳輸線因接觸不良引起傳輸數(shù)據(jù)改變。再次重復(fù)上述10次采集過程,觀察數(shù)據(jù)傳輸結(jié)果變化。
同樣在實(shí)驗(yàn)過程中通過Signal TapⅡ查看實(shí)時(shí)數(shù)據(jù)數(shù)值,如圖6所示:電子艙1接收到的通道1上傳的校驗(yàn)碼是07Ch與020h,sig79與sig80兩個(gè)通道顯示的接收由通道2上傳的CRC校驗(yàn)碼是022h與0B6h,而out11與out22兩個(gè)通道顯示的艙1本地再次對通道2上傳數(shù)據(jù)校驗(yàn)得到的兩字節(jié)校驗(yàn)碼是0A5h與00Ah。三者均不相同。此時(shí),通道error_flag標(biāo)志位產(chǎn)生了兩個(gè)時(shí)鐘周期低電平。在每次采集結(jié)束后,計(jì)數(shù)器的數(shù)值不再為0,而是一個(gè)不一定相等的小于6×106的7位數(shù)值。這是因?yàn)閷⒔硬寮Q松后,艙2通過拖纜上傳的數(shù)據(jù)與校驗(yàn)碼因?yàn)榻佑|不良而發(fā)生改變,艙1接收的上傳數(shù)據(jù)和校驗(yàn)碼不再對應(yīng),因此三個(gè)校驗(yàn)碼值均不相等。計(jì)數(shù)器記錄的7位數(shù)值是數(shù)據(jù)傳輸錯(cuò)誤的次數(shù)。
實(shí)驗(yàn)現(xiàn)象說明只要數(shù)據(jù)傳輸過程出現(xiàn)錯(cuò)誤,通過上級電子艙再次對數(shù)據(jù)計(jì)算CRC校驗(yàn)過程就能知道上傳的數(shù)據(jù)與它對應(yīng)的校驗(yàn)碼不再對應(yīng)。此時(shí)CRC校驗(yàn)的確起到了差錯(cuò)檢驗(yàn)的效果。借助于CRC校驗(yàn)?zāi)苡行У匕l(fā)現(xiàn)并定位在拖曳聲吶陣列中的發(fā)生的數(shù)據(jù)傳輸錯(cuò)誤。
通過上述仿真與實(shí)驗(yàn),驗(yàn)證了通過本文方法快速的生成CRC校驗(yàn)?zāi)K的正確性與實(shí)用性。
4結(jié)語
CRC校驗(yàn)在數(shù)據(jù)傳輸通信中應(yīng)用廣泛并且發(fā)揮著重要作用。本文結(jié)合拖曳聲吶陣列系統(tǒng)中大量數(shù)據(jù)快速CRC校驗(yàn)的實(shí)際應(yīng)用需求,設(shè)計(jì)了一種通過Matlab自動完成數(shù)學(xué)計(jì)算并生成CRC校驗(yàn)程序模塊的方法。該方法只需要確定CRC校驗(yàn)類型以及并行校驗(yàn)數(shù)據(jù)位數(shù),即可快速自動生成滿足Verilog HDL語法規(guī)則的CRC校驗(yàn)程序,生成的程序可直接在開發(fā)環(huán)境中生成模塊并在FPGA上使用。該方法相比人工編程極大地節(jié)約了編程時(shí)間,有效地避免了人工編程易出現(xiàn)差錯(cuò)的問題。在開發(fā)環(huán)境中仿真和在實(shí)際拖曳聲吶陣列系統(tǒng)上的運(yùn)用驗(yàn)證了使用該方法計(jì)算CRC的正確性與實(shí)用性。自動CRC校驗(yàn)程序生成方法在通過FPGA進(jìn)行大規(guī)模數(shù)據(jù)傳輸?shù)膽?yīng)用場合擁有廣闊前景。
參考文獻(xiàn):
[1]
SPRACHMANN M. Automatic generation of parallel CRC circuits [J]. IEEE Design and Test, 2001, 18(3): 108-114.
[2]
KOOPMAN P. 32bit cyclic redundancy codes for Internet applications [C]// DSN 02: Proceedings of the 2002 International Conference on Dependable Systems and Networks. Washington, DC: IEEE Computer Society, 2002: 459-468.
[3]
GRYMEL M, FURBER S B. A novel programmable parallel CRC circuit [J]. IEEE Transactions on Very Large Scale Integration Systems, 2011, 19(10): 1898-1902.
[4]
MATHUKIYA H H, PATEL N M. A novel approach for parallel CRC generation for high speed application [C] // Proceedings of the 2012 International Conference on Communication Systems and Network Technologies. Washington, DC: IEEE Computer Society, 2012: 581-585.
[5]
AYINALA M, PARHI K K. Highspeed parallel architectures for linear feedback shift registers [J]. IEEE Transactions on Signal Processing, 2011, 59(9): 4459-4469.
[6]
ENGDAHL J R, CHUNG D. Fast parallel CRC implementation in software [C] // ICCAS 2014: Proceedings of the 2014 14th International Conference on Control, Automation and Systems. Piscataway, NJ: IEEE, 2014: 546-550.
[7]
CHENG C, PARHI K K. Highspeed parallel CRC implementation based on unfolding, pipelining, and retiming [J]. IEEE Transactions on Circuits and Systems Ⅱ Express Briefs, 2006, 53(10): 1017-1021.
[8]
KOUNAVIS M E, BERRY F L. Novel table lookupbased algorithms for highperformance CRC generation [J]. IEEE Transactions on Computers, 2008, 57(11): 1550-1560.
[9]
李劍鋒.新的高性能CRC查表算法[J].計(jì)算機(jī)應(yīng)用,2011,31(S1):181-182.(LI J F. Highperformance CRC algorithm based on lookup table [J]. Journal of Computer Applications, 2011, 31(S1): 181-182.)
[10]
徐展琦,裴昌幸,董淮南.一種通用多通道并行CRC計(jì)算及其實(shí)現(xiàn)[J].南京郵電大學(xué)學(xué)報(bào)(自然科學(xué)版),2008,28(2):53-57.(XU Z Q, PEI C X, DONG H N. Generalized CRC computation algorithm with multiple channels and its implementation [J]. Journal of Nanjing University of Posts and Telecommunications (Natural Science), 2008, 28(2): 53-57.)