HDLBits (109) — 向左/右算数移位1或8位
本题链接:
https://hdlbits.01xz.net/wiki/Shift18
构建一个有同步加载功能的64位算术移位寄存器。移位器可以左右移动,并按amount选择1或8位位置。
算术右移移位寄存器中数字的符号位(在这种情况下为 q[63])不是逻辑右移所完成的零。关于算术右移的另一种思考方式是,假设被移位的数字是有符号的,为了保留符号,因此算术右移将带符号数字除以二的幂。
逻辑左移和算术左移之间没有区别。
load: 用 data[63:0] 加载移位寄存器,而不是移位。
ena: 选择是否移位
amount: 选择移动方向和移动多少
2'b00: 左移1位
2'b01: 左移8位
2'b10: 右移1位
2'b11: 右移8位
q: 移位器的内容

题目
提示:
5位数字11000算术右移1位为11100,而逻辑右移将产生01100。
类似地,5位数字01000算术右移1等于00100,而逻辑右移将产生相同的结果,因为原始数字是非负的。

答案

输出波形



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

异步复位的优点:大多数触发器单元有异步复位端,不会占用额外的逻辑资源。且异步复位信号不经过处理直接引用,设计相对简单,信号识别快速方便。
异步复位的缺点:复位信号与时钟信号无确定的时序关系,异步复位很容易引起时序上 removal 和 recovery 的不满足。且异步复位容易受到毛刺的干扰,产生意外的复位操作。
参考内容:
2.3 Verilog 数据类型 | 菜鸟教程:
https://www.runoob.com/w3cnote/verilog-data-type.html
5.1 Verilog 复位简介 | 菜鸟教程:
https://www.runoob.com/w3cnote/verilog2-reset.html