zoukankan      html  css  js  c++  java
  • 一次输出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

  • 相关阅读:
    牛客网暑期ACM多校训练营(第一场)
    ACM-ICPC-Swiss-Subregional 2017 训练日志
    2016 全国多校第二场 训练日志
    2018湖南多校第八场 训练日志
    2017 全国多校第九场 训练日志
    2017 全国多校第十场 训练日志
    2014 Kuala Lumpur 训练日志
    2018湖南多校第五场-20180506 训练日志
    2017icpc 花莲训练日志
    面试总结
  • 原文地址:https://www.cnblogs.com/yanhc/p/2485437.html
Copyright © 2011-2022 走看看