2016-03-07 211 views
0

我已经制作了一个Matlab程序,用于检测2个圆圈是否相互交叉并输出交叉点的坐标。现在,我试图将代码转换为vhdl来实现FPGA。使用HDL Workflow Advisor将matlab代码转换为vhdl

我的一个代码中的函数那里仍然是在HDL流程顾问的错误是:

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. 变量'theta'。不支持变量大小的数据。

一个小测试文件,模拟输入数据:

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

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

在工作流顾问我收到:可变大小数据不支持 - 错误1号线。

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

我想就如何正确地重写代码以使其准备好hdl这个简单的函数一些帮助。

预先感谢

回答

0

编码器抱怨因为你有两个输入端的可变以及可变大小输入(P1可以是2×2 1×2或)。你需要做的是编写你的功能,以便它需要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),则不需要任何预分配。

+0

那么,在其他函数中,我通过给它们默认值来初始化变量。但仍然发生相同的错误 – user3488736

+0

@ user3488736你是怎么做到的? MATLAB没有默认值的概念。 – Suever

+0

@ user3488736请将该代码放入您的问题中,而不是在您的评论中......我无法读取它 – Suever