传送门:
Shift18 - HDLBits (01xz.net)https://hdlbits.01xz.net/wiki/Shift18
题目:
设计一个64-bit带同步load的算术移位寄存器。amount控制移动方向和每次移动的次数。
算术右移移位寄存器中的符号位(q [63])移位,不像是逻辑右移中进行补零的操作。被移位的数字是有符号的并保留符号。
逻辑移位寄存器和算术左移移位寄存器没有区别。
- load : 加载带有数据[63:0]的移位寄存器。
- ena :选择是否移位
- amount : 选择移位的方向和移位的个数
- 2'b00 : 左移1bit
- 2’b01 : 左移8bit
- 2'b10 : 右移1bit
- 2'b11 : 右移8bit
- q : 寄存器中的数据
以下为本人提供的代码,有更好的代码欢迎评论区提供:
module top_module(
input clk,
input load,
input ena,
input [1:0] amount,
input [63:0] data,
output reg [63:0] q);
always@(posedge clk)
begin
if(load)
q[63:0] <= data[63:0];
else if(ena) begin
if(amount==2'b10)//right
q[63:0] <= {q[63], q[63:1]};
else if(amount==2'b11)
q[63:0] <= {{8{q[63]}}, q[63-:56]};
else if(amount==2'b00) //left
q[63:0] <= q[63:0]<<1;
else if(amount==2'b01)
q[63:0] <= q[63:0]<<8;
end
else q[63:0] <= q[63:0];
end
endmodule