需要特别注意的是算术右移,我也不甚理解,详见算术移位 VS 逻辑移位_逻辑左移和算术左移的区别_来日梦多长的博客-CSDN博客
答案:
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)begin
q<=data;
end
else if(ena)begin
case(amount)
2'b00:q<={q[62:0],1'b0};
2'b01:q<={q[55:0],8'b0};
2'b10:q<={q[63],q[63:1]};
2'b11:q<={{8{q[63]}},q[63:8]}; //这里要注意算右移
endcase
end
else
q<=q;
end
endmodule