How to send fixed point number to FPGA

时间:2015-05-12 23:44:16

标签: sdk floating-point vhdl xilinx fixed-point

I am using Vivado for Zedboard. I have my custom IP contains 32 bit input and output .I need to do some arithmetic operation with fixed point number too. But this fixed point number shall be sent from SDK to FPGA part. So my question is how to represent float_value = 0.2 as fixed point in SDK ?

2 个答案:

答案 0 :(得分:0)

正如here解释的那样,你可以"翻译"使用这个简单的代码定义一个定点数的浮点数(这只是一个例子,你可以使用很多不同的方式,我肯定比这个简单的方法更好):

#include <stdio.h>
typedef int Fixed;

#define FRACT_BITS 16
#define FRACT_BITS_D2 8
#define FIXED_ONE (1 << FRACT_BITS)
#define INT2FIXED(x) ((x) << FRACT_BITS)
#define FLOAT2FIXED(x) ((int)((x) * (1 << FRACT_BITS))) 
#define FIXED2INT(x) ((x) >> FRACT_BITS)
#define FIXED2DOUBLE(x) (((double)(x)) / (1 << FRACT_BITS))
#define MULT(x, y) ( ((x) >> FRACT_BITS_D2) * ((y)>> FRACT_BITS_D2) )

但你必须小心许多事情。一个与最终失去精确度有关(不是每次都是这样);在任何情况下,值的范围都是完全不同的,在FPGA中,您应该不再将数据作为float进行管理(例如,它意味着乘法以不同的方式完成,当然可以节省大量资源)。 之后,如果要将数据发送到FPGA,可以使用标准的AXI4接口。 我有一些关于m_axi接口和轴接口的例子:它是用于节省资源的常用方法,付出了失去计算精度的代价。你当然应该逐案评估。

答案 1 :(得分:-1)

首先,您需要定义固定点的精度。 假设您使用16位精度。

您将0.2表示为0.2 * 2 ^ 16并丢失每个十进制大小写。你基本上把数字向左移16次。

这是13107,2然后你会失去一切,所以13107或0x3333。