HDLBits (110) — 5位线性移位反馈寄存器
本题链接:
https://hdlbits.01xz.net/wiki/Lfsr5
线性反馈移位寄存器是一种移位寄存器,通常带有几个异或门来产生移位寄存器的下一个状态。 伽罗瓦 LFSR 是一种特殊的安排,其中带有“抽头”的位位置与输出位进行异或运算以产生其下一个值,而没有抽头移位的位位置。 如果仔细选择抽头位置,则可以将 LFSR 设置为“最大长度”。 n 位的最大长度 LFSR 在重复之前循环通过 2n-1 个状态(永远不会达到全零状态)。
下图显示了一个 5 位最大长度的 Galois LFSR,在位位置 5 和 3 处具有抽头。(抽头位置通常从 1 开始编号)。 请注意,为了保持一致性,我在位置 5 处绘制了 XOR 门,但 XOR 门输入之一是 0。

构建这个 LFSR。 复位应将 LFSR 复位为 1。

题目
提示:
从 1 开始的前几个状态是 00001, 10100, 01010, 00101, ... LFSR 应该在返回 00001 之前循环通过 31 个状态。

答案

输出波形


向量
当位宽大于 1 时,wire 或 reg 即可声明为向量的形式。Verilog 支持可变的向量域选择,
Verillog 还支持指定 bit 位后固定位宽的向量域选择访问。
[bit+: width] : 从起始 bit 位开始递增,位宽为 width。
[bit-: width] : 从起始 bit 位开始递减,位宽为 width。
对信号重新进行组合成新的向量时,需要借助大括号。
异步复位
异步复位是指无论时钟到来与否,只要复位信号有效,电路就会执行复位操作。
异步复位常常会被综合成如下电路:

异步复位的优点:大多数触发器单元有异步复位端,不会占用额外的逻辑资源。且异步复位信号不经过处理直接引用,设计相对简单,信号识别快速方便。
异步复位的缺点:复位信号与时钟信号无确定的时序关系,异步复位很容易引起时序上removal 和 recovery 的不满足。且异步复位容易受到毛刺的干扰,产生意外的复位操作。
线性反馈移位寄存器(英语:Linear feedback shift register,LFSR)是指给定前一状态的输出,将该输出的线性函数再用作输入的移位寄存器。异或运算是最常见的单比特线性函数:对寄存器的某些位进行异或操作后作为输入,再对寄存器中的各比特进行整体移位。
赋给寄存器的初始值叫做“种子”,因为线性反馈移位寄存器的运算是确定性的,所以,由寄存器所生成的数据流完全决定于寄存器当时或者之前的状态。而且,由于寄存器的状态是有限的,它最终肯定会是一个重复的循环。然而,通过本原多项式,线性反馈移位寄存器可以生成看起来是随机的且循环周期非常长的序列。
线性反馈移位寄存器的应用包括生成伪随机数,伪随机噪声序列,快速数字计数器,还有扰频器。线性反馈移位寄存器在硬件和软件方面的应用都非常得普遍。
循环冗余校验中用于快速校验传输错误的数学原理,就与线性反馈移位寄存器密切相关。
Fibonacci LFSRs
影响下一个状态的比特位叫做抽头。图中,抽头序列为[16,14,13,11]。LFSR最右端的比特为输出比特。抽头依次与输出比特进行异或运算,然后反馈回最左端的位。最右端位置所生成的序列被称为输出流。

影响LFSR下一个状态的比特位叫做抽头(图中黑色数字)
最大长度的LFSR生成一个M序列(例如,只有与有一定抽序列的LFSR才能通过所有
− 1 个内部状态,不包括全零状态),除非它本身为全零,亦即状态永不改变
作为基于异或运算的LFSR的替换,LFSR也可以给予同或运算。与使用异或门的LFSR全零状态下为无效状态相应的,使用同或门的LFSR在全“1”状态下也是无效的。
有LFSR或者基于同或门的LFSR生成的序列可以被认为是同格雷码或者自然二进制码同样有效的二进制序列。
在LFSR中,抽头的设定可以用有限域算数中模2的多项式来表示。这就意味着,多项式中的所有系数必须是“1”或者“0”。这个多项式被称作回授多项式或特征多项式。例如图中的抽头为在第16,14,13,11个比特,则相应的特征多项式为:
多项式中常数“1”并不代表某一个抽头,它所指的是一个比特位的输入(例如 ,等效为 1 )。多项式中的指数代表从左至右的抽头位。第一个和最后一个比特一般相应的是输入和输出位。
当且仅当相应的回授多项式是本原多项式时,LFSR才能达到最大长度。这表示以下条件是必须的:
抽头的数量必须为偶数。
抽头之间不能成对出现,必须是互质的。
生成最长LFSRs的本原多项式表可通过下部的链接找到。 这类型LFSR也被成为标准,多对一或外部异或门的LFSR。
Galois LFSRs
以法国数学家埃瓦里斯特·伽罗瓦命名,是LFSRs的Galois型结构。

参考内容:
2.3 Verilog 数据类型 | 菜鸟教程:
https://www.runoob.com/w3cnote/verilog-data-type.html
5.1 Verilog 复位简介 | 菜鸟教程:
https://www.runoob.com/w3cnote/verilog2-reset.html
线性反馈移位寄存器 | 维基百科
https://zh.wikipedia.org/wiki/线性反馈移位寄存器