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

仿真结果:
在这里插入图片描述
在这里插入图片描述

  • 2
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
m序列(Maximal Length Sequence)发生器是一种能够产生最长长度的伪随机序列的电路,通常用于通信系统中的扰码、同步、频率同步等应用。下面是一个基于Verilog的m序列发生器的实现原理: m序列的生成是通过反馈移位寄存器实现的。其基本原理是将寄存器中的数据进行异或操作后输出,并将输出的结果反馈到寄存器的最高位,然后将寄存器中的数据向左移位。这个过程不断重复,直到寄存器中的数据与初始状态相等时停止。 具体实现如下: 1. 定义一个n位的寄存器(n为m序列的长度),并将其初始化为一个非零值,例如全1或其他非零值。 2. 在每个时钟周期中,将寄存器中的数据左移一位,并将最高位的数据与反馈多项式进行异或操作。反馈多项式的选择对m序列的质量影响很大,常用的反馈多项式有x^7+x^6+1、x^15+x^14+1、x^31+x^28+1等。 3. 将异或操作的结果输出,并将其反馈到寄存器的最高位。 4. 当寄存器中的数据与初始状态相等时,停止输出m序列。 下面是一个简单的m序列发生器Verilog代码示例: ```verilog module m_sequence( input clk, output reg out ); reg [6:0] reg; // Feedback polynomial: x^7+x^6+1 always @(posedge clk) begin out <= reg[0]; reg <= {reg[6]^reg[5], reg[6:1]}; end endmodule ``` 以上代码实现了一个长度为7的m序列发生器,反馈多项式为x^7+x^6+1。在每个时钟上升沿时,将寄存器中的数据左移一位并进行异或操作,并将输出的结果反馈到寄存器的最高位,最终输出最低位的数据作为m序列。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值