我使用的是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类型,隐含于上下文表达式
答案 0 :(得分:0)
根据您的代码和要求判断,您似乎并不了解FPGA的功能。 FPGA由一组可编程逻辑查找表和一些硬连线乘法器组成。除了最新一代Altera(例如Stratix 10)之外,这些乘法器仅定点并且在LUT中需要额外的逻辑来实现浮点类型的操作。此外,乘法器仅提供有限的精度:~18位。
您似乎需要完全浮点精度(64位)并执行非常复杂的操作,如除法和三角函数(sin / arcsin)。实现这些功能需要很多逻辑。甚至没有在float_pkg
库中实现三角函数。您可能必须使用类似CORDIC的组件来实现这样的功能。
但请考虑一下您似乎希望在代码中实现的目标:
所有在一个时钟周期内! clk_50
似乎表明50 MHz ......那不会起作用。你需要妥善管道。
您希望在FPGA上实现的是高级内容。你真的需要知道你在做什么。请从闪烁LED或其他东西开始。
您可能只需在通用处理器上运行此代码而不使用FPGA ......