技术文章和通讯

建模和仿真如何将算法开发和SoC设计结合在一起

作者:Mark Corless和Eric Cigan, MathWorks


在本文中,您将了解建模如何帮助一个由算法和嵌入式软件工程师组成的小团队设计一个电机控制算法并在可编程的片上系统(SoC)上实现它。我们是这个团队的嵌入式工程师。我们将展示建模如何帮助我们划分设计、平衡功能行为与实现资源,以及在实验室中进行测试。

可编程soc,如Xilinx®Zynq®soc和英特尔®SoC fpga在同一芯片上结合了可编程逻辑和微处理器核心,为设计团队在广泛的应用中部署算法提供了新的平台,包括嵌入式视觉、通信、电机和电力电子控制。这些设计团队通常包括两类工程师:算法工程师,负责基于数学或基于规则的算法的概念开发和细化;嵌入式工程师,负责改进算法并在嵌入式设备的软件或硬件中实现它们。

算法工程师通常在开发过程的早期使用建模,以获得他们的算法在功能上是正确的应用程序的信心。另一方面,嵌入式工程师并不总是看到建模的好处。然而,当这些团队没有紧密合作时,结果可能是错误检测的延迟,导致项目延迟;过度使用资源;或者由于不充分的设计和测试迭代而损害了功能。

我们开始观察建模是否可以帮助算法和嵌入式工程师创建一个更高效和协作的设计过程。我们希望将重点放在可以通过模拟来探索的建模算法组件上。我们将使用模拟来帮助我们做出分区决策,使用模拟和代码生成来平衡功能行为与实现资源,并自动化生成代码和手工代码的集成和部署,以更有效地利用实验室时间。

提出了工作流

我们提出了一个混合了从模型生成的代码和手工代码的工作流。(在整篇文章中,我们将把设计的手工编码部分称为参考设计)。我们将从算法开发人员提供的模型开始,并通过添加实现细节迭代地细化模型。在每次迭代中,我们将模拟系统行为,以确保算法模型的功能正确性,通过代码生成实现算法,以获得行为与模型类似的代码,然后自动化与参考设计的集成,以确保实现硬件实现的可重复过程(图1)。

MBD_Figure_1_w.jpg
图1开发和部署电机控制算法到SoC的工作流程。

选择硬件平台

对于这个案例研究,我们决定使用场向控制(FOC)算法为永磁同步电机设计一个速度控制器,然后将其部署到Zynq-7000 All Programmable SoC Intelligent Drives Kit II(图2)。我们选择电机控制是因为它是一个算法工程师和嵌入式工程师经常需要一起工作的应用程序。我们选择了Zynq Intelligent Drives Kit II,因为它很容易获得,并且能够提供我们所需要的I/O支持。

Zynq Intelligent Drives Kit II带有可选测功机系统(来自Avnet Electronics Marketing)
图2。Zynq Intelligent Drives Kit II带有可选的测功机系统(来自Avnet Electronics Marketing)。

Zynq Intelligent Drives Kit II是一个开发平台,用于工程师测试运行在Zynq Z-7020 SoC设备上的电机控制算法。基于ZedBoard开发板,该工具包包括一个模拟设备FMC电机控制模块和24V无刷直流电机,配有1250循环/转编码器。因为我们想要在一系列操作条件下测试电机控制算法,所以我们使用了带有可选测功器系统的Zynq Intelligent Drives Kit II。

分区算法组件

在选择硬件平台之后,我们审查了算法工程师提供的初始系统仿真模型,并确定了部署到SoC所需的附加算法组件。该模型包括一种基于数据表参数的电机控制算法。该算法由外部速度控制回路调节内部电流控制回路组成。

虽然该模型捕获了控制器的核心数学,但它没有考虑到其他操作模式(禁用、开环和编码器校准)所需的外设(如ADC、编码器和PWM)或算法组件的影响。我们与算法工程师一起确定要建模的算法组件,并决定是在ARM上实现这些组件还是在SoC上实现可编程逻辑(图3)。

MBD_Figure_3_w.jpg
图3。算法组件的划分。

我们详细说明了初始系统模型,以包括新的算法组件(图4)。为了实现系统仿真,我们创建了与电机模型交互的现有外围设备的集总参数模型。例如,我们有编码器外围设备的现有HDL代码,我们计划在部署的设计中重用它们。编码器外围设备读取50兆赫的数字脉冲流,并将其转换为计数信号,由控制器算法在25千赫读取。如果我们直接建模这个脉冲流,我们将在系统模型中引入50 MHz的动态,并显著增加仿真时间。相反,我们创建了编码器的集总参数模型,该模型将电机模型中的理想转子位置转换为算法组件看到的编码器计数信号。在这种保真度的建模水平下,我们能够模拟测试编码器校准组件所需的启动条件,并引入位置量化效应来测试速度控制组件(图5),同时保持合理的模拟时间。

MBD_Figure_4_w.jpg
图4。系统仿真模型。
MBD_Figure_5_w.jpg
图5。标定编码器和步进速度命令的系统仿真结果。

我们选择在ARM上实现算法组件,如果它们需要几个kHz或更低的速率。由于我们计划运行Linux系统,所以设置了几个kHz速率的限制®ARM上的操作系统。需要更快速率的算法组件将在FPGA上实现。

我们希望尽可能在ARM上实现算法组件,因为我们发现在ARM上的设计迭代比在FPGA上更快。针对ARM核心的算法更容易,因为它支持原生浮点数学操作。大多数fpga执行浮点数学的效率很低,因此瞄准可编程逻辑需要额外的步骤,将算法转换为定点。此外,我们发现编译ARM的C代码的过程通常比编译FPGA的HDL代码快。

我们使用仿真来确定算法组件是否可以以ARM足够慢的速度执行,或者是否需要FPGA。例如,算法工程师最初提出了一个运行在25khz的编码器校准例程,这必须在FPGA上实现。我们使用模拟测试我们是否可以在1khz运行编码器校准组件,发现我们可以,并决定在ARM上实现它。

平衡功能行为和实现资源

一旦我们有了功能正确的模型和所需的组件速率,我们将所有用于C代码生成的组件分组到一个算法C模型中,将所有用于HDL代码生成的组件分组到一个算法HDL模型中(图6)。然后我们迭代地向模型和生成的代码添加实现细节,直到我们觉得它适合在可接受的内存数量内并以组件速率执行。

MBD_Figure_6_w.jpg
图6。控制器算法模型的C和HDL代码生成。

我们使用嵌入式编码器®从算法C模型生成C代码,并生成一个总结调用接口和估计数据内存使用情况的报告。在检查报告时,我们意识到所有的数据类型都是双精度浮点数。我们希望与FPGA接口的数据是整数或定点的,其余的数学运算是单精度浮点的。我们将这些数据类型应用到模型中,使用模拟来验证行为仍然是可接受的,然后生成改进的代码。在这一点上,我们有信心代码适合在ARM上实现。

由于定点运算在fpga上消耗的资源较少,因此我们将算法HDL模型实现为定点。为了实现这一点,我们与算法工程师合作,识别和绑定设计中的关键信号范围(电流、电压和速度),然后使用定点设计器™定义定点数据类型,以确保计算不会溢出。我们使用HDL Coder™来生成代码和总结报告。

我们检查了报告的资源估计部分,以确定似乎出乎意料地大的数学操作。例如,我们最初选择的字长导致了两个34位数的多次乘法,我们认为这将不必要地消耗FPGA资源。我们能够在资源利用报告中识别这个问题,降低模型中的精度,使用模拟来验证功能仍然是正确的,然后生成改进的代码。我们使用Xilinx Vivado®设计套件来合成代码并验证它是否满足时序要求。

实验室测试

一旦我们有了一个候选算法实现,我们就准备将它与参考设计集成起来。我们首先将生成的C函数与手工编码的ARM嵌入式项目手工集成,并将生成的HDL实体与手工编码的Vivado项目集成。然而,我们意识到,如果我们总是手动执行集成,我们将需要参与实验室中的每个设计迭代。我们使用此工作流的目标之一是使算法工程师能够在实验室中自动化集成和部署过程。

我们使用Xilinx Zynq-7000平台的HDL Coder支持包来注册我们手工编码的Vivado项目作为参考设计。然后,我们可以用手工代码自动集成生成的算法HDL代码,构建位流,并将其下载到FPGA。我们使用Xilinx Zynq-7000平台的嵌入式编码器支持包,将生成的算法C代码与Linux操作系统自动化集成,构建可执行文件,下载到ARM,并从Simulink与之交互®。支持包提供了AXI互连,使ARM核心中的算法组件与可编程逻辑之间能够通信。

在最初的系统设置期间,算法和嵌入式工程师在实验室一起工作是必不可少的。作为嵌入式工程师,我们必须设置部署配置并与算法工程师一起验证基本功能。一旦系统建立,算法工程师可以使用Simulink作为SoC的主要接口独立迭代设计。

算法工程师测试了部署的控制器,并确定它没有提供预期的响应。仿真结果与硬件结果的比较表明,我们计算的ADC计数到电流的映射是错误的。算法工程师创建了额外的测试,以更好地表征电机的转矩常数,并提高仿真与硬件之间的相关性(图7)。

MBD_Figure_7_w.jpg
图7。仿真结果与硬件结果比较。

仿真和硬件测试结果之间的高度相关性给了我们信心,我们可以在模型级别做出设计决策,并进一步减少实验室时间。例如,马达一度在实验室中旋转,但在某些条件下变得无法控制。我们从理论上认为,该问题与FPGA上实现的定点速度计算中的溢出有关。我们在模拟中再现了这个问题,并在关于电机最大速度的初始假设中发现了一个缺陷。我们能够在模拟中调试并解决问题,并且只使用实验室时间来验证更改。

这种方法的好处

这里描述的工作流使我们能够更有效地与算法工程师一起工作。通过仿真评估了算法分区对系统性能的影响,验证了编码器校准组件可以从高速率可编程逻辑分区转移到低速率ARM分区。

模拟还允许我们做出既节约实现资源又保持功能行为的决定,比如减少可编程逻辑中数学操作的字长,或者将通过AXI互连传递的数据从浮点数据类型转换为定点数据类型。最后,我们在实验室中的原型测试帮助我们识别了将ADC计数映射到电流的错误,并使我们的算法工程师能够运行进一步的测试来表征电机的转矩常数。

总的来说,工作流支持我们和算法工程师之间的紧密合作,在节约实验室时间的同时产生了更有效的实现。

想知道更多吗?

有关本文中描述的工作流的进一步详细信息,请查看永磁同步电机的磁场定向控制。这个Zynq电机控制示例包括Simulink模型和MATLAB®在我们的研究中用于运行模拟、生成代码、测试硬件并将模拟运行与硬件测试的结果进行比较的脚本。

如果您对原型化电机控制算法感兴趣,或者希望再现本文和示例中显示的结果,请了解更多关于Avnet Zynq智能驱动套件II来自Avnet电子营销。

要将Zynq电机控制示例扩展到Xilinx或Intel的不同硬件配置或不同类别的SoC fpga,请参考该示例定义和注册定制板和SoC工作流程参考设计

为了进一步了解如何使用Simulink生产PMSM和无刷直流电动机的精确模型,请查看本文为控制系统设计与验证建立电机的高保真模型

发布于2016 - 92977v00

Baidu
map