FPGA數字訊號處理(26)加擾器與解擾器設計
加擾與解擾
設計數字通訊系統時,必須考慮傳送資訊的訊號特徵,這些特徵會影響到設計效能。總的來說,傳送的資訊應注意:(1).避免出現長串的0或1,否則對於從0、1交換點處提取位同步資訊的系統,容易錯判導致失去同步;(2).避免傳輸訊號具有周期性,否則在多路傳輸的通訊系統中容易造成串擾。
通道編碼中的加擾器和解擾器便是完成上述功能,將傳送訊號處理成沒有長傳的0或1,並且數字訊號最小週期足夠長。對訊號加擾處理可以使其統計特性接近於高斯白噪聲的統計特性,在接收端需要用逆運算解擾恢復出原始傳送序列。
加擾器可以採用一個帶反饋的移位暫存器生成偽隨機序列,對資料進行加擾。需要選擇的引數有生成多項式和移位暫存器初始狀態
加擾器由移位暫存器和異或門(有些文獻中稱為模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設計
模擬結果如下圖所示,看到原始資料和解擾輸出完全一致,只是之間有些延遲: