李輝景,王淑琴,任勇峰,甄國(guó)涌,焦新泉(中北大學(xué)儀器科學(xué)與動(dòng)態(tài)測(cè)試教育部重點(diǎn)實(shí)驗(yàn)室,電子測(cè)試技術(shù)重點(diǎn)實(shí)驗(yàn)室,太原 030051)
隨著電子信息技術(shù)飛速發(fā)展,數(shù)據(jù)傳輸在傳輸速率、傳輸距離及誤碼率上有了更高的要求,現(xiàn)今工業(yè)化的應(yīng)用也越來(lái)越追求數(shù)據(jù)在遠(yuǎn)距離傳輸、信道容量及數(shù)據(jù)準(zhǔn)確性三方面的均衡[1]。長(zhǎng)距離傳輸時(shí),并行方式所需成本高、布線(xiàn)復(fù)雜、可靠性低,所以一般采用串行傳輸。傳統(tǒng)串行傳輸技術(shù)如RS-232、RS-422、RS-485等,其數(shù)據(jù)傳輸速率都較低,最大不超過(guò)10 Mbit/s,無(wú)法滿(mǎn)足高速數(shù)據(jù)傳輸?shù)男枨螅?]。LVDS技術(shù)采用極低的電壓擺幅高速差動(dòng)傳輸數(shù)據(jù),具有低功耗、低誤碼率、低串?dāng)_和低輻射等特點(diǎn),理論傳輸速率最高可達(dá)1.923 Gbit/s,使得其在高速數(shù)據(jù)傳輸系統(tǒng)中得到廣泛的應(yīng)用,但是,LVDS信號(hào)本身只能滿(mǎn)足短距離傳輸,不支持遠(yuǎn)距離傳輸。
本文設(shè)計(jì)中,為實(shí)現(xiàn)以120 Mbit/s速率在40 m電纜高速回收彈上數(shù)據(jù),在彈上采編設(shè)備與地面測(cè)試設(shè)備之間采用LVDS技術(shù),并通過(guò)硬件電路對(duì)LVDS接口增加發(fā)送驅(qū)動(dòng)器及接收均衡器,補(bǔ)償長(zhǎng)線(xiàn)傳輸帶來(lái)的信號(hào)衰減,同時(shí),在邏輯設(shè)計(jì)上,引入反饋糾錯(cuò)機(jī)制,解決LVDS信號(hào)只適合短距離傳輸?shù)娜秉c(diǎn),使數(shù)據(jù)在高速遠(yuǎn)距離傳輸過(guò)程中可靠性得到保證。
系統(tǒng)總體設(shè)計(jì)如圖1所示,由彈上采編設(shè)備、地面測(cè)試設(shè)備和計(jì)算機(jī)3部分構(gòu)成。彈上采編設(shè)備采集彈上數(shù)據(jù)并存儲(chǔ);地面測(cè)試設(shè)備轉(zhuǎn)發(fā)計(jì)算機(jī)指令,并回收彈上數(shù)據(jù);計(jì)算機(jī)控制指令的發(fā)送及數(shù)據(jù)回收處理。
系統(tǒng)采用高速LVDS接口實(shí)現(xiàn)數(shù)據(jù)的高速傳輸,在數(shù)據(jù)發(fā)送端(彈上采編設(shè)備),使用SN65LV1023A串化器,將FPGA并行數(shù)據(jù)轉(zhuǎn)化為串行數(shù)據(jù)輸出,為延長(zhǎng)LVDS信號(hào)的傳輸距離,在電纜發(fā)送端增加CLC001AJE高速驅(qū)動(dòng)器,增強(qiáng)信號(hào)驅(qū)動(dòng)能力,同時(shí)在電纜接收端(地面測(cè)試設(shè)備)采用CLC014AJE自適應(yīng)均衡器,補(bǔ)償信號(hào)在長(zhǎng)距離傳輸過(guò)程中出現(xiàn)的衰減,恢復(fù)其原有性能,再通過(guò)SN65LV1224BDBR解串器,將串行數(shù)據(jù)轉(zhuǎn)化為并行數(shù)據(jù),經(jīng)USB數(shù)據(jù)接口傳輸至計(jì)算機(jī)軟件對(duì)數(shù)據(jù)進(jìn)行分析和處理。
圖1 系統(tǒng)總體框圖
電纜和PCB損耗會(huì)使高頻信號(hào)邊沿變化速率降低,引入碼間串?dāng)_,導(dǎo)致高頻長(zhǎng)距離傳輸時(shí)信號(hào)的損耗衰減。SN65LV1023A輸出差分信號(hào)壓差約200 mV,傳輸距離僅10 m左右[3],無(wú)法滿(mǎn)足長(zhǎng)線(xiàn)傳輸?shù)男枨?。CLC001AJE芯片數(shù)據(jù)傳輸速率可達(dá)622 Mbit/s,100 mV差分輸入門(mén)限電壓,通過(guò)調(diào)節(jié)外部電阻,輸出電壓壓差1.6 V~2 V。因此,在信號(hào)發(fā)送端采用驅(qū)動(dòng)芯片,將信號(hào)壓差提升至2 V,延長(zhǎng)信號(hào)傳輸距離。
值得注意的是,CLC001AJE輸入端需端接100 Ω電阻,匹配SN65LV1023A輸出線(xiàn)上阻抗(端接電阻需靠近CLC001AJE輸入端放置),并保證輸入端共模電壓在0.1 V~2.3 V之間,具體電路設(shè)計(jì)如圖2所示。
圖2 LVDS高速驅(qū)動(dòng)器電路設(shè)計(jì)
LVDS信號(hào)通過(guò)傳輸線(xiàn)會(huì)產(chǎn)生損耗,損耗與信號(hào)頻率的平方根成正比。為了使信號(hào)能被接收端可靠的接收,需在接收端補(bǔ)償信號(hào)衰減。CLC014AJE是美國(guó)半導(dǎo)體公司的一款自適應(yīng)均衡器,針對(duì)50 Mbit/s~650 Mbit/s信號(hào),可自動(dòng)補(bǔ)償其在300 m Belden 8281或120 m 5類(lèi)非屏蔽雙絞線(xiàn)上衰減[4~5],且具有極低的抖動(dòng)和功耗。電路設(shè)計(jì)時(shí),信號(hào)輸入共模電壓保持3.4 V,同時(shí)端接100 Ω電阻,匹配傳輸線(xiàn)上阻抗;在ACE+、ACE-之間,串接50 pF~1 μF電容,控制均衡環(huán)路的環(huán)路響應(yīng);輸出信號(hào)進(jìn)入LVDS解串器前,還需進(jìn)行阻抗匹配和輸入電平控制,具體電路設(shè)計(jì)如圖3所示。
圖3 LVDS自適應(yīng)均衡器電路設(shè)計(jì)
本文設(shè)計(jì)中,采用通信技術(shù)中常用反饋糾錯(cuò)傳輸方式,也稱(chēng)自動(dòng)請(qǐng)求重發(fā)(ARQ),實(shí)現(xiàn)數(shù)據(jù)的可靠傳輸。LVDS發(fā)送方數(shù)據(jù)包以1 K為單位,并采用循環(huán)冗余校驗(yàn)(CRC)產(chǎn)生32位校驗(yàn)碼,附于數(shù)據(jù)包之后,與數(shù)據(jù)一同發(fā)送至LVDS接收方,接收方接收到數(shù)據(jù)包n后,做相同的運(yùn)算,若最終校驗(yàn)結(jié)果為0,表明數(shù)據(jù)包正確,通過(guò)422接口發(fā)送確認(rèn)通知,若結(jié)果不為0,則判斷數(shù)據(jù)傳輸出現(xiàn)誤碼,通過(guò)422接口發(fā)送錯(cuò)誤通知,要求發(fā)送方重傳錯(cuò)誤數(shù)據(jù)包n,同時(shí)丟棄原有數(shù)據(jù)包n。然而若發(fā)送方每發(fā)送一包數(shù)據(jù)后,均等待422的反饋通知,再發(fā)送下一包數(shù)據(jù),必然導(dǎo)致數(shù)據(jù)平均傳輸速率嚴(yán)重下降。
為使數(shù)據(jù)的反饋糾錯(cuò)機(jī)制以最低的帶寬損耗,達(dá)到數(shù)據(jù)的高可靠性,本設(shè)計(jì)中改進(jìn)AQR工作方式,采用如圖4所示的方式傳輸。
圖4 LVDS數(shù)據(jù)包ARQ傳輸實(shí)現(xiàn)過(guò)程
數(shù)據(jù)發(fā)送方發(fā)送數(shù)據(jù)包n后,緊接著開(kāi)始發(fā)送數(shù)據(jù)包n+1,當(dāng)發(fā)送第200個(gè)數(shù)據(jù)時(shí)(根據(jù)422通知的delay時(shí)間確定),檢測(cè)數(shù)據(jù)包n反饋通知(此時(shí)接收方發(fā)送的數(shù)據(jù)包n反饋通知已到達(dá)),若是錯(cuò)誤通知,則重傳數(shù)據(jù)包n,若非錯(cuò)誤通知,則繼續(xù)發(fā)送數(shù)據(jù)包n+1。為避免錯(cuò)誤數(shù)據(jù)包一直重傳,出現(xiàn)“死機(jī)”現(xiàn)象,設(shè)置錯(cuò)誤重傳計(jì)數(shù)器,數(shù)據(jù)包重傳次數(shù)達(dá)到3次后,接收方不再發(fā)送錯(cuò)誤通知,存儲(chǔ)錯(cuò)誤數(shù)據(jù)包,等待接收下一包數(shù)據(jù)。采用此種傳輸方式,只在數(shù)據(jù)包出現(xiàn)誤碼時(shí),影響數(shù)據(jù)傳輸速率,故針對(duì)錯(cuò)誤數(shù)據(jù)包出現(xiàn)概率低情況,可以最低帶寬損耗,達(dá)到數(shù)據(jù)傳輸高效、高可靠性。
LVDS數(shù)據(jù)發(fā)送方FPGA控制如圖5所示,flash_ctr模塊操作Flash讀取1 024 byte數(shù)據(jù),并行寫(xiě)入緩存A(或B)、CRC校驗(yàn)?zāi)K中,同時(shí)將1 024 byte數(shù)據(jù)產(chǎn)生的CRC校驗(yàn)碼,與數(shù)據(jù)一并寫(xiě)入緩存A(或B)中,緩存A、B以ping-pong的方式,交替緩存1 024 byte數(shù)據(jù)與其相應(yīng)的校驗(yàn)碼。采用交替緩存的方式,可以確保數(shù)據(jù)發(fā)送前CRC校驗(yàn)碼已寫(xiě)入緩存中,消除校驗(yàn)碼寫(xiě)入帶來(lái)的延遲,提高數(shù)據(jù)發(fā)送速率,每完成一次緩存A(或B)寫(xiě)入,將write_count加 1。
lvds_ctr模塊實(shí)現(xiàn)對(duì)外部LVDS接口控制,將數(shù)據(jù)在時(shí)鐘的上升沿送至數(shù)據(jù)接口,發(fā)送時(shí),lvds_ctr模塊以同樣ping-pong的方式交替從緩存A、B中讀取數(shù)據(jù)并傳輸,發(fā)送完緩存A中數(shù)據(jù)后(包括1 024 byte有效數(shù)據(jù)和32bit CRC校驗(yàn)碼),緊接著發(fā)送緩存B中數(shù)據(jù),當(dāng)發(fā)送第200個(gè)數(shù)據(jù)時(shí),檢測(cè)422_ctr模塊的Error Flag,此時(shí)Error Flag表示緩存A中數(shù)據(jù)是否發(fā)送成功,若為1,則繼續(xù)發(fā)送緩存B數(shù)據(jù),并將read_count加1;若為0,則停止發(fā)送緩存B數(shù)據(jù),重新發(fā)送緩存A中數(shù)據(jù)。lvds_ctr模塊以此方式交替發(fā)送緩存A、B中數(shù)據(jù),并在發(fā)送第200個(gè)數(shù)據(jù)時(shí),判斷上一次數(shù)據(jù)傳輸是否成功。
圖5 LVDS數(shù)據(jù)發(fā)送方邏輯設(shè)計(jì)
flash_ctr模塊和lvds_ctr模塊通過(guò)write_count、read_count實(shí)現(xiàn)對(duì)緩存A、B讀寫(xiě)的相互制約,僅當(dāng)write_count-read_count<2 時(shí),允許 flash_ctr模塊向緩存A或B中寫(xiě)入數(shù)據(jù),保證緩存中數(shù)據(jù)未成功發(fā)送前不被新數(shù)據(jù)覆蓋;僅當(dāng)write_countread_count>0時(shí),允許lvds_ctr模塊發(fā)送緩存A或B中數(shù)據(jù),保證相同數(shù)據(jù)不被多次成功發(fā)送。
LVDS數(shù)據(jù)接收方FPGA控制如圖6所示,lvds_ctr模塊控制外部LVDS接口接收數(shù)據(jù),由于接口同步原因,線(xiàn)路需連續(xù)傳輸數(shù)據(jù),發(fā)送方以10位數(shù)據(jù)的高兩位來(lái)區(qū)分無(wú)效數(shù)、數(shù)據(jù)包和相鄰數(shù)據(jù)包,lvds_ctr模塊在時(shí)鐘上升沿接收1 byte有效數(shù)據(jù),并將數(shù)據(jù)并行寫(xiě)入緩存A(或B)、CRC校驗(yàn)?zāi)K中。數(shù)據(jù)發(fā)送端每包數(shù)據(jù)包括1 024 byte和32位CRC校驗(yàn)碼,lvds_ctr模塊只將1 024 byte有效數(shù)據(jù)寫(xiě)入緩存A(或B),而把整包數(shù)據(jù)寫(xiě)入CRC校驗(yàn)?zāi)K中,校驗(yàn)完成后,判斷傳輸是否產(chǎn)生誤碼,若有誤碼產(chǎn)生,則清除緩存A(或B)中數(shù)據(jù),并停止接收數(shù)據(jù),同時(shí)將Error Flag置0,等待發(fā)送方重傳數(shù)據(jù)(以10位數(shù)據(jù)高兩位判斷重傳數(shù)據(jù)的開(kāi)始位置);若沒(méi)有誤碼產(chǎn)生,則繼續(xù)接收當(dāng)前數(shù)據(jù),并將當(dāng)前數(shù)據(jù)包寫(xiě)入緩存B(或A)和CRC校驗(yàn)?zāi)K中,重復(fù)以上操作,如此交替將有效數(shù)據(jù)寫(xiě)入緩存A、B中,并在每次校驗(yàn)成功后,將 write_count加 1。
圖6 LVDS數(shù)據(jù)接收方邏輯設(shè)計(jì)
422_ctr模塊根據(jù)Error Flag和Error Count決定422應(yīng)答內(nèi)容,若Error Flag為0,且Error Count<3,則發(fā)送錯(cuò)誤通知;若Error Flag為1,則發(fā)送確認(rèn)通知。usb_ctr模塊控制交替讀取緩存A、B中數(shù)據(jù),并發(fā)送至USB接口,每完成一次緩存A或B讀取,將read_count加1。
lvds_ctr模塊和usb_ctr模塊與發(fā)送方一樣通過(guò)write_count、read_count實(shí)現(xiàn)對(duì)緩存 A、B讀寫(xiě)的相互制約,僅當(dāng) write_count-read_count<2時(shí),允許lvds_ctr模塊向緩存A或B中寫(xiě)入數(shù)據(jù),保證緩存中數(shù)據(jù)未讀取前不被新數(shù)據(jù)覆蓋;僅當(dāng)write_count-read_count>0時(shí),允許usb_ctr模塊發(fā)送緩存A或B中數(shù)據(jù),確保讀取數(shù)據(jù)為成功傳輸?shù)挠行?shù)據(jù)。
3.4.1 CRC校驗(yàn)原理
對(duì)于待發(fā)送的k比特?cái)?shù)據(jù)D={d0,d1,…,dk-1},采用系數(shù)為0或1的多項(xiàng)式D(χ)=d0·χk-1+d1·χk-2+…+dk-1·χ0表示,發(fā)送方要把數(shù)據(jù)D發(fā)送給接收方前,通信雙方約定一個(gè)r+1位二進(jìn)制序列,采用多項(xiàng)式表示為G(χ),發(fā)送方將數(shù)據(jù)D擴(kuò)展r位后得到多項(xiàng)式D′(χ),使D′(χ)與G(χ)做模2除法運(yùn)算,得到余數(shù)多項(xiàng)式R(χ),構(gòu)成r位的監(jiān)督碼,附在k比特?cái)?shù)據(jù)之后,構(gòu)成k+r位新數(shù)據(jù)D″發(fā)送至接收方,接收方接收到數(shù)據(jù)D″后,采用相同的算法,與事先約定好的多項(xiàng)式G(χ)做模2除法運(yùn)算,若得到余數(shù)R為非0數(shù)據(jù),則接收方知道發(fā)生了錯(cuò)誤,否則數(shù)據(jù)認(rèn)為正確而被接收。CRC編碼的檢錯(cuò)能力與生成多項(xiàng)式G(χ)密切相關(guān),有效的G(χ)可使CRC編碼的漏檢率非常低[6],本文設(shè)計(jì)中選用CRC-32實(shí)現(xiàn)數(shù)據(jù)的差錯(cuò)編碼。
3.4.2 基于單字節(jié)的CRC-32查找表實(shí)現(xiàn)
根據(jù)CRC校驗(yàn)原理,模2除法運(yùn)算的實(shí)質(zhì)是反復(fù)移入低位,消除高位。逐位運(yùn)算效率太低,不適合大量數(shù)據(jù)計(jì)算,而查找表法,通過(guò)索引查找表,一次可處理多位數(shù)據(jù),效率高,有利于大量數(shù)據(jù)計(jì)算[7]。本設(shè)計(jì)中,采用的8 bit查找表實(shí)現(xiàn)CRC校驗(yàn),每次處理1 byte數(shù)據(jù),根據(jù)異或運(yùn)算的交換律,(A XOR B)XOR C=A XOR(B XOR C),數(shù)據(jù)可以先與剛從寄存器移除的字節(jié)相異或,通過(guò)8 bit的反復(fù)移位和CRC除法,得到CRC余式表索引值,根據(jù)索引值進(jìn)行查表,再用表值異或寄存器,得到的即為CRC校驗(yàn)碼[8],1 024 byte校驗(yàn)具體過(guò)程如下:
(1)復(fù)位CRC校驗(yàn)?zāi)K,將32位校驗(yàn)碼寄存器初值設(shè)置為0;
(2)將待校驗(yàn)數(shù)據(jù)8位數(shù)據(jù)與CRC寄存器高8位異或,得到查找表索引值,并將查表所得值與CRC當(dāng)前寄存器值相異或,循環(huán)計(jì)算1 024次,最終產(chǎn)生4byte的CRC校驗(yàn)碼;
(3)將校驗(yàn)完成標(biāo)志置1,表示校驗(yàn)完成。
LVDS發(fā)送端計(jì)算1 024 byte數(shù)據(jù)校驗(yàn)碼,并將最終校驗(yàn)碼附于數(shù)據(jù)包之后傳輸,接收端接收1028 byte數(shù)據(jù),做相同運(yùn)算,產(chǎn)生4 byte CRC校驗(yàn)碼,判斷結(jié)果是否為0,若為0,則數(shù)據(jù)無(wú)誤碼,若不為0,則存在誤碼,需重新傳輸,Verilog實(shí)現(xiàn)關(guān)鍵代碼如下:
采用4段10 m的屏蔽雙絞線(xiàn),串接成一條40 m傳輸線(xiàn),連接彈上采編器及地面測(cè)試臺(tái)LVDS接口,通過(guò)上位機(jī)軟件,向彈上采編器發(fā)送讀數(shù)指令,回收彈上數(shù)據(jù)。更改程序,調(diào)整LVDS數(shù)據(jù)速率為100 Mbit/s 、200 Mbit/s、300 Mbit/s、400 Mbit/s、500 Mbit/s,分別對(duì)其加入反饋糾錯(cuò)機(jī)制前后實(shí)際傳輸速率及誤碼率進(jìn)行測(cè)試,測(cè)試結(jié)果如表1所示。
表1 測(cè)試結(jié)果表
從測(cè)試結(jié)果可得出結(jié)論:傳輸速率100 Mbit/s以下,硬件電路能保證數(shù)據(jù)傳輸?shù)目煽啃?;傳輸速率大?00 Mbit/s時(shí),誤碼率隨傳輸速率的增大而增加,在邏輯設(shè)計(jì)上,加入CRC校驗(yàn)算法,能有效保證數(shù)據(jù)傳輸可靠性的,但會(huì)導(dǎo)致實(shí)際傳輸速率下降;當(dāng)傳輸速率大于500 Mbit/s時(shí),由于錯(cuò)誤重傳計(jì)數(shù)器的制約,數(shù)據(jù)無(wú)法可靠傳輸,同時(shí)實(shí)際傳輸速率下降。
文中針對(duì)LVDS高速長(zhǎng)線(xiàn)傳輸存在數(shù)據(jù)傳輸可靠性降低的問(wèn)題,從硬件電路設(shè)計(jì)上,對(duì)LVDS信號(hào)做預(yù)處理和補(bǔ)償,同時(shí)在邏輯設(shè)計(jì)上引入反饋糾錯(cuò)機(jī)制,采用CRC算法,在很大程度上保證了數(shù)據(jù)傳輸?shù)目煽啃?,?jīng)過(guò)試驗(yàn)驗(yàn)證,數(shù)據(jù)以400 Mbit/s速率,在大于40 m的傳輸線(xiàn)上,實(shí)現(xiàn)零誤碼可靠傳輸。
[1]易敏,蘇淑靖.基于LVDS的高可靠性數(shù)據(jù)傳輸設(shè)計(jì)[J].微電子學(xué)與計(jì)算機(jī),2014,31(9):131-134.
[2]郭寶鋒,韓壯志,何強(qiáng).基于FPGA的高速數(shù)據(jù)長(zhǎng)線(xiàn)傳輸系統(tǒng)的設(shè)計(jì)[J].測(cè)控技術(shù),2012,31(5):85-88.
[3]薛源,劉衛(wèi)東.一種多通道實(shí)時(shí)數(shù)據(jù)采集監(jiān)控系統(tǒng)設(shè)計(jì)與實(shí)現(xiàn)[J].計(jì)算機(jī)測(cè)量與控制,2011,19(4):863-865.
[4]薛隆全,文豐,張時(shí)華.基于LVDS總線(xiàn)的高速長(zhǎng)距數(shù)據(jù)傳輸?shù)脑O(shè)計(jì)[J].電子設(shè)計(jì)工程,2009,17(2):39-42.
[5]范丹,何永強(qiáng),方晉賢.高速LVDS接口電路設(shè)計(jì)[J].儀表技術(shù),2010(4):7-12.
[6]張焱,任勇峰,齊蕾.基于FPGA的CRC校驗(yàn)算法的實(shí)現(xiàn)[J].電子器件,2015,38(1):222-226.
[7]畢占坤,張羿猛,黃芝平.基于邏輯設(shè)計(jì)的高速CRC并行算法研究及其FPGA實(shí)現(xiàn)[J].儀器儀表學(xué)報(bào),2007,28(12):2244-2249.
[8]季鵬輝,孟丁,任勇峰.基于FPGA的16 bit CRC校驗(yàn)查表法設(shè)計(jì)[J].電子器件,2013,36(4):580-584.
李輝景(1982-),男,漢族,福建泉州人,硬件工程師,主要從事動(dòng)態(tài)測(cè)試、高速數(shù)據(jù)采集;
王淑琴(1990-),女,山西臨汾人,碩士研究生,主要從事數(shù)據(jù)采集與存儲(chǔ)研究,wangshuqin1117@163.com。