萌新_咸鱼 2022-12-29 10:16 采纳率: 0%
浏览 21

调用浮点数计算的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内核吗?还是操作的浮点数位数太多?

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

1条回答 默认 最新

  • m0_57781768 2023-01-01 19:42
    关注

    回答不易,求求您采纳点赞哦
    在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模块的输入端口,并通过检查状态寄存器等待计算完成。计算完成后,它会从输出端口读取输出坐标。

    评论

报告相同问题?

问题事件

  • 创建了问题 12月29日

悬赏问题

  • ¥15 CSP算法实现EEG特征提取,哪一步错了?
  • ¥15 有没有什么插件可以批量爬取接码网站的验证码
  • ¥15 游戏盾如何溯源服务器真实ip?需要30个字。后面的字是凑数的
  • ¥15 vue3前端取消收藏的不会引用collectId
  • ¥15 有关类的报错,在模块里调用另一个模块的方法下的变量时出错
  • ¥15 delphi7 HMAC_SHA256方式加密
  • ¥15 关于#qt#的问题:我想实现qcustomplot完成坐标轴
  • ¥15 下列c语言代码为何输出了多余的空格
  • ¥15 kali linux用wget archive.kali.org/archive-key.asc指令下载签名无效(失败)
  • ¥15 openHarmony 利用c++程序在dayu210开发板上实现拉取RTSP视频流并且在屏幕上显示