verilog 位移位为 1
verilog bit shift with 1
我正在尝试对 verilog 中的值进行位移,以便替换的位为 1 而不是 0。即我想做 0001 << 1
这样它给出 0011
而不是 0010
你能做这样的事情吗:
(x << 1) + 1
或
(x << 1) | 1
您使用的命令“<<”为剩余位置零。
你可以像下面的代码那样做:
假设您有一个名为 A 的 4 位变量(如您的示例)。
A = 4'b0000;
A = {A[2:0], 1'b1};
通过串联,您可以用 1 代替 0。
或者您可以使用 'or' 函数来解决此问题:
A = (A << 1) | 4'b0001;
为了使移位工作达到位数,以下示例使用 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];
你可以这样做:
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
即按位取反 -> 逻辑左移 -> 按位取反
这适用于任何有效的班次值。
我们可以用这个,
a = (1'b1 << 计数) - 1;
将计数分配给等于要从 LSB 填充的 no.of 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<<1; // 假设 x 从 1
开始
我正在尝试对 verilog 中的值进行位移,以便替换的位为 1 而不是 0。即我想做 0001 << 1
这样它给出 0011
而不是 0010
你能做这样的事情吗:
(x << 1) + 1
或
(x << 1) | 1
您使用的命令“<<”为剩余位置零。 你可以像下面的代码那样做:
假设您有一个名为 A 的 4 位变量(如您的示例)。
A = 4'b0000;
A = {A[2:0], 1'b1};
通过串联,您可以用 1 代替 0。
或者您可以使用 'or' 函数来解决此问题:
A = (A << 1) | 4'b0001;
为了使移位工作达到位数,以下示例使用 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];
你可以这样做:
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
即按位取反 -> 逻辑左移 -> 按位取反
这适用于任何有效的班次值。
我们可以用这个,
a = (1'b1 << 计数) - 1;
将计数分配给等于要从 LSB 填充的 no.of 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<<1; // 假设 x 从 1
开始