实现硬件高效的实数分割HDL优化
本示例演示如何使用嵌入在Simulink®模型中的硬件高效的MATLAB®代码执行实数除法。万博1manbetx本例中使用的模型适用于用于定点输入的HDL代码生成。该算法采用全流水线架构,适用于关注吞吐量的FPGA或ASIC设备。这种实现还明智地使用了可用的芯片资源,使其也适用于资源意识设计。
实数除法
两个实数的除法运算 而且 ,在那里 ,定义为 ,以致于 .
CORDIC算法
CORDIC是坐标旋转数字计算机的首字母缩写,可用于有效地计算许多三角函数、双曲函数和算术函数。有关CORDIC算法及其在三角函数计算中的应用的详细说明,请参阅使用CORDIC旋转核计算正弦和余弦.
全管道定点计算
Real Divide HDL Optimized块支持为具有二进制点缩万博1manbetx放的定点数据生成HDL代码。它在设计时就考虑到了这个应用程序,并采用了特定于硬件的语义和优化。其中一项优化是将整个内部电路流水线化,以保持非常高的吞吐量。
当将复杂的算法部署到FPGA或ASIC设备时,对于给定的计算,通常需要在资源使用和总吞吐量之间进行权衡。资源共享通常会减少设计所消耗的资源,但也会降低流程中的吞吐量。简单的算术和三角计算通常构成较大计算的一部分,需要高吞吐量来进一步驱动电路的设计。因此,完全流水线实现消耗更多的片上资源,但在大型设计中是有益的。
Real Divide HDL Optimized块中的所有关键计算单元都在内部完全流水线化。这不仅包括用于执行吉文斯旋转的CORDIC电路,还包括设计中其他地方使用的加器和移位器,从而确保最大吞吐量。
如何与真正的划分HDL优化块接口
由于其完全流水线的性质,Real Divide HDL Optimized块能够在任何周期(包括连续周期)上接受输入数据。函数将输入数据发送到块validIn
信号必须是真正的
.当块完成计算并准备发送输出时,它将发生变化validOut
来真正的
对于一个时钟周期。对于连续周期发送的输入,validOut
还会设置为真正的
在连续的循环中。分子和分母必须在同一个周期内一起发送。
打开模型并定义输入数据
要打开示例模型,在命令行输入:
mdl =“fxpdemo_realDivide”;open_system (mdl)
该模型包含Real Divide HDL Optimized块,该块连接到一个数据源,该数据源接收输入数组(分子和分母),并在连续的周期中将输入值从每个数组传递到块。为每个值计算的输出存储在工作空间变量中。处理完所有输入后,模拟结束。
定义输入数组realDivideNumerators
而且realDivideDenominators
.对于本例,输入是双精度变量。注意,分子和分母都应该具有相同的数据类型。
rng (“默认”);realDivideNumerators = 9*rand(1000,1) + 1;realDivideDenominators = 9*rand(1000,1) + 1;
定义要在模型中使用的输出数据类型。对于本例,输出也是双精度对象。注意,定点类型输出只能与定点类型输入一起使用。
OutputType =“双”;
模拟模型并检查输出
模拟模型。
sim (mdl);
当模拟完成时,一个新的工作空间变量,realDivideOutputs
,用于保存每对输入的计算值。
为了检查计算的错误,将Real Divide HDL Optimized块的输出与内置的MATLAB®除法函数的输出进行比较。
expectedOutput = realdividenumerator ./realDivideDenominators;actualOutput = realDivideOutputs;maxError = max(abs(expectedOutput - actualOutput))
maxError = 0