如何在 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...