主要内容

如何使用HDL优化归一化倒数

方法的使用方式和时间normalizedReciprocal函数和归一化倒数HDL优化块来计算输入的归一化倒数。

值的倒数可以有很大的范围,而与浮点类型相比,定点类型的范围有限。如果一个输入值u很小,那么1/u很大,如果u很大,那么1/u也很小。因此,1/u的定点式必须具有较高的精度和较大的范围,这需要较大的字长。

在应用程序中,一个倒数和另一个变量的乘积的范围是已知的,那么计算一个归一化倒数,乘以另一个变量,然后对最终输出应用移位是有效的。例如,在最小二乘应用程序中,在反向替换中需要除以主元。

计算归一化倒数

给定一个输入u,归一化倒数计算归一化倒数,y,和指数,e,以致于

(2 ^ e)。* y= 1./u,

而且

0.5 < |y| <= 1。

如果U = 0而且u那么,是定点的还是双比例的呢Y = 2 - eps(Y)

如果U = 0而且u是浮点类型吗Y =无穷

如果u ~ = 0,此函数返回的等价值

[y,e] = log2(1./abs(double(u))) y(u<0) = -y(u<0)

除了它只使用移位和加法来计算。

选择MATLAB函数或Simulink块金宝app

用于C代码生成和系统设计,使用MATLAB函数normalizedReciprocal.此函数不计算延迟。为了进行模拟,将函数编译成一个MEX文件,以便快速使用fiaccelbuildInstrumentedMex,或codegen

要生成优化的HDL代码,请使用规范化互惠HDL优化块。该块针对高密度脂蛋白的高吞吐量和小面积进行了优化,并在生成的高密度脂蛋白代码中模拟了相同的延迟。

块和函数产生相同的数值输出。

用MATLAB计算归一化倒数

计算定点输入的归一化倒数,u,然后将这个值与倒数的实际值进行比较。

U = fi([-pi,0.01,pi])
u = -3.1416 0.0100 3.1416 DataTypeMode:定点:二进制点缩放signdness: Signed WordLength: 16 FractionLength: 13
[y,e] = normalizedReciprocal(u)
y = -0.6367 0.7806 0.6367 DataTypeMode:定点:二进制点缩放signdness: Signed WordLength: 16 FractionLength: 14 e = 1x3 int32 row vector -1 7 -1
Computed_reciprocal = 2.^double(e)。*双(y)
Computed_reciprocal = -0.3183 99.9141 0.3183
Actual_reciprocal = 1./double(u)
actual_互惠= -0.3183 99.9024 0.3183

你可以看到规范化的倒数和实际倒数的值很接近。

为Simulink模型定义输入金宝app

定义一个定点输入,u,取使用normalized reciprocal HDL Optimized块的归一化倒数。

X = linspace(0.001,100,100);X = [fliplr(-x), X];U = fi(x,1,18);

规范化互惠HDL优化块的延迟时间

规范化倒数HDL优化块通过使用二进制搜索规范化输入来工作,它的延迟大约是输入单词长度的log2,后面是CORDIC倒数内核,其延迟大约与输入单词长度相同。

Normalized Reciprocal HDL Optimized块总是准备好接受数据。在初始延迟之后,每个样本都输出有效样本。样本中固定点输入的延迟u

D = ceil(log2(u.r ywordlength)) + u.r ywordlength + 5

你可以使用这个函数normalizedReciprocalLatency,包括在本例中,以计算具有定点、双数字或单数字类型的输入的延迟。

要将输入样本与Normalized Reciprocal HDL Optimized块的输出对齐,请使用延迟D在拖延中。

D = normalizedReciprocalLatency(u)
D = 28

运行归一化互惠Simulink模型金宝app

作为一个简单的例子,一个倒数和另一个变量的乘积的范围是已知的,计算一个值的归一化倒数并乘以它自己,所以最终的乘积应该等于1。即使输入值和倒数有很大的范围,值和倒数的乘积有一个已知的范围。

请注意u * y可以计算为与u因为0.5 < abs(y) <= 1,所以乘积的大小不会变大。

模型=“NormalizedReciprocalModel”;Open_system (model) out = sim(model);

分析归一化互反Simulink模型的结果金宝app

在下面的图中,您可以看到输入u和倒数1 / u有很大的范围,但是归一化倒数y在-1到1之间。

输入,u,是fi值的向量,取值范围为-100到100。

normalizedReciprocalPlot (1 u out.y、out.e out.z);

倒数的实际值,1 / u,与归一化倒数几乎相同,(2 ^ e)。* y.倒数1 / u具有较大的范围,这意味着要在固定点上计算直线倒数将需要具有高动态范围的数据类型(即大字长和大分数长度)。

normalizedReciprocalPlot (2 u out.y、out.e out.z);

归一化倒数,y,在范围内

0.5 < |y| <= 1

并且可以高效准确地存储在具有相同字长的数据类型中u.的数字类型y分数长度是否比单词长度小2u.这个额外的整数位确保了y可以为正或负,也可以精确地表示值-1和+1。

normalizedReciprocalPlot (3 u out.y、out.e out.z);

归一化指数,e,为输入的大小,u,呈反比关系。当u那么,大小是大的吗e是一个很大的负值。当u是接近于零的吗e是一个很大的正值。关系是

(2 ^ e)。* y= 1./u,
normalizedReciprocalPlot (4 u out.y、out.e out.z);

该模型乘以归一化倒数y通过输入u然后通过平移来缩放结果e.自y有一个幅度小于1,乘积可以做定点式的吗u.输出z = 2^e (y * u),近似等于1。

normalizedReciprocalPlot (5 u out.y、out.e out.z);

输出,z,由于使用定点数据类型计算归一化倒数,因此有一个小的舍入误差。

normalizedReciprocalPlot (6 u out.y、out.e out.z);