0

我制作了一个 Matlab 程序,它可以检测 2 个圆是否相互交叉并输出交叉点的坐标。现在,我正在尝试将代码转换为用于 FPGA 实现的 vhdl。

在我的代码中,HDL Workflow Advisor 中仍然存在错误的函数之一是:

function theta = angle2Points(p1,p2)
%ANGLE2POINTS Compute horizontal angle between 2 points
%
%   ALPHA = angle2Points(P1, P2),
%   Pi are either [1*2] arrays, or [N*2] arrays, in this case ALPHA is a 
%   [N*1] array. The angle computed is the horizontal angle of the line 
%   (P1 P2)
%   Result is always given in radians, between 0 and 2*pi.
%
%   See Also:
%   points2d, angles2d, angle3points, normalizeAngle, vectorAngle
%
%
% ---------

dp = zeros(1,2);
% angle of line (P2 P1), between 0 and 2*pi.
dp = p2 - (size(p2, 1) * p1)
theta = mod(atan2(dp(:,2), dp(:,1)) + 2*pi, 2*pi)

错误:

  1. 变量“p1”。不支持可变大小数据。
  2. 变量“p2”。不支持可变大小数据。
  3. 变量“θ”。不支持可变大小数据。

用一个小测试文件来模拟传入的数据:

% P = [x,y]
P1 = [0,3];
P2 = [5,10];
f=angle2Points(P1,P2);

P1 = [0,3];
P2 = [5,3];
f2=angle2Points(P1,P2

在 Workflow Advisor 中,我收到:不支持可变大小数据 - 第 1 行出现错误。

我理解这是因为像 C 这样的静态类型语言必须能够在编译时确定变量属性,而在 Matlab 中它是动态发生的。

我想要一些关于如何正确重写代码以使其准备好 hdl 的简单功能的帮助。

提前致谢

4

1 回答 1

0

Coder 抱怨,因为您有可变数量的输入以及可变大小的输入(P1可以是 2x2 或 1x2)。您需要做的是编写您的函数,以便它需要两者 p1p2并且它们是已知大小(1 x 2)。

function theta = angle2Points(p1, p2)    
    % angle of line (P2 P1), between 0 and 2*pi.
    dp = p2 - (size(p2, 1) * p1)
    theta = mod(atan2(dp(:,2), dp(:,1)) + 2*pi, 2*pi)
end

您还需要更新所有调用此函数的函数,以使它们兼容。

作为旁注,您不必预先分配变量,除非您将数据放入循环结构中。如果您只是一次分配整个变量(即dp上面),则不需要任何预分配。

于 2016-03-07T16:58:28.760 回答