用浮点数计算实现两点之间的距离公式,直接调用的ip内核来完成计算
仿真实现之后发现资源占用率很低,但是功率上天,直接100w,温度125度
//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直接上天
尝试注释调用浮点数的ip内核,power一下就下去了,是不能调用这么多次数的ip内核吗?还是操作的浮点数位数太多?
回答不易,求求您采纳点赞哦
在FPGA上使用浮点计算实现两点间的距离公式,可以按照以下步骤进行:
distance = sqrt((x2 - x1)^2 + (y2 - y1)^2)
下面是一个示例,说明您如何使用浮点 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模块的输入端口,并通过检查状态寄存器等待计算完成。计算完成后,它会从输出端口读取输出坐标。