佘新平,許鵬甲,梁 浩 (長江大學電子信息學院,湖北 荊州 434023)
基于FPGA的HDB3譯碼器設計與仿真
佘新平,許鵬甲,梁 浩 (長江大學電子信息學院,湖北 荊州 434023)
HDB3碼(三階高密度雙極性碼)是基帶傳輸碼型之一,其具有編碼規(guī)則簡單、無直流分量、低頻分量少、連0數(shù)不超過3個、提取同步方便等優(yōu)點,有利于信號的恢復和檢驗。在石油井下信號的傳輸過程中,使用基于FPGA的HDB3編譯碼方式有利于改善傳統(tǒng)方法所采用的曼徹斯特編碼方式帶來的地面解碼電路復雜的問題。提出了HDB3碼的譯碼思想,并利用FPGA軟件仿真實現(xiàn)了HDB3譯碼。
三階高密度雙極性碼;編碼;譯碼; FPGA
隨著科學技術的不斷發(fā)展,數(shù)字通信在日常生活中到處可見,在數(shù)字通信中編譯碼器的應用更是廣泛。譯碼器是可以將輸入二進制代碼的狀態(tài)翻譯成輸出信號,以表示其原來含義的電路。大多數(shù)編譯碼器是有損的,目的是為了得到更大的壓縮比和更小的文件大小。而HDB3碼因具有無直流成分,低頻成分和連0個數(shù)最多不超過3個等明顯優(yōu)點,具有時鐘恢復和更好的抗干擾性能,這使它更適合于長距離信道傳輸。傳統(tǒng)的石油井下信號在傳輸過程中通常采用曼徹斯特編碼方式,HDB3碼遠比曼側斯特編碼方式簡單,同時HDB3碼具有較強的檢錯能力,是基帶電信設備之間進行基帶傳輸?shù)闹饕a型之一。
首先定義輸入碼元的長度,在輸入的源碼中,當碼元位置為1時,如果上一個非0符號為正,則下一個非0符號為負,HDB3碼輸出為“-1”,反之下一個非0符號為正,HDB3碼輸出為“+1”,與此同時,計零標志位清零,數(shù)1標志位將數(shù)1的個數(shù)累加。HDB3譯碼算法的編程思想同編碼思想一樣,也需要對輸入的HDB3碼定義輸入碼元長度。在進行譯碼時,如果HDB3碼的當前位置碼元與上一個非0符號相同,則將當前代碼的位置及其前面的非0符號位一并清0;否則,源碼照常輸出,如果源碼位置為“-1”,全部變?yōu)椤?1”輸出。
表1 HDB3譯碼舉例
HDB3碼的譯碼是編碼的逆過程,其譯碼相對于編碼較簡單。根據(jù)HDB3碼的編碼規(guī)則,第一個V符號不可能出現(xiàn)在前3個位置,即每一個破壞符號V總是與前一非0符號同極性[1],這就保證了后面的代碼位置減3有意義而且不會溢出。因此,從收到的HDB3碼序列中,容易識別V符號,同時也肯定V符號及其前面的3個符號必是連0符號,于是可恢復成4個連0碼,然后再將所有的-1變成+1后便得到原消息代碼(見表1)[2]。
3.1設計思路
若要處理HDB3碼,則需要先將其雙極性轉(zhuǎn)換成適合FPGA的單極性。且外接整流電路,將HDB3碼分解為分別代表其正負脈沖的正脈沖序列和負脈沖序列,同時處理2列脈沖,利用其相關性檢測破壞符V是否存在。若檢測出V,則要對其前3個碼進行清零處理,需要把前3個碼存儲起來作延時輸出[3]。
圖1 HDB3譯碼器模型
圖2 V碼、誤碼檢測程序流程圖
經(jīng)過整流電路的處理,把HDB3碼分成2列序列,一列只含有正脈沖編碼,另一列則只含有負脈沖編碼。同時對2條脈沖進行檢測,檢查任一條脈沖序列2個相鄰之間的傳輸時間內(nèi),另一個脈沖序列是否有脈沖存在,如果沒有脈沖存在,則說明被檢查的序列存在破壞符V,且為2個相鄰脈沖的后一個脈沖。通過V的檢測后可以把2序列相加在一起,以單極性輸出。若判斷出V的存在,就把V和前3個碼都清零。在沒有誤碼情況下,B只會以B00V的形式出現(xiàn),因此出現(xiàn)V時,不管是否有B,只需要將前面3位清零即可實現(xiàn)譯碼操作。
3.2設計建模
HDB3譯碼器模型如圖1所示。相加器就是一個或操作,V碼檢測模塊若檢出V碼便會向后面的扣V扣B模塊的寄存器輸出一個清零信號,最后輸出NRZ碼。把相加器與V碼檢測合成一個模塊,加入n連0的檢測。由編譯碼規(guī)則可知,HDB3碼不可能有4連0出現(xiàn)。若檢測出4連0嗎,即為誤碼,還有2個相鄰同極性脈沖之間的連0數(shù)必定是2或3[4],否則必有誤碼。
圖3 扣V碼/扣B碼的流程
1) V碼、誤碼檢測 把經(jīng)過雙/單極性轉(zhuǎn)換的2列脈沖信號以一個2位邏輯向量codein標識,即codein=“00”代表無脈沖,“01”代表有正脈沖輸入,“10”代表有負脈沖輸入。用flagzf標識前一個脈沖的正負極性,flag=0為正,flag=1為負,以判斷相鄰2脈沖的極性是否相同來判斷出有沒有破壞符V的存在。n連0的檢測與編碼器相似,若檢出4連0或2相鄰脈沖為同極性但它們之間的連零數(shù)不符合要求(不是2或3),則發(fā)現(xiàn)錯誤提示(coderror=‘1’)。V碼、誤碼檢測程序在接收到第一個脈沖后(zf=1)才開始執(zhí)行,之前的輸出都為0。其程序流程如圖2所示,其中用cnt0記錄連0的情況, 用codein表示待編碼的輸入信號,codeoutv為輸出V碼情況,coderror=‘1’為錯誤提示。
2)扣V碼/扣B碼的實現(xiàn) 這個模塊的工作比較簡單,把V碼、誤碼檢測模塊的輸出codeout的低位加到4位移位寄存器作延時輸出,對輸入進行分析,若是‘10’,即有破壞符V,把寄存器最后一位清零輸出,反之,則按原樣輸出。程序流程如圖3所示。
運用QuartusⅡ?qū)帉懞玫腣HDL程序進行仿真,仿真結果如圖4所示。
參考編碼器的輸出結果,編碼器的“-1”由11表示,而譯碼器的“-1”由10表示,用10替換11,把編碼器的輸出結果作為譯碼器的輸入。分析仿真結果,輸出相對輸入有4個半周期的延時,這同樣是由于HDB3碼的編譯碼規(guī)則所致。不包括延時,其輸出為10110000000110000001,結果與編碼器的輸入一致,說明譯碼器的譯碼功能正確。分別對譯碼器的檢錯能力做測試,結果如圖5~7所示。
圖4 HDB3碼譯碼器仿真波形 圖5 HDB3碼譯碼器檢測長連0的仿真
圖6 HDB3碼譯碼器檢測同極性“11”的仿真 圖7 HDB3碼譯碼器檢測同極性“101”的仿真
因為HDB3碼連0數(shù)不可能多于3個,相鄰2脈沖若同極性,其之間的連0數(shù)應為2或3,因此若檢查出碼流中有超出3個連0,同極性“11”或“101”即為誤碼。圖5為長連0檢查,圖6為同極性“11”的檢測,圖7為同極性“101”的檢測。當有誤碼被檢出,coderror為1。由檢錯的仿真結果可知,設計的譯碼器能檢出HDB3的部分誤碼。若有誤碼被檢出,coderror為1,且之后的譯碼結果也不可能正確,所以用戶可以根據(jù)檢錯提示進行相應操作。例如,當譯碼器檢測出誤碼時,請求發(fā)信端把出錯的碼流段重發(fā)。
[1]蔣青,呂翔.一種基于FPGA技術HDB3譯碼器的設計[J].微電子學,2007,37(2):298-300.
[2]敖天勇,侯衛(wèi)周,楊毅,等.基于CPLD的HDB3碼編譯碼器設計[J].山西電子技術,2007(2):5-7.
[3]漢澤西,孫燕妮.基于FPGA的HDB3譯碼器[J].電子科技,2007(3):66-69.
[4]喬繼紅,顧偉娟.基于CPLD的HDB3碼編譯碼器的設計[J].北京工商大學學報(自然科學版),2005,23(1):50-52.
2012-12-24
中國石油科技創(chuàng)新基金項目(2011D-5006-0302)。
佘新平(1964-),男,碩士,副教授,現(xiàn)主要從事天線通信技術方面的教學與研究工作。
TN96
A
1673-1409(2013)07-0037-03
[編輯] 洪云飛