【Verilog编程】线性反馈移位寄存器(LFSR)原理及Verilog代码实现

这篇具有很好参考价值的文章主要介绍了【Verilog编程】线性反馈移位寄存器(LFSR)原理及Verilog代码实现。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、移位寄存器的基本概念

1.移位寄存器

移位寄存器:指若干个寄存器排成一列,每个寄存器中存放1bit二进制数据(0或1),每个时钟周期向左或向右移动一个bit。下图所示为一个向右移动的移位寄存器。
线性反馈移位寄存器原理,数字IC,fpga开发,单片机,嵌入式硬件

2.反馈移位寄存器

反馈移位寄存器(Feedback Shift Register,FSR):每个时钟脉冲,移位寄存器向右移动一位,则移位寄存器的左左侧就会空出一位。这个如果左侧有输入,则移位寄存器的右侧输出端则会有源源不断的数据输出。如果来自移位寄存器的某些序列根据一定的反馈函数形成左侧输入,则称该结构为反馈移位寄存器。
线性反馈移位寄存器原理,数字IC,fpga开发,单片机,嵌入式硬件

3.线性反馈移位寄存器

线性反馈移位寄存器(Linear Feedback Shift Register,LFSR):当反馈移位寄存器的反馈函数f(x)是线性时,则称为线性反馈移位寄存器。
线性反馈移位寄存器原理,数字IC,fpga开发,单片机,嵌入式硬件
线性反馈移位寄存器的反馈函数为:对移位寄存器中的某些位进行异或。将反馈函数得到的计算结果反馈到移位寄存器的最左边,即得到了线性反馈移位寄存器。

状态

状态:一个LFSR当前存储的序列被称为一个状态。当LFSR向右移动一位时,左侧会被反馈函数补上一位计算后的数据,得到一个新的LFSR序列,此时LFSR就移动到了一个新状态。

抽头

抽头:线性反馈移位寄存器有些位参与异或,有些位不参与异或,其中参与异或的位被称为抽头。抽头会影响下一状态的比特位。LFSR的触发器编号从1开始,因此抽头的取值范围是1~(2n-1)。

种子

种子:LFSR中的初值,种子应该是非零的。如果为全零的话,下一状态任意做异或也还是为0,则线性反馈移位寄存器的输出用于0,无效。

二、LFSR的一些基本概念

1.级数和周期

级数:LFSR中的寄存器个数称为LFSR的级数。一个5级的LFSR最多同时存放5bit数据
周期:一个n级的LFSR最多只有(2n-1)个状态,即:一个n级的LFSR最多只能遍历2n-1个序列,即最大周期为(2n-1)
注:nbit移位寄存器能存储的数据为0~(2n-1),即2n个状态,但是由于LFSR禁止全0状态,因此一个n级的LFSR最多只能有(2n-1)个状态。因此一个LFSR的最大周期是(2n-1)个系统时钟周期,当用LFSR产生PRBS(伪随机噪声)时,是存在周期性的。值得注意的是:不是所有的LFSR都能达到(2n-1)个周期,这与抽头的设计相关。只要选择合适的反馈函数便可使序列的周期达到最大值(2n-1),周期达到最大值的序列称为m序列

2.特征多项式

线性反馈移位寄存器原理,数字IC,fpga开发,单片机,嵌入式硬件
由上图,可以得到第n+1位的值为:
线性反馈移位寄存器原理,数字IC,fpga开发,单片机,嵌入式硬件
由上文可以看出,特征多项式表示的是抽头系数,抽头的设计关系到LFSR的最大周期,一般要使LFSR得到最大周期(2^n-1),可参照如下表:
线性反馈移位寄存器原理,数字IC,fpga开发,单片机,嵌入式硬件

三、LFSR的分类

1.斐波那契LFSR:多到一型LFSR(many to one)

抽头序列对应bit位置的多个寄存器的输出异或后驱动一个寄存器输入

从左到右依次递增编号

线性反馈移位寄存器原理,数字IC,fpga开发,单片机,嵌入式硬件

从右到左依次递减编号

线性反馈移位寄存器原理,数字IC,fpga开发,单片机,嵌入式硬件
以三级LFSR,反馈函数为:f(x)=x3+x2+1为例,其两种编号的伽罗瓦电路图如下

1.从左到右依次递增编号
线性反馈移位寄存器原理,数字IC,fpga开发,单片机,嵌入式硬件
假设初始状态为001,则该电路的状态跳转为:
线性反馈移位寄存器原理,数字IC,fpga开发,单片机,嵌入式硬件
周期数为23-1=7

