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

即按位取反 -> 逻辑左移 -> 按位取反

这适用于任何有效的班次值。

http://www.edaplayground.com/x/YWK

我们可以用这个,

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

开始