FPGA數字訊號處理(26)加擾器與解擾器設計

FPGADesigner發表於2018-09-17

加擾與解擾

設計數字通訊系統時,必須考慮傳送資訊的訊號特徵,這些特徵會影響到設計效能。總的來說,傳送的資訊應注意:(1).避免出現長串的0或1,否則對於從0、1交換點處提取位同步資訊的系統,容易錯判導致失去同步;(2).避免傳輸訊號具有周期性,否則在多路傳輸的通訊系統中容易造成串擾。

通道編碼中的加擾器和解擾器便是完成上述功能,將傳送訊號處理成沒有長傳的0或1,並且數字訊號最小週期足夠長。對訊號加擾處理可以使其統計特性接近於高斯白噪聲的統計特性,在接收端需要用逆運算解擾恢復出原始傳送序列。

加擾器可以採用一個帶反饋的移位暫存器生成偽隨機序列,對資料進行加擾。需要選擇的引數有生成多項式和移位暫存器初始狀態(不能是0,否則輸入為0時輸出恆為0)。如一個加擾器結構如下:

這裡寫圖片描述

加擾器由移位暫存器和異或門(有些文獻中稱為模2加法器)組成,選擇的生成多項式決定了每級暫存器是否接到異或門中。上圖中bk=ak^bk-2^bk-3^bk-4^bk-8,解擾時採用逆運算即可,結構如下所示:

這裡寫圖片描述
上圖中ck=bk^bk-2^bk-3^bk-4^bk-8=ak,恢復出原始資料。


MATLAB設計

使用MATLAB模擬加擾和解擾的過程,程式碼很簡單,如下:

x = randi(2,1,1000)-1;   %原始隨機序列

%----------------------------------------%
%%% ------------  加擾器  ------------ %%%
%----------------------------------------%
%scrambler = randi(2,1,8)-1;   %加擾器移位暫存器初始狀態
scrambler = [0,1,1,0,1,1,1,1];
descrambler = scrambler;
y_scrambler = zeros(1,1000);  

for i = 1 : 1000
   z(1) = bitxor(scrambler(1),scrambler(5)); %模2加法器(異或)
   z(2) = bitxor(z(1),scrambler(6));
   z(3) = bitxor(z(2),scrambler(7));
   y_scrambler(i) = bitxor(z(3),x(i)); 

   for j = 1 : 7     %移位寄存
       scrambler(j) = scrambler(j+1);
   end
   scrambler(8) = y_scrambler(i);
end

%----------------------------------------%
%%% ------------  解擾器  ------------ %%%    
%----------------------------------------%
y_descrambler = zeros(1,1000);

for i = 1 : 1000
   z(1) = bitxor(descrambler(1),descrambler(5));  %模2加法器(異或)
   z(2) = bitxor(z(1),descrambler(6));
   z(3) = bitxor(z(2),descrambler(7));
   y_descrambler(i) = bitxor(z(3),y_scrambler(i)); 
   for j = 1 : 7    %移位寄存
       descrambler(j) = descrambler(j+1);
   end
   descrambler(8) = y_scrambler(i);
end

加擾與解擾結果對比如下(無噪聲情況下),可以看到原始資料與解擾後資料完全一致:

這裡寫圖片描述

為了體現加擾器的功能,將原始序列設定為全1。再次執行結果如下,可以看到加擾器將長傳的1轉換為了近似隨機序列:

這裡寫圖片描述


FPGA設計

在Vivado中完成演算法設計及模擬。該設計很簡單,僅僅包含移位暫存器和異或門。異或門在FPGA中會轉換為查詢表實現,因此整體設計可以在很高的時脈頻率下執行。加擾器程式碼如下:

`timescale 1ns / 1ps
//-------------------------------------------------------------------------
//    加擾器設計,written by劉奇,2018.09.15
//-------------------------------------------------------------------------
module Scrambler
(
    input clk,
    input rst_n,
    input din,
    output dout
);

//-------------------------------------------------------------------------
//    移位暫存器部分
//-------------------------------------------------------------------------wire temp;
reg [7:0] scrambler_reg = 8'b11110110;  //初始狀態

always @ (posedge clk or negedge rst_n)
    if (!rst_n) scrambler_reg <= 8'b11110110;
    else scrambler_reg <= {temp,scrambler_reg[7:1]};

//-------------------------------------------------------------------------
//    模2加法器設計
//------------------------------------------------------------------------- 
assign temp = din ^ scrambler_reg[6] ^ scrambler_reg[5] ^ scrambler_reg[4] ^ scrambler_reg[0];
assign dout = temp;

endmodule

解擾器程式碼如下:

`timescale 1ns / 1ps
//-------------------------------------------------------------------------
//    解擾器設計,written by劉奇,2018.09.15
//-------------------------------------------------------------------------
module Descrambler
(
    input clk,
    input rst_n,
    input din,
    input s_tvalid,
    output dout
);

//-------------------------------------------------------------------------
//    移位暫存器部分
//-------------------------------------------------------------------------
reg [7:0] descrambler_reg = 8'b11110110;  //初始狀態

always @ (posedge clk or negedge rst_n)
    if (!rst_n) descrambler_reg <= 8'b11110110;
    else if (s_tvalid) descrambler_reg <= {din,descrambler_reg[7:1]};

//-------------------------------------------------------------------------
//    模2加法器設計
//------------------------------------------------------------------------- 
reg dout_reg;
always @ (posedge clk or negedge rst_n)
    if (!rst_n) dout_reg <= 0;
    else if (s_tvalid) 
        dout_reg <= din ^ descrambler_reg[6] ^ descrambler_reg[5] ^ descrambler_reg[4] ^ descrambler_reg[0];

assign dout = dout_reg;

endmodule

模擬時將加擾器和解擾器級聯在一起,即資料加擾後再進行解擾。原始序列由MATLAB生成並儲存在txt檔案中,在testbench中讀取呼叫。模擬結果如下圖所示,看到原始資料din和解擾輸出descrambler_out完全一致,僅有一個時鐘週期的延遲:

這裡寫圖片描述


System Generator設計

這裡寫圖片描述

模擬結果如下圖所示,看到原始資料和解擾輸出完全一致,只是之間有些延遲:

這裡寫圖片描述

相關文章