2.从左到右依次递减编号

线性反馈移位寄存器原理,数字IC,fpga开发,单片机,嵌入式硬件
假设初始状态为001,则该电路的状态跳转为:
线性反馈移位寄存器原理,数字IC,fpga开发,单片机,嵌入式硬件
周期数为23-1=7

斐波那契LFSR习惯采用“从左到右依次递增编号”的电路。

三级斐波那契LFSR的Verilog代码实现

`timescale	1ns/1ps
module fibonacci_lfsr(
	input		wire						sclk,
	input		wire						rst_n,
	output		reg 						flfsrn
);

reg	[1:3]	fibo_lfsr;//f(x)=x^3+x^2+1,从左到右依次递增编号

always	@(posedge	sclk or negedge	rst_n)begin
	if(rst_n==1'b0)begin
		fibo_lfsr<=3'b001;//initial value
	end
	else	begin
		fibo_lfsr<={fibo_lfsr[3]^fibo_lfsr[2],fibo_lfsr[1],fibo_lfsr[2]};
	end
end

always	@(*)begin
	flfsrn=fibo_lfsr[3];
end
endmodule

仿真图如下所示,符合预期状态转移过程。
线性反馈移位寄存器原理,数字IC,fpga开发,单片机,嵌入式硬件

2.伽罗瓦LFSR:一到多型LFSR(one to many)

最后一个寄存器的输出通过与抽头序列对应位置寄存器前一级寄存器的输出异或后驱动多个抽头序列对应位置的寄存器

从左到右依次递增编号

线性反馈移位寄存器原理,数字IC,fpga开发,单片机,嵌入式硬件

从左到右依次递减编号

线性反馈移位寄存器原理,数字IC,fpga开发,单片机,嵌入式硬件
以三级LFSR,反馈函数为:f(x)=x3+x2+1为例,其两种编号的伽罗瓦电路图如下

1.从左到右依次递增编号
线性反馈移位寄存器原理,数字IC,fpga开发,单片机,嵌入式硬件
假设电路初始值为001,则该电路的状态跳转为:
线性反馈移位寄存器原理,数字IC,fpga开发,单片机,嵌入式硬件
周期数为23-1=7

2.从左到右依次递减编号
线性反馈移位寄存器原理,数字IC,fpga开发,单片机,嵌入式硬件
假设电路初始值为001,则该电路的状态跳转为:
线性反馈移位寄存器原理,数字IC,fpga开发,单片机,嵌入式硬件
周期数为23-1=7

伽罗瓦LFSR习惯采用“从左到右依次递减编号”电路。

三级伽罗瓦LFSR的Verilog代码实现

`timescale	1ns/1ps
module galois_lfsr(
	input		wire						sclk,
	input		wire						rst_n,
	output		reg							glfsrn
);

reg	[3:1]	galo_lfsr;//f(x)=x^3+x^2+1,从左到右依次递减编号

