如何在vhdl Quatus 2 16.1 Lite中使用sin,arcsin函数?

时间:2017-06-26 15:00:14

标签: floating-point vhdl intel-fpga

我使用的是Quatus 2 Prime 16.1 Lite版本 我想做的事情如下, 我在 ieee_proposed 库下编译了 float_pkg_c,fixed_pkg_c ,如下面的评论链接所示。我正在使用 to_float 将实变量转换为std逻辑向量,如下所示,

phi_c <= to_std_logic_vector( to_float(phi_c_F, float32'high, -float32'low) );

下面的phi_c_F是一个变量,它将使用sin,arcsin of math_real library计算。我发现math_real中的运算符是非合成的,我希望xx.dddddddd 至少10个小数点 。 然后,phi_c通过Avalon内存映射(32位标准逻辑向量)发送到HPS系统。

在下面的代码中 pre_digital,rp是整数,是在另一个进程中计算的信号。

library ieee;
library ieee_proposed;
USE ieee.std_logic_1164.all;
use ieee.math_real.all;
use ieee.STD_LOGIC_ARITH.ALL;
use ieee.STD_LOGIC_UNSIGNED.ALL;
use ieee_proposed.float_pkg.ALL;
use ieee_proposed.fixed_pkg.ALL;
use ieee_proposed.fixed_float_types.ALL;

内部架构,

PROCESS(clk_50,start_cal)
variable Pr_F,rp_rad_s_F,F_c_F,ph_c_F,t_p_F,l_c_F,r_c_F,Ar_F,pre_R ,r_s: float (4 downto -27); 
BEGIN
--r_s := 8.98;
--r_c_F := 3.44;
--l_c_F := 5.67;
IF rising_edge(clk_50)  AND start_cal ='1'  THEN

pre_R           := to_float(pre_digital,4 ,27) ;       
Pr_F            := 3.3 * (pre_R / 65535.0);    
rpm_rad_s_F     := to_float(rp,4 ,27) * (2.0 * MATH_PI / 60.0);
Ar_F            := MATH_PI*r_s*r_s;
F_c_F           := Pr_F * Ar_F;             
ph_c_F          := arcsin((r_c_F / l_c_F) * sin(rp_rad_s_F *  to_float(t,4 ,27)));

ph_c_F_vctr  <= to_std_logic_vector(ph_c_F);
END IF;
END PROCESS;    

编译soc.system时出错,

  

错误(10511):test_pipe.vhd(136)处的VHDL合格表达式错误:   合格表达式中指定的ARCSIN类型必须匹配   UNRESOLVED_float类型,隐含于上下文表达式

1 个答案:

答案 0 :(得分:0)

根据您的代码和要求判断,您似乎并不了解FPGA的功能。 FPGA由一组可编程逻辑查找表和一些硬连线乘法器组成。除了最新一代Altera(例如Stratix 10)之外,这些乘法器仅定点并且在LUT中需要额外的逻辑来实现浮点类型的操作。此外,乘法器仅提供有限的精度:~18位。

您似乎需要完全浮点精度(64位)并执行非常复杂的操作,如除法和三角函数(sin / arcsin)。实现这些功能需要很多逻辑。甚至没有在float_pkg库中实现三角函数。您可能必须使用类似CORDIC的组件来实现这样的功能。

但请考虑一下您似乎希望在代码中实现的目标:

  • 2 *浮点除法
  • 8 *浮点乘法
  • 1 * sin()
  • 1 * arcsin()

所有在一个时钟周期内! clk_50似乎表明50 MHz ......那不会起作用。你需要妥善管道。

您希望在FPGA上实现的是高级内容。你真的需要知道你在做什么。请从闪烁LED或其他东西开始。

您可能只需在通用处理器上运行此代码而不使用FPGA ......