Verilog | M序列发生器

一、定义

m序列:最长线性反馈移位寄存器序列的简称。是一种反馈移位型结构的电路,由n个移位寄存器加异或反馈网络组成,反馈多项式为本原多项式,其最大序列长度 M = 2 n − 1 M = 2^n-1 M=2n1。是一种伪随机序列、伪噪声码。

伪随机序列:不能预先确定但可以重复实现的序列。

本原多项式:

若反馈移位寄存器的特征多项式为本原多项式,则移位寄存器能产生m序列。

若一个n次多项式f(x)满足:

1)既约的:不能再因式分解;

2)可整除( x m + 1 x^m + 1 xm+1), M = 2 n − 1 M = 2^n-1 M=2n1

3)除不尽 ( x q + 1 ) (x^q + 1) xq+1, q < m;

则称:f(x)为本原多项式。

序列发生器一般有两种结构形式:一种是反馈移位型,另一种是计数型。计数型序列发生器由计数器和组合输出网络两部分组成,序列码从组合输出网络输出。

二、原理

递推方程:

特征方程:

三、代码实现

`timescale 1ns / 1ps
//
// Design Name: 
// Module Name: m_sequence
// Description: 参数化m序列发生器设计
//

module m_sequence#(
	parameter POLY = 8'b10001110,  //以x8+x4+x3+x2+1为例
	parameter LEN = 'd8
)
(
    input        clk,
    input        rst_n,
    output       m_seq
);
 
reg [LEN-1 : 0] shift_reg;
 
always@(posedge clk or negedge rst_n)
begin
    if(!rst_n)
    begin
//        shift_reg <= (1 << LEN) - 1'b1;
				shift_reg <= ~'b0;
    end
 
    else
    begin
//        shift_reg[7] <= (shift_reg[0] & POLY[7]) ^
//                        (shift_reg[1] & POLY[6]) ^
//                        (shift_reg[2] & POLY[5]) ^
//                        (shift_reg[3] & POLY[4]) ^
//                        (shift_reg[4] & POLY[3]) ^
//                        (shift_reg[5] & POLY[2]) ^
//                        (shift_reg[6] & POLY[1]) ^
//                        (shift_reg[7] & POLY[0]);
//        shift_reg[6 : 0] <= shift_reg[7 : 1];
        
        shift_reg[0] <= ^(shift_reg & POLY);
        shift_reg[LEN-1:1] <= shift_reg;
    end
end
 
assign m_seq = shift_reg[LEN-1];
// assign m_seq = shift_reg[0];
endmodule

Testbench文件:

`timescale 1ns / 1ps

module m_sequence_tb();

// M_series Parameters
parameter PERIOD = 10;
//parameter M_len = 8;

// M_series Inputs
reg   clk                                  = 0 ;
reg   rst_n                                = 1 ;

// M_series Outputs
wire  m_seq                                   ;

initial
begin
    forever #(PERIOD/2)  clk=~clk;
end
m_sequence #(
//    .POLY (8'b10001110),
//    .LEN ( M_len )  
    )
 u_M_sequence (
    .clk                     ( clk     ),
    .rst_n                   ( rst_n   ),

    .m_seq                   ( m_seq   )
);

initial
begin

    #(PERIOD*2) rst_n  =  0;
    #(PERIOD*2) rst_n  =  1;

    #(PERIOD*100)

    $finish;
end
endmodule

仿真结果:
在这里插入图片描述
在这里插入图片描述文章来源地址https://uudwc.com/A/6za0N

原文地址:https://blog.csdn.net/qq_45776815/article/details/129393613

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请联系站长进行投诉反馈,一经查实,立即删除!

上一篇 2023年09月24日 10:56
下一篇 2023年09月24日 10:58