Floating point 如何在vhdl Quatus 2 16.1 Lite中使用sin、arcin函数?

Floating point 如何在vhdl Quatus 2 16.1 Lite中使用sin、arcin函数?,floating-point,vhdl,intel-fpga,Floating Point,Vhdl,Intel Fpga,我正在使用Quatus 2 Prime 16.1 Lite版本。 我想做的是:, 我已经编译了ieee\u建议的库下的float\u pkg\u c、fixed\u pkg\u c,如下面评论中的链接所示。我正在使用to_float将实变量转换为std逻辑向量,如下所示 phi_c <= to_std_logic_vector( to_float(phi_c_F, float32'high, -float32'low) ); 在建筑内部 PROCESS(clk_50,start_cal)

我正在使用Quatus 2 Prime 16.1 Lite版本。
我想做的是:, 我已经编译了ieee\u建议的库下的float\u pkg\u c、fixed\u pkg\u c,如下面评论中的链接所示。我正在使用to_float将实变量转换为std逻辑向量,如下所示

phi_c <= to_std_logic_vector( to_float(phi_c_F, float32'high, -float32'low) );
在建筑内部

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;    
过程(时钟50,启动校准)
变量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到-27);
开始
--rus:=8.98;
--r_c_F:=3.44;
--l_c_F:=5.67;
如果上升沿(clk_50)并开始校准'1',则
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*数学PI/60.0);
Ar_F:=数学PI*r_s*r_s;
F_c_F:=Pr_F*Ar_F;
ph_c_F:=arcin((r_c_F/l_c_F)*sin(r_rad_s_F*to_float(t,4,27));

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

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

但只需想想您似乎希望在代码中实现什么:

  • 2*浮点除法
  • 8*浮点乘法
  • 1*sin()
  • 1*arcin()
都在一个时钟周期内<代码>时钟50
似乎表示50 MHz。。。那是行不通的。你需要用管道把它接好

您希望在FPGA上实现的是高级功能。你真的需要知道你在做什么。请通过闪烁LED或其他方式简单启动


很可能您应该只在通用处理器上运行此代码,而不使用FPGA…

这也引出了一个问题,即为什么要尝试在UART中包含浮点。为什么要使用
std\u logic\u arith
?这是一个坏包裹。你应该只使用
numeric\u std
。我必须同意@JHBonarius的观点-你似乎在尝试一些非常困难的事情,当这行代码-
如果上升沿(clk\u 50)和开始cal='1',那么
-表明你是一个初学者。你为什么要这么做?你真的需要浮点吗?28年来,我一直在设计数字硬件,用于时断时续地接收无线电信号。有一个相当大的动态范围的要求-许多10分贝,但我从来没有需要浮点。您可以使用定点吗?从我所看到的,ALTERA_FP_函数适用于Arria 10,而您的板上有一个Cyclone 5。是的,我是在fpga上执行此类数学函数的新手。De0纳米Soc板中是否有可用于Altera的标准sin、cos、tan查找表?什么是CORDIC组件?你能在这里显示CORDIC vhdl文件的链接吗?我从来没有用vhdl编写过sin arcin函数,所以这对我来说很难,如果你能告诉我一个我将自己管理的源代码。@iopertyki请自己做一些研究。比如谷歌“CORDIC”。这是非常复杂的硬件设计;这不能用一个简单的链接来解释。verilog也是这样吗?@iopertyki你认为verilog和VHDL之间的区别是什么?在提问之前,你真的应该自己做一些调查。
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;