HDLBits / 时序逻辑 / 移位寄存器 -- 答案、相关知识、思路整理记录 / 自用
记录一下HDLBits时序逻辑移位寄存器这一章的相关知识和自己写的代码,主要是自用,如果有错误或不足,欢迎交流指正~

4-bit shift register / 4位移位寄存器
要求与思路:右移,areset异步复位至0,load同步置数不移位,ena高电平时开始右移,用0补齐。load优先级比ena更高。
相关知识点:注意区分左移右移,右移是最左端的位首先发生变化,在这里是用0补齐,左移反之。另外由于areset是异步复位,所以敏感事件表中要加上它。
以下为代码:

left/right rotator 左、右旋转机
要求与思路:100bit的左右旋转机,load同步置数;ena为01时右移1bit,10时左移1bit,11和00时不变,情况较多,可以使用case语句;注意与上一题不同,移出的位补到最左端或最右端,而不是用0去补齐。

left / right arithmetic shift by 1 or 8 左右移1位或8位算术移位寄存器
要求与思路:构建一个64bit的算术移位寄存器,同步置数。既可以左移也可以右移,由amount控制。amount为00和01时,分别左移1bit和8bit;为10和11时,分别右移1bit和8bit,还是用case语句比较好。
相关知识点:
这里涉及到逻辑移位和算术移位的不同之处。
1)逻辑移位。上面两题都是逻辑移位,即移出的位丢弃不用,空位用0补齐。
2)算术移位。算术左移与逻辑左移相同,看成是运算的话,向左移动n位,就相当于这个数乘上2n,不过要注意数值的溢出问题。而算术右移则要固定最高位也就是符号位不变,然后再将整体右移1位,右边移出的1位要丢弃不用。向右移动n位,就是这个数除以2n(注意负数都是以补码形式存在,补码=反码+1)。

5-bit LFSR 5位线性反馈移位寄存器
要求与思路:一个5位LSFR,抽头位置在3、5(注意抽头通常从1开始编号)。5处的异或门一端设置为0。reset重置为1。这一题只要按照图将q每一位写出来即可。

相关知识点:
在移位寄存器向右移位一位以后,左边就会空出一位,这时如果采用一个反馈函数,以寄存器中已有的某些序列作为反馈函数的输入,在函数中经过一定的运算后,将反馈函数输出的结果填充到移位寄存器的最左端,那么这样的移位寄存器就会有源源不断的输出。这样的,拥有反馈函数的移位寄存器称为反馈移位寄存器(Feedback Shift Register,FSR)。
如果反馈移位寄存器的反馈函数是线性函数(通常是异或运算,XOR),那么这种寄存器就被称为线性反馈移位寄存器(Linear Feedback Shift Register,LFSR)。我们把参与异或运算的位称为“抽头”(tap)。n位LSFR可以储存最多2^n-1个状态(永远不会到达全0状态)。

3-bit LFSR 3位线性反馈移位寄存器
要求与思路:注意将R输入连接到SW,将时钟连接到KEY[0],L连接到KEY[1]。将 Q 输出连接到红灯 LEDR。其余部分与上一题相似,按照图写出来即可,注意0-1选择器可以用x?x:x语句完成。

代码如下:

32-bit LSFR 32位线性反馈移位寄存器
要求与思路:构建一个32位LSFR,在32、22、2和1处有抽头。此题原理与5bit LSFR相同,但是显然不可能使用相同的代码,否则太过冗长。考虑使用for循环,抽头处另写。
注意:抽头编号从1开始,所以相应序号应该减1才是对应的q的位。另外中间和末尾的抽头都是前一个和q[0]异或,而最高位是和0进行异或。

shift register 移位寄存器(Exams/m2014 q4k)
要求和思路:写出以下电路的verilog代码。注意这个reset是一个低电平有效的同步复位端。这道题的重点在于out和in都是1bit,所以需要引入一个寄存器temp储存暂态。


shift register 移位寄存器(Exam/2014 q4b)
要求与思路:如以下这个n-bit的电路所示,取n=4,并且引用之前写过的一个MUXDFF模块。R给SW,clk给KEY[0],E给KEY[1],L给KEY[2],w给KEY[3],输出信号给LEDR[3:0]。其实这道题只要将每个模块的w信号搞清楚就解决了,注意后一个模块的w信号是前一个模块的输出,第一个模块的w就是KEY[3]。


3-input LUT 3输入查找表
要求:
在8x1存储器中设计一个电路,其中写入存储器是通过移入位完成的,读取是“随机访问”,就像在典型的RAM中一样。然后使用电路实现3输入逻辑功能。
首先,创建一个具有8个D触发器的8位移位寄存器。标记输出为Q[0]至[7]。移位寄存器输入应称为S,它为Q[0]的输入供电(MSB首先移位)。enable输入控制是否移位。然后,扩展电路具有3个额外的输入A,B,C和一个输出Z。电路的功能为:当 ABC 为 000 时,Z=Q[0],当 ABC 为 001 时,Z=Q[1],依此类推。电路应仅包含8位移位寄存器和MUX。
思路:
按照题目要求所给,首先建立一个8位SR,注意这个SR是左移的,输入的S替换左移后留下的Q[0]空位。MSB指的是最高位,它首先移位也能看出是左移。后面的电路功能可以看出是一个8选1多路选择器,用case语句即可。注意case语句开头中敏感时间表应该用*,和SR写在一个always中的话会导致到下一个clk脉冲才进行选择,结果输出错误。
以下为代码:

以上就是我自己整理的所有题目的答案,下面是一些总结:
移位寄存器要注意左移右移的问题,以及是算术还是逻辑移位。
移位寄存器代码还是较为简单的,用if语句即可完成,重点在于输出部分究竟由什么构成,也就是{ }中的内容。
由于SR是由多个DFF构成的,因此相邻DFF输入输出问题也要重点关注。
移位寄存器和MUX结合运用场景较多,MUX用case语句即可完成,但是要根据题目要求注意敏感时间表的内容。