调用浮点数计算的ip内核之后仿真实现的power炸了?

问题遇到的现象和发生背景

用浮点数计算实现两点之间的距离公式,直接调用的ip内核来完成计算

遇到的现象和发生背景,请写出第一个错误信息

仿真实现之后发现资源占用率很低,但是功率上天,直接100w,温度125度

用代码块功能插入代码,请勿粘贴截图。 不用代码块回答率下降 50%
//fix_float
// fix_float fix_float0(
  // .aclk(clk),
  // .aresetn(rst_n),
  // .s_axis_a_tvalid(1'b1),
  // .s_axis_a_tready(1'b1),
  // .s_axis_a_tdata(x),
  // .m_axis_result_tvalid(1'b1),
  // .m_axis_result_tready(1'b1),
  // .m_axis_result_tdata(x_f)
  // );
    
// fix_float fix_float1(
  // .aclk(clk),
  // .aresetn(rst_n),
  // .s_axis_a_tvalid(1'b1),
  // .s_axis_a_tready(1'b1),
  // .s_axis_a_tdata(y),
  // .m_axis_result_tvalid(1'b1),
  // .m_axis_result_tready(1'b1),
  // .m_axis_result_tdata(y_f)
  // );
  
// fix_float fix_float2(
  // .aclk(clk),
  // .aresetn(rst_n),
  // .s_axis_a_tvalid(1'b1),
  // .s_axis_a_tready(1'b1),
  // .s_axis_a_tdata(z),
  // .m_axis_result_tvalid(1'b1),
  // .m_axis_result_tready(1'b1),
  // .m_axis_result_tdata(z_f)
  // );
  
// fix_float fix_float3(
  // .aclk(clk),
  // .aresetn(rst_n),
  // .s_axis_a_tvalid(1'b1),
  // .s_axis_a_tready(1'b1),
  // .s_axis_a_tdata(X),
  // .m_axis_result_tvalid(1'b1),
  // .m_axis_result_tready(1'b1),
  // .m_axis_result_tdata(X_f)
  // );
  
// fix_float fix_float4(
  // .aclk(clk),
  // .aresetn(rst_n),
  // .s_axis_a_tvalid(1'b1),
  // .s_axis_a_tready(1'b1),
  // .s_axis_a_tdata(Y),
  // .m_axis_result_tvalid(1'b1),
  // .m_axis_result_tready(1'b1),
  // .m_axis_result_tdata(Y_f)
  // );
  
  // fix_float fix_float5(
  // .aclk(clk),
  // .aresetn(rst_n),
  // .s_axis_a_tvalid(1'b1),
  // .s_axis_a_tready(1'b1),
  // .s_axis_a_tdata(T1),
  // .m_axis_result_tvalid(1'b1),
  // .m_axis_result_tready(1'b1),
  // .m_axis_result_tdata(t1_f)
  // );
    
// fix_float fix_float6(
  // .aclk(clk),
  // .aresetn(rst_n),
  // .s_axis_a_tvalid(1'b1),
  // .s_axis_a_tready(1'b1),
  // .s_axis_a_tdata(T2),
  // .m_axis_result_tvalid(1'b1),
  // .m_axis_result_tready(1'b1),
  // .m_axis_result_tdata(t2_f)
  // );
  
//sub
// float_sub float_sub1(
  // .aclk(clk),
  // .aresetn(rst_n),
  // .s_axis_a_tvalid(1'b1),
  // .s_axis_a_tready(1'b1),
  // .s_axis_a_tdata(x_f),
  // .s_axis_b_tvalid(1'b1),
  // .s_axis_b_tready(1'b1),
  // .s_axis_b_tdata(X_f),
  // .m_axis_result_tvalid(1'b1),
  // .m_axis_result_tready(1'b1),
  // .m_axis_result_tdata(sum0_x)
  // );

// float_sub float_sub2(
  // .aclk(clk),
  // .aresetn(rst_n),
  // .s_axis_a_tvalid(1'b1),
  // .s_axis_a_tready(1'b1),
  // .s_axis_a_tdata(y_f),
  // .s_axis_b_tvalid(1'b1),
  // .s_axis_b_tready(1'b1),
  // .s_axis_b_tdata(Y_f),
  // .m_axis_result_tvalid(1'b1),
  // .m_axis_result_tready(1'b1),
  // .m_axis_result_tdata(sum0_y)
  // );

