m序列的原理以及verilog实现

定义

m序列是最长线性反馈移位寄存器序列的简称。它是由带线性反馈的移存器产生的周期最长的序列。一般来说,一个n级线性反馈移存器可能产生的最长周期等于(2^n -1)。

m序列是一种典型的伪随机序列。在通信领域有着广泛的应用,如扩频通信、卫星通信的码分多址(CDMA),数字数据中的加密、加扰、同步、误码率测量等领域。


线性反馈移位寄存器原理方框图


与产生m序列有关的3个方程

1)递推方程

它给出了状态ak和前面n个状态的关系。

2)特征方程(又叫特征方程式)

它决定了移存器的反馈连接和序列的结构。式中x^i仅指明其系数(1或0)代表ci的值,x本身的取值并无实际意义。

3)母函数

它表示反馈移存器的输出序列{ak}。

本原多项式

若一个n次多项式f(x)满足下列条件:
1)f(x)为既约的;
2)f(x)可整除(x^m +1),m=2^n -1;
3)f(x)除不尽(x^q +1),q<m;
则称f(x)为本原多项式。

为什么要理解本原多项式?因为一个线性反馈移存器能产生m序列的充要条件:反馈移存器的特征多项式为本原多项式。常用的本原多项式由查表得到。


本原多项式表

verilog实现及仿真

m_sequence.v(以x8+x4+x3+x2+1为例) tips:代码实现依据原理方框图和特征多项式。

module m_sequence(
	input				sclk,
	input				rst_n,
	output	wire			m_seq
);
parameter POLY = 8'b10001110;//由本原多项式得到

reg [7:0]	shift_reg;

always@(posedge sclk or negedge rst_n)
begin
	if(rst_n == 0)begin
		shift_reg <= 8'b11111111;//初值不可为全零
		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];				 
		end
end

assign m_seq = shift_reg[0];

endmodule

仿真截图:


注:从图中黄线处开始得到新值,黄线前面是初始化的值。

  • 10
    点赞
  • 122
    收藏
    觉得还不错? 一键收藏
  • 18
    评论
m序列发生器是一种伪随机二进制序列(PRBS)发生器,通常用于数字通信中的编码和调制方案。它可以通过递归方式生成长达2^n-1位的伪随机码序列,其中n是序列寄存器的位数。以下是m序列发生器的Verilog实现原理: 1. 定义输入和输出:定义一个n位的寄存器作为序列寄存器,定义两个输入信号,即时钟信号和清零信号,以及一个输出信号,即m序列输出。 2. 初始化序列寄存器:将序列寄存器的所有位初始化为1或0。 3. 定义反馈多项式:根据所需的序列长度,选择一个合适的反馈多项式。多项式的位数应该为n+1位,并且多项式的最高位和最低位都应该是1。 4. 实现移位寄存器:将序列寄存器的最高位输出作为m序列输出。然后,将序列寄存器向左移位,并使用反馈多项式计算新的最低位。将新的最低位插入序列寄存器的最低位。 5. 循环移位:重复步骤4,直到生成所需长度的伪随机码序列。 以下是一个简单的m序列发生器的Verilog代码示例: ``` module m_sequence_generator( input clk, // 时钟信号 input rst, // 清零信号 output reg m_seq // m序列输出 ); reg [n-1:0] shift_reg; // 序列寄存器 parameter n = 5; // 序列寄存器的位数 parameter feedback_poly = 5'h1f; // 反馈多项式 initial begin shift_reg = {n{1'b1}}; // 初始化序列寄存器 end always @(posedge clk) begin if (rst) begin shift_reg <= {n{1'b1}}; // 清零序列寄存器 m_seq <= 1'b0; // 清零m序列 end else begin m_seq <= shift_reg[n-1]; // 输出序列寄存器的最高位 shift_reg <= {shift_reg[n-2:0], shift_reg[0] ^ shift_reg[n-1]}; // 计算新的最低位并插入序列寄存器 end end endmodule ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值