欢迎光临散文网 会员登陆 & 注册

HDLBits / 时序逻辑 / 移位寄存器 -- 答案、相关知识、思路整理记录 / 自用

2022-04-10 21:51 作者:土豆土豆2333333  | 我要投稿

        记录一下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个额外的输入ABC和一个输出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脉冲才进行选择,结果输出错误。

以下为代码:




以上就是我自己整理的所有题目的答案,下面是一些总结:

  1.  移位寄存器要注意左移右移的问题,以及是算术还是逻辑移位。

  2.  移位寄存器代码还是较为简单的,用if语句即可完成,重点在于输出部分究竟由什么构成,也就是{ }中的内容。

  3. 由于SR是由多个DFF构成的,因此相邻DFF输入输出问题也要重点关注。

  4. 移位寄存器和MUX结合运用场景较多,MUX用case语句即可完成,但是要根据题目要求注意敏感时间表的内容。


HDLBits / 时序逻辑 / 移位寄存器 -- 答案、相关知识、思路整理记录 / 自用的评论 (共 条)

分享到微博请遵守国家法律