• 首页 首页 icon
  • 工具库 工具库 icon
    • IP查询 IP查询 icon
  • 内容库 内容库 icon
    • 快讯库 快讯库 icon
    • 精品库 精品库 icon
    • 问答库 问答库 icon
  • 更多 更多 icon
    • 服务条款 服务条款 icon

扰码器原理和verilog实现

武飞扬头像
不吃葱的酸菜鱼
帮助1

什么是扰码

        扰码就是对原始的用户数据进行扰乱,得到随机化的用户数据。连续扰码两次就能得到原始数据,通常是发送电路在发送数据时先对数据进行随机扰乱,接收电路使用相同的扰乱算法就可以重新恢复出原始的数据。如图所示:

学新通

扰码器的优点和作用

        扰码器产生伪随机的比特序列,它和输入的数据进行异或(相加模二),从而实现对输入串行数据的随机化,伪随机序列也是周期重复的,周期长度取决于反馈多项式中触发器的级数和所选择的多项式。接收电路本地有一个和发送电路相同的伪随机序列产生器,它产生的数据和接收数据进行异或,可以恢复出发送端原始的串行数据。

        反馈多项式通常是f(x) = x^n x^(n-1) ... x^2 x 1结构,多项式含有x的几次方,在扰码器中就需要对第几个寄存器进行抽头然后异或(即相加模二)。

扰码器举例

        通常情况下,扰码器都是串行扰码,即下面举出的例子,每周期进行单bit的扰码和更新。如果输入是串行的数据,那么则可以在扰码器之前加一个串并转换模块,如下图所示。

学新通

        下面以乐鑫科技领跑者实习笔试题为例写一个扰码器,题目描述:用verilog写一段代码,实现如下的扰码功能,其中扰码生成器的初始种子X7~X1=7'b1010101,每拍输入,输出和扰码器更新一次。初始种子就是扰码器在一开始,从X7~X1寄存器锁存的数据初值。

学新通

        输入的数据data_in是串行的单bit数据,每次输入都会被从扰码器第4个位置和第7个位置的数据异或,从数据的箭头我们可以看出,每次单bit输入的data_in都要进行如下计算:

data_in_new = data_in ^ (x4 ^ x7)

        又因为移位寄存器每周期输入的数据是需要左移1bit的,所以我们可以将组成扰码器的移位寄存器结构,用“位拼接”的方式更新,代码如下:scramble_reg是一个7bit的寄存器

                scramble_reg <= {scramble_reg[5:0],scramble_reg[3]^scramble_reg[6]};

        低位的组成可以看图上的箭头知道,x1是由x4和x7相加得到的,相加对2取模,可以用异或操作实现。

代码

  1.  
    module scramble(
  2.  
    input clk ,
  3.  
    input rstn ,
  4.  
    input data_in , //输入单bit数据
  5.  
    input data_in_en , //输入数据有效位
  6.  
    input [6:0] ini_seed , //7bit 初始种子
  7.  
    input seed_en , //种子有效使能信号
  8.  
     
  9.  
    output reg data_out //输出单bit数据
  10.  
    );
  11.  
     
  12.  
    reg [6:0] scramble_reg; //扰码器为7bit的移位寄存器结构
  13.  
    always @(posedge clk)begin
  14.  
    if(!rstn)begin
  15.  
    scramble_reg <= 7'd0;
  16.  
    end
  17.  
    else if(seed_en)begin
  18.  
    scramble_reg <= ini_seed; //种子有效,读入初始种子
  19.  
    end
  20.  
    else if(data_in_en)begin //输入数据有效时,扰码器每周期更新
  21.  
    scramble_reg <= {scramble_reg[5:0],scramble_reg[3]^scramble_reg[6]};
  22.  
    end
  23.  
    end
  24.  
     
  25.  
    always @(posedge clk)begin
  26.  
    if(!rstn)begin
  27.  
    data_out <= 1'd0;
  28.  
    end
  29.  
    else if(data_in_en)begin //输出数据是多项式抽头的值和data_in的异或
  30.  
    data_out <= (scramble_reg[3] ^ scramble_reg[6]) ^ data_in;
  31.  
    end
  32.  
    end
  33.  
     
  34.  
    endmodule

testbench

  1.  
    module tb();
  2.  
     
  3.  
    reg clk,rstn;
  4.  
    reg data_in,data_in_en,seed_en;
  5.  
    reg [6:0] ini_seed;
  6.  
     
  7.  
    wire data_out;
  8.  
     
  9.  
    initial begin
  10.  
    forever #5 clk = ~clk;
  11.  
    end
  12.  
     
  13.  
    initial begin
  14.  
    rstn <= #1 1'b0;
  15.  
    clk <= #1 1'b0;
  16.  
    data_in <= #1 1'b0;
  17.  
    data_in_en <= #1 1'b0;
  18.  
    #15
  19.  
    rstn <= #1 1'b1;
  20.  
    data_in_en <= #1 1'b1;
  21.  
    repeat(10) #10 data_in <= $random%2;
  22.  
    #50 $finish();
  23.  
    end
  24.  
     
  25.  
    initial begin //initial seed
  26.  
    #15
  27.  
    seed_en <= #1 1'b1;
  28.  
    ini_seed <= #1 7'b1010101;
  29.  
    end
  30.  
     
  31.  
    scramble u_scramble(
  32.  
    .clk (clk ),
  33.  
    .rstn (rstn ),
  34.  
    .data_in (data_in ),
  35.  
    .data_in_en (data_in_en ),
  36.  
    .ini_seed (ini_seed ),
  37.  
    .seed_en (seed_en ),
  38.  
     
  39.  
    .data_out (data_out )
  40.  
    );
  41.  
     
  42.  
    initial begin
  43.  
    $fsdbDumpfile("scramble.fsdb");
  44.  
    $fsdbDumpvars(0);
  45.  
    end
  46.  
     
  47.  
    endmodule

这篇好文章是转载于:学新通技术网

  • 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
  • 本站站名: 学新通技术网
  • 本文地址: /boutique/detail/tanhgfakkg
系列文章
更多 icon
同类精品
更多 icon
继续加载