verilog实现扰码

扰码就是作有规律的随机化处理后的信码。
作为现代通信的关键技术之一,扰码是为了提高传输数据的定时恢复能力和保密性而在比特层对需要传输的数据进行随机化处理的技术。
扰码的目的是抑制线路码中的长连“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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

MRHLT

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值