always	@(posedge	sclk or negedge	rst_n)begin
	if(rst_n==1'b0)begin
		galo_lfsr<=3'b000;//initial value
	end
	else begin
		galo_lfsr<={galo_lfsr[1],galo_lfsr[3]^galo_lfsr[1],galo_lfsr[2]};
	end
end

always	@(*)begin
	glfsrn=galo_lfsr[1];
end
endmodul

仿真图如下所示,符合预期状态转移过程。
线性反馈移位寄存器原理,数字IC,fpga开发,单片机,嵌入式硬件

3.斐波那契LFSR与伽罗瓦LFSR的对比

伽罗瓦LFSR具有更高的速度,因为两个触发器之间只有一个异或门。斐波那契LFSR在首尾两个寄存器之间有多个异或门,组合逻辑延时更大,因为为了满足建立保持时间的要求,其频率更小(周期更大),速度更慢。

4.LFSR的全零禁止态

由上文的分析,当LFSR的某个状态为全0后,无论怎么组合,0与0异或都为0,因此LFSR将一直输出0,得不到想要的序列,因此LFSR要避免进入全零状态。其预防的办法有:
(1)将寄存器置位到某个允许的状态

if(|lfsr[n-1:0]==1'b0)begin
			lfsr[n-1:0]<={{n}{1'b1}};//如果为全零状态,则下一个状态置为全1。
		end

(2)使用额外的电路使得电路进入全零状态后自动退出

斐波那契LFSR禁止态处理

如对于斐波那契LFSR,额外添加一个n位或非(NOR)逻辑,如下电路图
线性反馈移位寄存器原理,数字IC,fpga开发,单片机,嵌入式硬件
(1)当LFSR为全零时,F=1,那么LFSR的状态跳变为:00…00—>00…01,LFSR从全零状态退出
(2)当LFSR不为全零时,F=0,此时
线性反馈移位寄存器原理,数字IC,fpga开发,单片机,嵌入式硬件
由于任何数(0或1)异或0都等于其本身,因此
线性反馈移位寄存器原理,数字IC,fpga开发,单片机,嵌入式硬件
故当LFSR不为全零时,不会对电路造成影响。

如对一个三级LFSR,特征多项式为f(x)=x3+x2+1,"从左到右依次递增编号"的斐波那契LFSR,加上“保险”后的电路为:
线性反馈移位寄存器原理,数字IC,fpga开发,单片机,嵌入式硬件

三级斐波那契LFSR禁止态处理的Verilog代码实现
`timescale	1ns/1ps
module fibonacci_lfsr(
	input		wire						sclk,
	input		wire						rst_n,
	output		reg 						flfsrn
);

reg	[1:3]	fibo_lfsr;//f(x)=x^3+x^2+1,从左到右依次递增编号
wire		all_lfsr_not_0;

assign	all_lfsr_not_0=~(fibo_lfsr!=3'b000);

always	@(posedge	sclk or negedge	rst_n)begin
	if(rst_n==1'b0)begin
		fibo_lfsr<=3'b001;//initial value
	end
	else	begin
		fibo_lfsr<={fibo_lfsr[3]^fibo_lfsr[2]^all_lfsr_not_0,fibo_lfsr[1],fibo_lfsr[2]};
	end
end

always	@(*)begin
	flfsrn=fibo_lfsr[3];
end
endmodule

仿真图如下,当LFSR从全0状态启动后,LFSR自动进入下一状态,符合预期。
线性反馈移位寄存器原理,数字IC,fpga开发,单片机,嵌入式硬件

伽罗瓦LFSR禁止态处理

同理对伽罗瓦LFSR添加一个n位或非(NOR)逻辑,如下电路图
线性反馈移位寄存器原理,数字IC,fpga开发,单片机,嵌入式硬件
(1)当LFSR为全零时,F=1,那么LFSR的状态跳变为:00…00—>01…00,LFSR从全零状态退出
(2)当LFSR不为全零时,F=0,此时
线性反馈移位寄存器原理,数字IC,fpga开发,单片机,嵌入式硬件
由于任何数(0或1)异或0都等于其本身,因此
线性反馈移位寄存器原理,数字IC,fpga开发,单片机,嵌入式硬件
线性反馈移位寄存器原理,数字IC,fpga开发,单片机,嵌入式硬件
故当LFSR不为全零时,不会对电路造成影响。

如对一个三级LFSR,特征多项式为f(x)=x3+x2+1,"从左到右依次递减编号"的伽罗瓦LFSR,加上“保险”后的电路为:
线性反馈移位寄存器原理,数字IC,fpga开发,单片机,嵌入式硬件

三级伽罗瓦LFSR禁止态处理的Verilog代码实现
`timescale	1ns/1ps
module galois_lfsr(
	input		wire						sclk,
	input		wire						rst_n,
	output		reg							glfsrn
);

reg	[3:1]	galo_lfsr;//f(x)=x^3+x^2+1,从左到右依次递减编号
wire		all_lfsr_not_0;

assign	all_lfsr_not_0=~(galo_lfsr!=3'b000);

always	@(posedge	sclk or negedge	rst_n)begin
	if(rst_n==1'b0)begin
		galo_lfsr<=3'b000;//initial value
	end
	else begin
		galo_lfsr<={galo_lfsr[1],galo_lfsr[3]^galo_lfsr[1]^all_lfsr_not_0,galo_lfsr[2]};
	end
end

always	@(*)begin
	glfsrn=galo_lfsr[1];
end
endmodul

仿真图如下,当LFSR从全0状态启动后,LFSR自动进入下一状态,符合预期。
线性反馈移位寄存器原理,数字IC,fpga开发,单片机,嵌入式硬件

参考文献

1.详解线性反馈移位寄存器(LFSR)
2.LFSR(线性反馈移位寄存器)
3.线性反馈移位寄存器(LFSR)文章来源地址https://www.toymoban.com/news/detail-606783.html

到了这里,关于【Verilog编程】线性反馈移位寄存器(LFSR)原理及Verilog代码实现的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

领支付宝红包 赞助服务器费用

相关文章

  • Verilog实现移位寄存器

    Verilog实现8位环形移位寄存器 左移: 环形就是首尾相连 右移: 普通的移位寄存器用for语句实现: 普通左移: tb测试: 图形分析: 双向shift:就是加个判断

    2024年02月11日
    浏览(54)
  • Verilog基础之十一、移位寄存器实现

    目录 一、前言 二、工程设计 ​2.1 工程代码 2.2 综合结果 2.3 仿真结果     移位寄存器SRL在工程中属于使用频率较高个模块,可用于存储数据,实现串并转换;根据数据移动方向可分为左移寄存器,右移寄存器,左移是向数据高位移动,右移是向数据低位移动。  工程中包

    2024年02月11日
    浏览(46)
  • 【FGPA】Verilog:移位寄存器 | 环形计数器 | 4bit移位寄存器的实现 | 4bit环形计数器的实现

      目录 Ⅰ. 理论部分 0x00 移位寄存器(Shift Register) 0x01 环形计数器(Ring Counter)

    2024年02月05日
    浏览(43)
  • Verilog学习笔记——时序逻辑(shift register移位寄存器)

    1. 4位移位寄存器  4-bit shift register 2. Left/ right register 左移|右移寄存器(1位)   3. Left/right arithmetic shift by 1 or 8 算数 左移|右移寄存器(1 或8位) 4. 5-bit LFSR 5. 3-bit LFSR   6. 32-bit LFSR   7. Shift register 8. Shift register    9. 3-input LUT  

    2024年02月03日
    浏览(45)
  • hdlbits系列verilog解答(8位宽移位寄存器)-24

    这项练习是module_shift移位寄存器的延伸。模块端口不是只有单个引脚,我们现在有以向量作为端口的模块,您将在其上附加线向量而不是普通线网数据。与 Verilog 中的其他位置一样,端口的向量长度不必与连接到它的导线匹配,但这会导致向量的零填充或截断。本练习不使用

    2024年02月08日
    浏览(38)
  • m基于FPGA的桶形移位寄存器verilog实现,包含testbench

    目录 1.算法仿真效果 2.算法涉及理论知识概要 2.1、桶形移位寄存器的基本原理 2.2、桶形移位寄存器的数学模型 2.3、桶形移位寄存器的实现步骤 3.Verilog核心程序 4.完整算法代码文件 本系统进行了两个平台的开发,分别是: Vivado2019.2 Quartusii18.0+ModelSim-Altera 6.6d  Starter Edition 其

    2024年02月04日
    浏览(55)
  • 【FPGA】Verilog:时序电路设计 | 自循环移位寄存器 | 环形计数 | 扭环计数 | 约翰逊计数器

    前言: 本章内容主要是演示Vivado下利用Verilog语言进行电路设计、仿真、综合和下载 示例:计数器   ​​ 功能特性: 采用 Xilinx Artix-7 XC7A35T芯片  配置方式:USB-JTAG/SPI Flash 高达100MHz 的内部时钟速度  存储器:2Mbit SRAM   N25Q064A SPI Flash(样图旧款为N25Q032A) 通用IO:Switch :

    2024年02月10日
    浏览(102)
  • 北邮22级信通院数电:Verilog-FPGA(10)第十周实验 实现移位寄存器74LS595

    北邮22信通一枚~ 跟随课程进度更新北邮信通院数字系统设计的笔记、代码和文章 持续关注作者 迎接数电实验学习~ 获取更多文章,请访问专栏: 北邮22级信通院数电实验_青山如墨雨如画的博客-CSDN博客 目录 一.代码部分  二.管脚分配 三.实现过程讲解及效果 shift_register.v d

    2024年02月05日
    浏览(62)
  • FPGA之移位寄存器

            SLICEM中的LUT可以配置为32位移位寄存器,而无需使用slice中可用的触发器。以这种方式使用,每个LUT 可以将串 行数据延迟 1 到 32 个时钟周期。移入D (DI1 LUT 引脚)和移出 Q31(MC31 LUT 引脚)线路将LUT级联,以形成更大的移位寄存器。因此,SLICEM 中的四个 LUT 被级联以

    2024年02月19日
    浏览(51)
  • LABVIEW的移位寄存器

    移位寄存器是数据的容器,可以包含任何数据类型。 添加移位寄存器后,在循环结构左右两侧的平行位置将各增加一个包含三角形的方框。左侧的方框代表上一次循环的运行结果,而右侧的代表本次循环要输入的结果。  最终得到5次循环后的结果。 接下来我们做一个通过移

    2024年02月11日
    浏览(49)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包