• 一次输出8bit_n4_m序列Simulink仿真Verilog实现


    1. 4m序列生成器

    image

    image

    image

     

    一开始希望通过使用8个PN序列生成器并行实现,但是,每个生成器都不能得到后8个状态的值。

    由于后面的8bit PN序列,通过一个clk不可能通过状态转换实现,所以,只能通过计算得到

    利用Matlab计算得到后8位PN码与初始状态的关系,得到一个输出生成矩阵,使用生成矩阵与初始状态相乘,即可得到8位PN码

    同时,计算得到生成第8位PN码时移位寄存器的状态,得到一个初始值生成矩阵,使用此矩阵与初始状态相乘,即可得到生成第8位PN码时移位寄存器的状态,从而为下一次迭代提供初始状态。

    两个矩阵在PN码生成过程中保持不变,而初始状态得到不断更新,8位PN码不断输出。

    clc; clear;

    n = 4; % 4 order

    bit = zeros(9,n^2);

    bit(1,:) = [1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1];

    initial = [1 0 0 0];

    for i = 2:9

    % generate polynimial, 1 + x + x^4, ==========x + x^4,

    bit(i,:) = [ mod( bit(i-1,1:n)+bit(i-1,3*n+1:4*n), 2), bit(i-1,1:3*n)];

    end

    genmatrix = bit(2:9,3*n+1:4*n) % generate matrix remain the same

    for j = 1:1

    mseq = mod(genmatrix*initial', 2)

    % Update initial

    temp = initial;

    for k = 1:n

    initial(k) = mod( sum(bit(9,(k-1)*n+1:k*n)*temp'), 2);

    end

    end

    输出生成矩阵为:

    genmatrix =

    0 0 1 0

    0 1 0 0

    1 0 0 0

    1 0 0 1

    1 0 1 1

    1 1 1 1

    0 1 1 1

    1 1 1 0

    初始状态值生成矩阵为:

    gm_init =

    1 1 0 1

    1 0 1 0

    0 1 0 1

    1 1 1 0

    Verilog代码:

    `timescale 1ns / 1ps

    //////////////////////////////////////////////////////////////////////////////////

    // Company:

    // Engineer:

    //

    // Create Date: 15:24:21 05/01/2012

    // Design Name:

    // Module Name: PNcode8bit

    //

    //////////////////////////////////////////////////////////////////////////////////

    module PNcode8bit(

    clk,

    rst,

    init,

    PNout

    );

    // PN code n = 4, f(x) = 1 + x + x^4

    // Output 8 bit per clk

    parameter order = 4;

    input clk;

    input rst;

    output [order-1 : 0] init;

    output [7 : 0] PNout;

    // Output use register

    reg [7 : 0] PNout = 0;

    reg [order-1 : 0] init = 0;

    // Generate matrix of output, use memory

    reg [order-1 : 0] gm_out [7 : 0];

    // Generate matrix of initial state, use memory

    reg [order-1 : 0] gm_init [3 : 0];

    integer i, j;

    //////////////////////////////////////////

    // Memory initialization file read here, generate by Matlab

    initial

    begin

    $readmemb("gm_out.txt", gm_out, 7, 0);

    $readmemb("gm_init.txt", gm_init, 3, 0);

    end

    //////////////////////////////////////////

    always @ (posedge clk)

    if(rst == 1)

    begin

    PNout <= 8'b0;

    init <= 4'b1000;

    end

    else

    begin

    for(i=0; i<8; i=i+1)

    PNout[i] <= (gm_out[i][3] & init[3]) ^ (gm_out[i][2] & init[2]) ^ (gm_out[i][1] & init[1]) ^ (gm_out[i][0] & init[0]);

    for(j=0; j<4; j=j+1)

    init[j] <= (gm_init[j][0] & init[0]) ^ (gm_init[j][1] & init[1]) ^ (gm_init[j][2] & init[2]) ^ (gm_init[j][3] & init[3]);

    end

    endmodule

    说明:

    1. 使用readmemb实现存储器数据的初始化,读取二进制内容,因为两个生成矩阵会比较大

    $readmemb("gm_out.txt", gm_out, 7, 0);

    "gm_out.txt"为读取的文件,gm_out为存放的存储器名字,

    7, 0为起始地址和结束地址,最好注明地址范围,不注明好像不太确定

    2. 按位与、按位异或 实现二进制矩阵乘法

    第一个for是输出生成矩阵(8x4)与初始值(4x1)相乘,得到8bit PN码的输出

    第二个for是初始状态值生成矩阵(4x4)与初始值(4x1)相乘,得到新的初始值

    gm_out.txt内容:没有空格

    0010

    0100

    1000

    1001

    1011

    1111

    0111

    1110

    gm_init.txt内容:没有空格

    1101

    1010

    0101

    1110

    测试文件代码:

    `timescale 1ns / 1ps

    ////////////////////////////////////////////////////////////////////////////////

    // Company:

    // Engineer:

    //

    // Create Date: 16:27:38 05/01/2012

    // Design Name: PNcode8bit

    // Module Name: E:/me/CAST/Project/FPGAcomm/PNcode8bit/PNcode8bit_tb.v

    // Project Name: PNcode8bit

    //

    ////////////////////////////////////////////////////////////////////////////////

    module PNcode8bit_tb;

    // Inputs

    reg clk;

    reg rst;

    // Outputs

    wire [3:0] init;

    wire [7:0] PNout;

    // Instantiate the Unit Under Test (UUT)

    PNcode8bit uut (

    .clk(clk),

    .rst(rst),

    .init(init),

    .PNout(PNout)

    );

    initial begin

    // Initialize Inputs

    clk = 0;

    rst = 1;

    // Wait 100 ns for global reset to finish

    #100;

    rst = 0;

    // Add stimulus here

    end

    always begin

    forever #10 clk = !clk;

    end

    endmodule

    ModelSim仿真结果

    clip_image008

    局部放大图,绿色竖线为周期间隔,一个周期的PN码为:001111010110010

    clip_image010

    clip_image012

    clip_image014

  • 相关阅读:
    .emacs
    boost 程序库完全开发指南_ch3_memory_manager
    C++ 友元函数
    AutoHotKey.ini
    QQ因系统日期无法打开
    SharePoint 2007中如何更改用戶基本資料(EMail地址)
    盗版Windows XP如何安装IE7
    三人行,必有我師學會了家中布線ADSL上網
    以數據源方式讀取文本文件連接串及注事事項
    网络访问时you might not have permission to use this network resource错误解决方法
  • 原文地址:https://www.cnblogs.com/yanhc/p/2485437.html
Copyright © 2020-2023  润新知