通訊原理 FPGA HDB3碼編碼

2021-08-17 11:47:20 字數 4195 閱讀 1224



樊昌信,曹麗娜 . 《通訊原理》(第7版)

(這個ppt給了很多啟發)

hdb3碼(high density bipolar of order 3),三階高密度雙極性碼,它是ami碼的一種改進,目的是克服ami的缺點,使連續「0」的個數不超過3個。其編碼規則如下:

(1) 先檢查連「0」個數,若小於等於3,則與ami碼相同;

(2)當連「0」個數大於3時,將每4個連「0」化作乙個小節,用「000v」代替,其中v取值+1或-1,v的極性與前乙個相鄰的非「0」脈衝極性相同(這破壞了極**替規則,故稱v為破壞脈衝);

(3) 相鄰的v極性必須交替,當v滿足(2)但不滿足(3)時,將「000v」更改為「b00v」,b的極性與後面的v一致,b稱調節脈衝,==>即兩個相鄰v之間的「1」的個數為偶數時v的極性不滿足交替,需要替換為「b00v」;為奇數時v的極效能滿足交替,不需要替換;

(4)v後面的傳號碼極性也要交替。

訊息碼:     1   0   0   1   1   0   0   0   0   1   0   1   1   0   1   0   0   0   0   1   1   1   1   0

ami碼:  +1  0   0  -1 +1  0   0   0   0  -1   0 +1 -1   0 +1   0   0   0   0 -1 +1 -1 +1   0

加v    :   +1  0   0  -1 +1  0   0   0+v-1   0 +1 -1   0 +1   0   0   0+v-1 +1 -1 +1   0

我們可以看到,兩個相鄰v之間的非0個數為偶數,造成兩v的極性相同,不符合(3),所以加b

加b    :   +1  0   0  -1 +1  0   0   0+v-1   0 +1 -1   0 +1-b0   0-v-1 +1 -1 +1   0

若對0、1、b、v用兩位二進位制數表示(00,01,10,11),則在不考慮極性的情況下,加b後應該輸出

01  00  00  01  00  00  001101  00  01  01  00  011000  001101  01  01  01  00

由此,我們使用verilog語言進行編寫hdb3碼的編碼程式。

(1)先不考慮極性(+或-),只考慮輸出是0、1、b還是v,對上述4個數編碼,0--00,1--01,b--10,v--11

(2)加v操作,判斷輸入的字元是「1」還是「0」,1=>01, 0=>00,若為4個連「0」,前三個輸出「00」,第四個輸出「11」

always @ ( posedge clk or negedge rst_n )

begin

if( !rst_n )  begin

count0 <= 0;

endelse  begin

if( codein == 1'b1 )  begin  //輸入1

codeout_v <= 2'b01;

count0 <= 2'b00;    //出現1後就要重新對0計數

endelse  begin       //輸入0

count0 <= count0 + 1'b1; //對0的計數加1

if( count0 == 2'b11 ) begin //0的個數等於3,因為是並行,其實是4個了,只是在下乙個時鐘上公升沿變為4

codeout_v <= 2'b11;  //輸出v

count0 <= 2'b00;   //重新對0計數

endelse  begin 

codeout_v <= 2'b00;

endend

endend

(3)加b操作,判斷兩個相鄰的v之間的非「0」(此時兩v之間非0的應該只有1,即「01」)的個數是否為偶數,若為偶數,從後乙個v往前數,第三個0變為b;若為奇數,正常輸出;

注意:此處如何操作v前面的第三個0很關鍵,按照正常的邏輯似乎不太好把已經輸出的0變為b,所以我們可以將輸出的資料進行一定的延時,這樣要操作的數還在暫存器裡沒有輸出(正要輸出最好),即可進行更改後再輸出,延時的方法可以使用移位暫存器,利用非租塞賦值(<=)的延時,使輸出延時3個週期,操作後正好輸出

always @ ( posedge clk )

begin

buffer[0] <= codein_v; //移位暫存器延時

buffer[1] <= buffer[0];

buffer[2] <= buffer[1];

endalways @ ( posedge clk or negedge rst_n )

begin

if( !rst_n )  begin

count01 <= 0;

first_v <= 0;

endelse  begin

if( codein_v == 2'b11 )  begin  //11-->v

if( first_v == 1'b0 ) begin  //還沒出現過v,就不存在兩個v之間非0數為偶數的情況,不需要對1計數

first_v <= 1;     //已經出現了v

count01 <= 2'b00;    //出現11後就要重新對01計數

codeout_b <= buffer[2];  //延時後的輸出

endelse  begin

if( count01[0] == 0 )  begin //1的個數為偶數

hdb3編碼(2)——極性變換

通訊原理 FPGA HDB3解碼

參考我的上兩篇hdb3編碼,給出hdb3解碼的verilog實現 編碼 編碼 續 解碼規則主要參考下面的資料 解碼主要參考資料 1 若3連 0 前後非零脈衝同極性,則將最後乙個非零元素譯為零,如 1000 1 就應該譯成 10000 若2連 0 前後非零脈衝極性相同,則兩零前後都譯為零,如 100 ...

HDB3碼的編碼

1 原始碼是1時,暫時不變 2 連0不超過3個時不變,有4個或以上連0時把每4個0換為取代節,即b00v 3 確定b是0還是 1 第乙個b一般取0,若兩個取代節之間1的個數為偶,易推得後者的b一定是 1,此時b和1遵循的規則完全相同,可以直接記為1,即100v 為奇則一定是0,記為0,即000v。4...

通訊原理 7 信源編碼和差錯控制編碼

信源編碼的功能 為什麼要數位化?a d轉換 數位化編碼 的技術 波形編碼和參量編碼 一 抽樣定理 抽樣 將取值連續,時間連續的模擬訊號變換為取值連續,時間離散的pam訊號。pam 脈衝序列的幅度隨著m t 變化的一種模擬脈衝調製方式。1.低通抽樣定理 2.帶通抽樣定理 帶通抽樣定理 設帶通型模擬訊號...