【问题标题】:How can i design y=log(x) in verilog?我如何在 verilog 中设计 y=log(x)?
【发布时间】:2017-11-15 05:20:54
【问题描述】:

我需要在 verilog 中编写代码,但我是新手。我实际上已经尝试过 $log10() 函数,但是在合成代码时,我收到 $log10() 的错误“不支持的系统函数调用”。

【问题讨论】:

  • 也许你应该从设计一个浮点算法开始,用于 3 位有效数字的 8 位浮点运算。
  • y 输出将是 8 位,它将是 3 位小数和 5 位小数的定点。 Y 输出将在区间 [0,8) 内。 您的约束看起来是矛盾的。也许应该是“二进制数字”而不是“十进制数字”? x = 1024 的值不能用 10 位表示。

标签: verilog fpga hdl


【解决方案1】:

也许考虑使用幂级数近似?您可以将其分解为分段函数以获得更高的准确性

请参阅下面的 Wolfram Mathematica 屏幕截图(单击它以获得更好的视图)。


也许可以使用。

【讨论】:

    【解决方案2】:

    由于您只有 1024 个可能的输入,我很懒,只做一个查找表。您可以使用以下 Python 代码生成模块:

    import math
    import bitstring
    
    s = """
    module log10(
       input  wire [9:0]  x,
       output reg  [32:0] y
    );
    
    always @*
    case (x)
    """
    
    for i in range(1, 1024):
    
        # this will give you 32b floating point, not 8b fixed
        # point but you can figure that part out
    
        s += str(i) + ": y = 32'b" + bitstring.BitArray(float=math.log10(i), length=32).bin + ";\n"
    
    s += """
    default: y = 32'hdeadbeef;
    endcase
    endmodule
    """
    
    print(s)
    

    给你:

    module log10(
       input  wire [9:0]  x,
       output reg  [32:0] y
    );
    
    always @*
    case (x)
    1: y = 32'b00000000000000000000000000000000;
    2: y = 32'b00111110100110100010000010011011;
    3: y = 32'b00111110111101000100100100111101;
    4: y = 32'b00111111000110100010000010011011;
    5: y = 32'b00111111001100101110111110110011;
    // ...
    6: default: y = 32'hdeadbeef;
    endcase
    endmodule
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-12-03
      • 1970-01-01
      • 2021-07-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多