平方根除法中的比特分组

时间:2013-12-12 03:41:50

标签: verilog root square-root

我已经为一个参数化的数字的平方根编写了verilog代码。如果位数是偶数代码工作。

如果位数是奇数,则代码将位数从右侧开始分成两组(LSB)。第一次迭代将选择从最左边的位开始有1位的组。

我正在使用计数器来完成所需的循环次数。我不明白我应该如何为第一次迭代选择1位组,为其余迭代选择2位。

1 个答案:

答案 0 :(得分:0)

可变数量的位选择似乎在硬件中不实用。如果您展示了一些代码,那么答案可能会更具相关性或实用性。

解决这个问题的两种方法:

  1. 在检测到奇数时填充数字,将MSB加0。

  2. 在迭代中有if else,选择1或2位选择性地填充LSB。

  3. 1的代码示例。

    parameter DATA_W = 11;
    parameter odd    = DATA_W % 2;
    input [DATA_W-1:0] data;
    reg   [DATA_W-1+odd:0] data_int;
    
    always @* begin
      if (odd)
        data_int = {1'b0, data};
      else 
        data_int = data;
    end
    

    2的代码示例。

    // Iteration for( loop=0; loop<max; loop=loop+1) begin
      if ((loop == 0) && (odd)) begin
        sel = {data[0], 1'b0};
      end 
      else begin
        sel = data[loop*2+1:loop*2]; 
      end
    // end
    

    这应该能够静态展开,因为odd基于参数并且循环具有固定数量的迭代。如果循环可以静态展开,那么它是可合成的。