运行结果及详细报错内容

资源占用很低,lut和ram的占用只有2%,但是power直接上天

我的解答思路和尝试过的方法,不写自己思路的,回答率下降 60%

尝试注释调用浮点数的ip内核,power一下就下去了,是不能调用这么多次数的ip内核吗?还是操作的浮点数位数太多?

我想要达到的结果,如果你需要快速回答,请尝试 “付费悬赏”

回答不易,求求您采纳点赞哦
在FPGA上使用浮点计算实现两点间的距离公式,可以按照以下步骤进行:

  • 在您的 FPGA 设计工具中创建一个新项目,例如 Xilinx Vivado 或 Altera Quartus。
  • 将浮点 IP 内核添加到您的项目中。这将为浮点计算提供必要的硬件资源。
  • 为您的设计创建一个新的 RTL(寄存器传输级)模块。该模块将包含计算两点之间距离的逻辑。
  • 在您的 RTL 模块中,为第一个点的 x 和 y 坐标定义两个输入端口,为第二个点的 x 和 y 坐标定义两个输出端口。
  • 在 RTL 模块内部,使用浮点 IP 内核使用以下公式计算两点之间的距离:

distance = sqrt((x2 - x1)^2 + (y2 - y1)^2)

  • IP 内核将提供执行平方根和功率计算所需的功能。
  • 将 RTL 模块的输入和输出端口分别连接到浮点 IP 内核的输入和输出端口。
  • 综合和实现您的设计,并生成一个比特流文件来对您的 FPGA 进行编程。
  • 要调用 IP 内核并执行距离计算,您可以使用 FPGA 设计工具提供的 API。例如,在 Vivado 中,您可以使用Xil_Out32和Xil_In32函数写入和读取 IP 内核的寄存器。

下面是一个示例,说明您如何使用浮点 IP 核来使用 Vivado 计算 FPGA 上两点之间的距离:

module distance_calculator(
  input wire [31:0] x1, y1, // Coordinates of first point
  output wire [31:0] x2, y2, // Coordinates of second point
  input wire clk,
  input wire reset
);

  // Declare intermediate signals
  wire [31:0] difference, squared_difference;

  // Instantiate floating-point IP core
  fp_add_sub_dp #(
    .OPERATION("ADD")
  ) adder (
    .A(x2 - x1),
    .B(y2 - y1),
    .R(difference)
  );

  fp_mul_dp #(
    .DIN_WIDTH(32),
    .DOUT_WIDTH(32)
  ) multiplier (
    .A(difference),
    .B(difference),
    .R(squared_difference)
  );

  fp_sqrt_dp #(
    .DIN_WIDTH(32),
    .DOUT_WIDTH(32)
  ) square_root (
    .A(squared_difference),
    .R(distance)
  );

endmodule

此代码定义了一个名为distance_calculator第一个点坐标的输入端口和第二个点坐标的输出端口的模块。它还为差值和平方差声明中间信号,并实例化浮点 IP 内核的三个实例adder、multiplier和square_root,以执行必要的计算,使用公式 计算两点之间的距离distance = sqrt((x2 - x1)^2 + (y2 - y1)^2)。

要调用此模块并执行距离计算,您可以使用Xil_Out32和Xil_In32函数将输入坐标写入输入端口并从输出端口读取输出坐标。例如:

#include "xil_io.h"

// ...

// Write input coordinates to module
Xil_Out32(XPAR_DISTANCE_CALCULATOR_0_BASEADDR + 0, x1);
Xil_Out32(XPAR_DISTANCE_CALCULATOR_0_BASEADDR + 4, y1);

// Wait for calculation to finish
while (Xil_In32(XPAR_DISTANCE_CALCULATOR_0_BASEADDR + 8) == 0) { }

// Read output coordinates from module
x2 = Xil_In32(XPAR_DISTANCE_CALCULATOR_0_BASEADDR + 12);
y2 = Xil_In32(XPAR_DISTANCE_CALCULATOR_0_BASEADDR + 16);

此代码将输入坐标写入distance_calculator模块的输入端口,并通过检查状态寄存器等待计算完成。计算完成后,它会从输出端口读取输出坐标。