verilog怎么样实现带符号的右移?(算术右移)

来源:百度知道 编辑:UC知道 时间:2024/05/21 10:03:08
我想实现Verilog里REG 变量的带符号右移,比如1101带符号右移一次后就应该变成1110。但是我用>>和>>>来做的时候结果却是0110。
应该怎么运算呢?

左移,都是左移位后右补0:
例如:
11111001<<1 11111000
11111011<<4 11110000

右移比较麻烦一点,如下:
>>n 是这样运算的:右移n位,如果高位为1的话,则左边补1;如果最高为0的话,左边补0 (Java是这样的,C语言的话,如果高位为1,右移时是补0还是1取决于硬件)
例如:
11111001>>1 11111100
01111011>>1 00111101

>>>n是这样运算的: 右移n位,不管高位为0或者1,都补0
例如:
11111001>>1 01111001
01111011>>1 00111101

非循环右移
module rm(
input wire clk,
input wire rstn,
input wire [7;0] data_i,
output reg [7:0] data_o)
always @(posedge clk)
begin
if(!rstn) begin
data_o<=0;
end
else begin
data_o[7]<=data_i[7];
data_o[6:0]<={1'b0,data_i[5:0]};
end
end
endmodule