【问题标题】:verilog bit shift with 1verilog 位移 1
【发布时间】:2016-03-17 18:58:33
【问题描述】:

我正在尝试对 verilog 中的值进行位移,以使替换的位是 1 而不是 0。即我想做0001 << 1 这样它会给出0011 而不是0010

【问题讨论】:

    标签: verilog system-verilog


    【解决方案1】:

    您使用的命令 '

    假设您有一个名为 A 的 4 位变量(如您的示例)。

    A = 4'b0000; 
    A = {A[2:0], 1'b1};
    

    通过串联,您可以使用一个而不是零。

    或者你可以使用'or'函数来解决这个问题:

    A = (A << 1) | 4'b0001;
    

    【讨论】:

      【解决方案2】:

      你可以这样做:

      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

      【讨论】:

        【解决方案3】:

        你能做类似的事情吗:

        (x &lt;&lt; 1) + 1

        (x &lt;&lt; 1) | 1

        【讨论】:

          【解决方案4】:

          为了使移位最多使用位数,以下示例预先用 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];
          

          【讨论】:

            【解决方案5】:

            我们可以用这个,

            a = (1'b1

            将 count 分配给一个值,该值等于要从 LSB 填充的 1 的数量。

            【讨论】:

              【解决方案6】:
              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
              

              【讨论】:

              • 虽然这段代码可能会解决问题,但一个好的答案还应该解释代码的什么以及它如何提供帮助。
              • 例如:让我们取 size = 2。然后第一行导致 mask_value = 32'hFFFFFFFC。然后第二行反转这个值,所以你得到 32'h00000003 基本上将 1s 移入掩码而不是 0s
              【解决方案7】:

              x |= x

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 2011-11-24
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多