【发布时间】:2016-03-17 18:58:33
【问题描述】:
我正在尝试对 verilog 中的值进行位移,以使替换的位是 1 而不是 0。即我想做0001 << 1 这样它会给出0011 而不是0010
【问题讨论】:
我正在尝试对 verilog 中的值进行位移,以使替换的位是 1 而不是 0。即我想做0001 << 1 这样它会给出0011 而不是0010
【问题讨论】:
您使用的命令 '
假设您有一个名为 A 的 4 位变量(如您的示例)。
A = 4'b0000;
A = {A[2:0], 1'b1};
通过串联,您可以使用一个而不是零。
或者你可以使用'or'函数来解决这个问题:
A = (A << 1) | 4'b0001;
【讨论】:
你可以这样做:
module ones_shift #(log2_width=2) (input [(2**log2_width)-1:0] A, input [log2_width:0] SHIFT, output [(2**log2_width)-1:0] As);
wire [(2**log2_width)-1:0] Ai, Ais;
assign Ai = ~A;
assign Ais = Ai << SHIFT;
assign As = ~Ais;
endmodule
即按位反转 -> 逻辑左移 -> 按位反转
这适用于任何有效的移位值。
【讨论】:
你能做类似的事情吗:
(x << 1) + 1
或
(x << 1) | 1
【讨论】:
为了使移位最多使用位数,以下示例预先用 1 的移位填充输入,然后选择 MSB:
localparam WIDTH = 4;
// Create temp with 1's as padding
wire [WIDTH*2 -1 :0] pad = {A, {4{1'b1}}};
wire [WIDTH*2 -1 :0] shift = pad << 1;
// Select MSB with 1's shifted in
wire [WIDTH-1 : 0] result = shift[WIDTH*2 -1 : WIDTH];
【讨论】:
我们可以用这个,
a = (1'b1
将 count 分配给一个值,该值等于要从 LSB 填充的 1 的数量。
【讨论】:
function bit[31:0] cal_mask_value (int size);
bit [31:0] mask_value;
mask_value = 32'hFFFFFFFF << size;
mask_value = ~mask_value;
return mask_value;
endfunction
【讨论】:
x |= x
【讨论】: