扰码就是作有规律的随机化处理后的信码。
作为现代通信的关键技术之一,扰码是为了提高传输数据的定时恢复能力和保密性而在比特层对需要传输的数据进行随机化处理的技术。
扰码的目的是抑制线路码中的长连“0” 和长连“1” ,便于从线路信号中提取时钟信号。由于线路信号仅通过扰码,所以SDH的线路信号速率与SDH电口标准信号速率相一致,这样就不会增加发端激光器的光功率代价。
另外,扰码还可以将不同的终端或基站区分开来,同时,扰码还有助于提高通信的保密性。加扰不改变信号的带宽,只是将来自不同信源的信号区分开来。这样,即使多个发射机使用相同的码字扩频也不会出现问题。
clc
close all
clear
% 初始化参数
n = 16; % LFSR的长度
poly = [16 5 4 3 0]; % 多项式的指数(1 + x^3 + x^4 + x^5 + x^16)
% 初始化LFSR状态,初始状态为全1
lfsr = ones(1, n);
% 仿真长度
num_bits = 100;
% 存储扰码输出
scrambled_sequence = zeros(1, num_bits);
for i = 1:num_bits
% 输出当前状态的最后一位作为扰码输出
scrambled_sequence(i) = lfsr(end);
% 计算反馈值
feedback = mod(sum(lfsr(poly(2:end))), 2);
% 更新LFSR状态
lfsr = [feedback lfsr(1:end-1)];
end
% 显示结果
disp('扰码输出序列:');
disp(scrambled_sequence);
% 绘制结果
figure;
stem(scrambled_sequence, 'filled');
title('扰码输出序列');
xlabel('比特位置');
ylabel('输出值');
grid on;
verilog代码如下:
//-----------------------------------------------------------------------------
// scrambler module for data[7:0], lfsr[15:0]=1+x^3+x^4+x^5+x^16;
//-----------------------------------------------------------------------------
module scrambler(
input [7:0] data_in,
input scram_en,
input scram_rst,
output reg [7:0] data_out,
input rst,
input clk);
reg [15:0] lfsr_q,lfsr_c;
reg [7:0] data_c;
always @(*) begin
lfsr_c[0] = lfsr_q[8];
lfsr_c[1] = lfsr_q[9];
lfsr_c[2] = lfsr_q[10];
lfsr_c[3] = lfsr_q[8] ^ lfsr_q[11];
lfsr_c[4] = lfsr_q[8] ^ lfsr_q[9] ^ lfsr_q[12];
lfsr_c[5] = lfsr_q[8] ^ lfsr_q[9] ^ lfsr_q[10] ^ lfsr_q[13];
lfsr_c[6] = lfsr_q[9] ^ lfsr_q[10] ^ lfsr_q[11] ^ lfsr_q[14];
lfsr_c[7] = lfsr_q[10] ^ lfsr_q[11] ^ lfsr_q[12] ^ lfsr_q[15];
lfsr_c[8] = lfsr_q[0] ^ lfsr_q[11] ^ lfsr_q[12] ^ lfsr_q[13];
lfsr_c[9] = lfsr_q[1] ^ lfsr_q[12] ^ lfsr_q[13] ^ lfsr_q[14];
lfsr_c[10] = lfsr_q[2] ^ lfsr_q[13] ^ lfsr_q[14] ^ lfsr_q[15];
lfsr_c[11] = lfsr_q[3] ^ lfsr_q[14] ^ lfsr_q[15];
lfsr_c[12] = lfsr_q[4] ^ lfsr_q[15];
lfsr_c[13] = lfsr_q[5];
lfsr_c[14] = lfsr_q[6];
lfsr_c[15] = lfsr_q[7];
data_c[0] = data_in[0] ^ lfsr_q[15];
data_c[1] = data_in[1] ^ lfsr_q[14];
data_c[2] = data_in[2] ^ lfsr_q[13];
data_c[3] = data_in[3] ^ lfsr_q[12];
data_c[4] = data_in[4] ^ lfsr_q[11];
data_c[5] = data_in[5] ^ lfsr_q[10];
data_c[6] = data_in[6] ^ lfsr_q[9];
data_c[7] = data_in[7] ^ lfsr_q[8];
end // always
always @(posedge clk, posedge rst) begin
if(rst) begin
lfsr_q <= {16{1'b1}};
data_out <= {8{1'b0}};
end
else begin
lfsr_q <= scram_rst ? {16{1'b1}} : scram_en ? lfsr_c : lfsr_q;
data_out <= scram_en ? data_c : data_out;
end
end // always
endmodule // scrambler