PN16(本源多项式为:X16+X15+X13+X4+1),每个clk输出16的bit随机伪随机码,数据加扰通用

已经结合单bit输出验证:

源码:

module LFSR_PN15 (
    input clk,
    input reset,
    output reg [15:0] LFSR,
    output reg [15:0] PN_out,
    output reg [31:0] PN_OUT_COUNTER
);

always @(posedge clk) begin
    if (reset)begin
        LFSR <= 16'b0000_0000_0001_1111;  // 同步复位
        PN_OUT_COUNTER<=0;
    end else begin
        LFSR[15] <=  LFSR[3] ^ LFSR[12]^LFSR[14] ^ LFSR[15]; 
        LFSR[14] <=  LFSR[2] ^ LFSR[11]^LFSR[13] ^ LFSR[14];  
        LFSR[13] <=  LFSR[1] ^ LFSR[10]^LFSR[12] ^ LFSR[13];
        LFSR[12] <=  LFSR[0] ^ LFSR[9]^LFSR[11] ^ LFSR[12];//前4个没有变化
        LFSR[11] <=  (LFSR[3] ^ LFSR[12]^LFSR[14] ^ LFSR[15]) 
                    ^ LFSR[8]^LFSR[10] ^ LFSR[11];
        LFSR[10] <=  (LFSR[2] ^ LFSR[11]^LFSR[13] ^ LFSR[14]) 
                    ^ LFSR[7]^LFSR[9] ^ LFSR[10];
        LFSR[9]  <=  (LFSR[1] ^ LFSR[10]^LFSR[12] ^ LFSR[13])
                    ^ LFSR[6]^LFSR[8] ^ LFSR[9];
        LFSR[8]  <=   (LFSR[0] ^ LFSR[9]^LFSR[11] ^ LFSR[12]) 
                    ^ LFSR[5]^LFSR[7] ^ LFSR[8];
        LFSR[7]  <=   (LFSR[3] ^ LFSR[12]^LFSR[14] ^ LFSR[15] ^ LFSR[8]^LFSR[10] ^ LFSR[11] )
                    ^ LFSR[4]^LFSR[6] ^ LFSR[7];
        LFSR[6]  <=   (LFSR[2] ^ LFSR[11]^LFSR[13] ^ LFSR[14] ^ LFSR[7]^LFSR[9] ^ LFSR[10]) 
                    ^ LFSR[3]^LFSR[5] ^ LFSR[6];
        LFSR[5]  <=   (LFSR[1] ^ LFSR[10]^LFSR[12] ^ LFSR[13] ^ LFSR[6]^LFSR[8] ^ LFSR[9] )
                    ^ LFSR[2]^LFSR[4] ^ LFSR[5];
        LFSR[4]  <=   (LFSR[0] ^ LFSR[9]^LFSR[11] ^ LFSR[12] ^ LFSR[5]^LFSR[7] ^ LFSR[8] )
                    ^ LFSR[1]^LFSR[3] ^ LFSR[4];
        LFSR[3]  <=  ( LFSR[3] ^ LFSR[12]^LFSR[14] ^ LFSR[15] ^ LFSR[8]^LFSR[10] ^ LFSR[11] ^ LFSR[4]^LFSR[6] ^ LFSR[7])
                    ^ LFSR[0]^LFSR[2] ^ LFSR[3];//前13个
        LFSR[2]  <=   (LFSR[2] ^ LFSR[11]^LFSR[13] ^ LFSR[14] ^ LFSR[7]^LFSR[9] ^ LFSR[10] ^ LFSR[3]^LFSR[5] ^ LFSR[6] )
                    ^ (LFSR[3] ^ LFSR[12]^LFSR[14] ^ LFSR[15])^LFSR[1] ^ LFSR[2];
        LFSR[1]  <=   (LFSR[1] ^ LFSR[10]^LFSR[12] ^ LFSR[13] ^ LFSR[6]^LFSR[8] ^ LFSR[9] ^ LFSR[2]^LFSR[4] ^ LFSR[5]) 
                    ^ (LFSR[2] ^ LFSR[11]^LFSR[13] ^ LFSR[14])
                    ^LFSR[0] ^ LFSR[1];
        LFSR[0]  <=  (LFSR[3] ^ LFSR[12]^LFSR[14] ^ LFSR[15] ^ LFSR[8]^LFSR[10] ^ LFSR[11] ^ LFSR[4]^LFSR[6] ^ LFSR[7] ^ LFSR[0]^LFSR[2] ^ LFSR[3]) 
                   ^ (LFSR[0] ^ LFSR[9]^LFSR[11] ^ LFSR[12] )
                   ^ (LFSR[2] ^ LFSR[11]^LFSR[13] ^ LFSR[14])
                   ^ (LFSR[3] ^ LFSR[12]^LFSR[14] ^ LFSR[15])
                   ^  LFSR[0];  // 最高位反馈移位
        PN_OUT_COUNTER<=PN_OUT_COUNTER+1;
    end
        PN_out <= LFSR;
end

endmodule
仿真testbench:

`timescale 1ns / 1ps

module LFSR_PN15_tb;

// Inputs
reg clk;
reg reset;

// Outputs
wire [15:0] LFSR;
wire [15:0] PN_out;
wire [31:0] PN_OUT_COUNTER;

// Instantiate the Unit Under Test (UUT)
LFSR_PN15 uut (
    .clk(clk),
    .reset(reset),
    .LFSR(LFSR),
    .PN_out(PN_out),
    .PN_OUT_COUNTER(PN_OUT_COUNTER)
);

// Clock generation: 10ns period (100 MHz)
always #5 clk = ~clk;

initial begin
    // Initialize Inputs
    clk = 0;
    reset = 1;
    
    // Wait 50 ns for global reset to finish
    #50 reset = 0;

    // Wait for a few cycles to observe the output
    #500;

    // Apply reset again after some time
    reset = 1;
    #50 reset = 0;
    
    // Wait to observe more outputs
    #500;

    // End simulation
    $stop;
end

endmodule

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值