如何在 vhdl Quatus 2 16.1 Lite 中使用 sin、arcsin 函数?
How to use sin, arcsin functions in vhdl Quatus 2 16.1 Lite?
我使用的是 Quatus 2 Prime 16.1 Lite 版本。
我想做的如下,
我在 ieee_proposed 库下编译了 float_pkg_c,fixed_pkg_c 如下图 [=47= 】 在评论中。我正在使用 to_float 将实变量转换为标准逻辑向量,如下所示,
phi_c <= to_std_logic_vector( to_float(phi_c_F, float32'high, -float32'low) );
下面phi_c_F是一个变量,它是用math_real的sin,arcsin计算的 library.and 我发现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 出现错误,
Error (10511): VHDL Qualified Expression error at test_pipe.vhd(136):
ARCSIN type specified in Qualified Expression must match
UNRESOLVED_float type that is implied for expression by context
从你的代码和要求来看,你似乎没有意识到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...
我使用的是 Quatus 2 Prime 16.1 Lite 版本。
我想做的如下,
我在 ieee_proposed 库下编译了 float_pkg_c,fixed_pkg_c 如下图 [=47= 】 在评论中。我正在使用 to_float 将实变量转换为标准逻辑向量,如下所示,
phi_c <= to_std_logic_vector( to_float(phi_c_F, float32'high, -float32'low) );
下面phi_c_F是一个变量,它是用math_real的sin,arcsin计算的 library.and 我发现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 出现错误,
Error (10511): VHDL Qualified Expression error at test_pipe.vhd(136): ARCSIN type specified in Qualified Expression must match UNRESOLVED_float type that is implied for expression by context
从你的代码和要求来看,你似乎没有意识到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...