https://blog.csdn.net/iqjnwythCW1/article/details/100980871?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.nonecase&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.nonecase
一般來說,數字通信系統的設計及其性能都與所傳輸的數字信號的統計特性有關。在數字通信設備中,通常從0和1碼的交變點提取位定時信息,若經常出現長0或1遊程,則將影響位同步的建立和保持。如果數字信號具有周期性,則信號頻譜中存在離散譜線。爲了限制這種串擾,常要求數字信號的最小週期足夠長。
如果我們能夠先將信源產生的數字信號變換成具有近似白噪聲統計特性的數字序列,再進行傳輸,這樣就可以給數字通信系統的設計和性能估計帶來很大方便。
所謂加擾技術,就是不用增加多餘度而擾亂信號,改變數字信號統計特性,使其近似於白噪聲統計特性的一種技術。這種技術的基礎是建立在反饋移存器序列(僞隨機序列)的理論基礎之上。
加擾器的原理方框圖如下圖所示,加擾器的參數主要有生成多項式和移位寄存器初始狀態(詳見《通信原理(第七版)》-樊昌信)
加擾器與解擾器的Matlab實現
N=100;
x = randi(2,1,N)-1; %原始數據
scrambler = [1,0,1,1,1,0,1]; %加擾器移位寄存器初始狀態
descrambler = scrambler; %解擾器移位寄存器初始狀態
y_scrambler = zeros(1,N);
subplot(3,1,1)
stairs(x)
axis([0 N -0.2 1.2])
title('原始數據');
%--------------加擾器-----------------%
for i = 1 :N
z = bitxor(scrambler(1),scrambler(4)); %異或
y_scrambler(i) = bitxor(z,x(i));
scrambler=[scrambler(2:7), y_scrambler(i)];
end
subplot(3,1,2)
stairs(y_scrambler)
axis([0 N -0.2 1.2])
title('加擾後的數據');
% ------------ 解擾器 ------------ %
y_descrambler = zeros(1,N);
for i = 1 : N
z = bitxor(descrambler(1),descrambler(4)); %異或
y_descrambler(i) = bitxor(z,y_scrambler(i));
descrambler=[descrambler(2:7), y_scrambler(i)];
end
subplot(3,1,3)
stairs(y_descrambler)
axis([0 N -0.2 1.2])
title('解擾後的數據');
從上圖可以看出,解擾後的數據與原始數據相同,證明了程序的正確性。
加擾器與解擾器的FPGA實現
- 加擾器的實現
module scrambler(
input clk,
input din, //輸入數據
input rst, //復位信號
input scram_valid, //加擾器使能信號
output reg scram_dout, //加擾器輸出
output reg scram_rdy //加擾器輸出有效信號
);
parameter scram_seed = 8'b10111010; //寄存器初值
reg[7:1] scrambler=7'b0;
wire temp;
assign temp = dinscrambler[7]scrambler[4]; //生成多項式S(X)=x7+x4+1
always @ (posedge clk )
begin
if (!rst)
begin
scram_rdy <= 0;
scrambler <= scram_seed;
scram_dout <= 0;
end
else
begin
if (scram_valid)
begin
scrambler <= {scrambler[6:1],temp};
scram_rdy <= 1;
scram_dout <= temp;
end
else
begin
scram_rdy <= 0;
scrambler <= scram_seed;
scram_dout <= 0;
end
end
end
endmodule
- 解擾器的實現
module descrambler(
input clk,
input din,
input rst,
input descram_valid, //解擾器使能信號
output reg descram_dout, //解擾器輸出
output reg descram_rdy //解擾器輸出有效信號
);
parameter descram_seed = 7'b1011101; //寄存器初值
reg[7:1] descrambler;
wire temp;
assign temp = dindescrambler[7]descrambler[4]; //生成多項式S(X)=x7+x4+1
always @ (posedge clk )
begin
if (!rst)
begin
descram_rdy <= 0;
descrambler <= descram_seed;
descram_dout <= 0;
end
else
begin
if (descram_valid)
begin
descrambler <= {descrambler[6:1],din};
descram_rdy <= 1;
descram_dout <= temp;
end
else
begin
descram_rdy <= 0;
descrambler <= descram_seed;
descram_dout <= 0;
end
end
end
endmodule
- Testbench文件
module scrambler_tb;
reg clk=0;
reg reset=1;
reg scram_valid=0;
wire scram_dout;
wire scram_rdy;
`define number 2048
///////////////clk//////////////////
always #10 clk = ~clk; // 50MHz 20ns
///////////////reset//////////////////
initial
begin
#20 reset=0;
#40 reset=1;
end
reg din;
reg [14:0] cnt=0;
always@(posedge clk)
begin
if (!reset)
begin
scram_valid <= 0;
din <= 0;
end
else
begin
if (cnt <= 15’d10000) //使能信號的週期爲10001個時鐘週期,有效時長爲2048個時鐘週期
begin
scram_valid <= 1;
cnt <= cnt + 1’b1;
din <= {$random} % 2; //輸入數據爲0或1
if (cnt >= `number-1)
begin
scram_valid <= 0;
din <= 0;
end
end
else
begin
scram_valid <= 0;
cnt <= 0;
din <= 0;
end
end
end
scrambler uut(
.clk(clk),
.din(din),
.rst(reset),
.scram_valid(scram_valid),
.scram_dout(scram_dout),
.scram_rdy(scram_rdy)
);
wire descram_dout;
wire descram_rdy;
descrambler uut2(
.clk(clk),
.din(scram_dout),
.rst(reset),
.descram_valid(scram_rdy),
.descram_dout(descram_dout),
.descram_rdy(descram_rdy)
);
endmodule
仿真時將加擾器與解擾器進行了級聯,仿真結果如下圖所示,從圖中可以看出,解擾器輸出結果(descram_dout)與原始數據(din)相同,僅延遲兩個時鐘週期,從結果可以看出程序實現了數據的加擾及解擾,結果正確。