王善斌,孟慶志
(山東理工大學計算機科學與技術學院,山東淄博 255200)
在實際的數字基帶通信系統中,為了減少碼間串擾和噪聲干擾使信息能夠在基帶中順利傳輸,一般將不歸零碼(NRZ)信號編碼成適合基帶傳輸的碼元信號。由于噪聲干擾和其他原因,如取果在接收的數字序列中出現較長的連零,便可能導致定時信息的消失,使正常的數據接收失效,這是數字通信系統不能容忍的。在傳輸碼的選擇中,常常需要設計出滿足信道各種特性的碼型,其中,HDB3編碼因為其優點較多且改進了AMI編碼關于“連零”問題而成為常見的碼型之一。HDB3的編碼規則變化在當檢測到4個連零時,會加入破壞字節。但編碼后連零數只有3個,導致編碼效率和傳輸效率過低。本文基于此,旨在通過FPGA設計出一種HDB4的編碼,增加了對零的“容忍度”,增加了編碼和傳輸的效率。HDB4具有如下特點:①不含直流,且低頻分量少;②具有豐富的定時信息,利于提取定時信號;③功率譜主瓣寬度變小,提高了頻帶利用率;④具有檢錯能力;⑤編譯碼簡單,傳輸時延小等。
HDB4 的基本原理同HDB3 基本一樣,數據“1”正負交替,當檢測到連零狀態后,插入破壞節,其整體數據“V”碼單獨交替,“1”碼和“B”碼交替。HDB4 碼的編碼規則為:①取代。當信息遇到5 個連“0”二進制信息碼用取代節“0000V”或“B000V”代替。取代的原則:簡記為“V 奇數V”,即2 個“V”碼之間“1”碼的個數為奇數。②加符號。“V”碼與前一非零碼相同,其他相反。③畫波形。HDB4 碼波形的占空比為0.5。
HDB4 的編碼主要分為三大模塊,插入“V”碼模塊,負責“V”碼的插入,并將信號進行“拓展”,1 位數據變為2 位數據;插入“B”碼模塊,對數據“1”進行計數,通過奇偶來判斷是否需要插入“B”碼,并在合適的時候插入;極性變換模塊,將傳輸過來的信號進行類AMI編碼。HDB4 設計的總體框架如圖1 所示。

圖1 HDB4 框架
插入“V”碼是數據傳輸的第一步過程。其基本設計流程如圖2 所示。

圖2 插入“V”碼流程
輸入數字信號后,根據輸入的數據分別執行不同的程序。當輸入為“1”時,令輸出為“01”,并將檢測連零數的計數器歸零。如果輸入為“0”時,則同時執行計數器加1 操作和計數器的判斷操作,當檢測到計數器計數為4 時,此時已經輸入為第五個零,將第五個數據輸入為零的輸出設為11,并將計數器清零,其他情況則輸出00。
經過此模塊的數據比原數據均多一位,數字信息0 對應著00 和代表“V”碼的11,數字信息1 對應著01。
插入“B”碼是數據傳輸的第二步過程。其基本設計流程如圖3 所示。

圖3 插入“B”碼流程
這里采用5 位移位寄存器是根據HDB3 碼編碼規則的特點決定的,經插“V”后,連零串中的第5 個“0”變成“V”碼,代碼中的連零個數最多是4 個,而插入“B”碼的操作是把在由“0”碼變成“V”碼之前的第一個非零碼之后的“0”變換成“B”碼,由此可見,得整個過程中信息數一定不超過5 個“0”,因此只需要5 個一位寄存器就可以通過輸入狀態來決定是否應插入“B”碼。將信息代碼中輸出的信號一位一位地放進自己定義好的移位寄存器中,接下來進行判斷:如果輸入的是“00”,則自己設的判偶寄存器count 保持不變,5 個移位寄存器正常往后存信號;如果輸入的是“01”,則判偶寄存器count 加1,5 個移位寄存器正常往后存信號;如果輸入的是“11”,判斷是否為第一個“11”輸入,如果是,則將標志寄存器firstv 置為1,5 個移位寄存器正常往后存信號,如果不是,則判斷判偶寄存器count 是否為偶數,如果不是,則將判偶寄存器count 置0,5 個移位寄存器正常往后存信號,否則,將這5 位移位寄存器的最低位寄存器賦值為“10”(這里面的“00”代表0,“01”代表“1”,“11”代表“V”)。
將信號雙極性變換是數據傳輸的第三步過程。其基本設計流程如圖4 所示。

圖4 雙極性變換流程
將插“B”碼后的信號一位一位輸入進去,判斷是否為“01”或“10”碼,如果是則判斷標志位flag1b 是否為1,如果是,則輸出“01”并且將flag_b 置0,若不是,則輸出“10”,并將flag_b 置1;如果判斷不是“01”或“10”碼,則判斷輸入是否為“11”,如果不是則輸出“00”,保持標志位flag 不變,如果是,則判斷flag_v 是否為1,不是則輸出“01”,是則輸出“10”(此輸出中的“10”代表正電平,“01”代表負電平,“00”代表零電平)。
HDB4 的譯碼原理主要為發現取代節然后把取代節替換為5 個連零。其具體實現如下:在接收端收到的數據經過移位寄存器分別與寄存器A(存儲“10000V”)和寄存器B(存儲“B000V”)相異或,結果為零把“10000V”改成“100000”、把“B000V”改成“00000”輸出。異或結果不為零正常輸出。其譯碼原理方框圖如圖5 所示。在FPGA 收到已經譯好的HDB3 碼(雙相碼)后,根據是否為“XX 00 00 00 00 XX”或“ XX 00 00 00 XX ”的碼型來進行扣“V”扣“B”的操作,最后在輸出時將雙相碼轉換為0 和1 碼輸出出去,方框圖如圖5 所示。流程圖如圖6 所示。

圖5 譯碼器設計方框圖

圖6 譯碼器設計流程圖
if((data [9:0]==10'b0100000001)||(data [9:0]==10'b1100000011))
begin
data[1:0]〈=messagein;
//messagein 為輸入雙相碼信息
data[3:2]〈=2'b00;
data[5:4]〈=data[3:2];
data[7:6]〈=data[5:4];
data[9:8]〈=data[7:6];
data[11:10]〈=2'b00;
end//對B000V 碼型進行扣B 扣V 操作
if((data[11:0]==12'b010000000001)||(data[11:0]==12'b110000000011))
begin
data[1
:0]〈=messagein;
data[3:2]〈=2'b00;
data[5:4]〈=data[3:2];
data[7:6]〈=data[5:4];
data[9:8]〈=data[7:6];
data[11:10]〈=data[9:8];
end//對10000V 碼型進行扣V 操作
case(data[11:10])
2'b00:begin temp〈=1'b0; end
2'b01,2'b11:begin temp〈=1'b1; end
default:begin temp〈=1'bz; end
endcase
//將寄存器高兩位轉換成0 碼或1 碼并輸出
HDB4 編碼原理RTL 框圖如圖7 所示,輸入為一位的消息信號、時鐘信號以及復位信號,經插V 模塊、插B 模塊、雙極性變換模塊以及譯碼模塊這4 個模塊后輸出一位的譯碼信號。

圖7 HDB4 編碼原理RTL 框圖
下面對該HDB4 模塊進行仿真驗證,仿真時鐘設置為32 MHz,先進行復位再開始進行消息的傳輸,傳輸是在時鐘的每個上升沿進行的(也就意味著一個時鐘發送一個消息)。在總模塊開始時,輸入信息為“1000010000110000000011”,圖8 中,第一行為時鐘信號;第二行為復位信號;第三行為消息信號;第四行為插V 后的信號;第五行為插B 后的信號;第六行為雙極性變換后的信號;第七行為譯碼后的信號。

圖8 綜合模塊仿真圖
本文所設計的HDB4 編碼模塊簡單易懂,在數字處理上利用FPGA 相較于單片機具有很高的靈活性,其可以集成到不同的通信系統中,提高系統設計的速度。
在本次設計之中也有一些需要注意的地方,比如寫仿真文件在時鐘信號最開始的時候一定要設置為1,否則將會在復位結束時比正常情況多發一個時鐘的信息導致消息錯亂;在譯碼傳輸數據時如果要對數據進行改動的話要直接對該寄存器的傳輸數據對象的寄存器進行改動,否則時序會錯位,導致譯碼錯誤。