设计用于实时采集和“控制”的系统架构

时间:2009-02-13 09:29:24

标签: f# real-time fpga architecture

要求的简要说明

(这里有很多好的答案,感谢所有人,如果我得到这样的飞行,我会更新。)

探测器沿着轨道运行,实时测量几个不同的物理参数(确定性),作为曲线距离的函数。用户可以在此过程中单击按钮以“标记”航点,然后使用GUI输入每个航点的详细信息(在人工时间,但在数据采集继续时)。

在此之后,系统对采集的数据执行一系列计算/过滤/修改,同时考虑为每个航路点输入的约束。该过程的输出是一系列校正,也是曲线距离的函数。

该过程的第三部分涉及再次沿轨道运行,但这次将校正写入校正轨道的物理系统(仍然是曲线距离的函数)。

我目前对您的输入/评论/警告的想法

我想确定的是我是否可以使用PC + FPGA执行此操作。 FPGA会进行“数据采集”,我会在PC上使用C#从缓冲区读取数据。航点信息可以通过WPF / Winforms应用程序输入,并存储在数据库/平面文件/任何待处理的“处理”中。

对于处理,我会使用F#。

FPGA将用于将信息“写入”物理机器。

我目前可以预见的一个问题是,处理算法是否需要采样频率,这会使数据量缓冲太大。这意味着将一些处理卸载到FPGA - 至少是不需要用户输入的位。不幸的是,唯一的预处理算法是卡尔曼滤波器,用我用Google搜索的方法很难用FPGA实现。

我会非常感谢您提供的任何反馈。

更新(此处及时添加额外信息)

在卡尔曼过滤器的入口处,我们每1ms看一次。但是在卡尔曼滤波器的另一侧,我们将每隔1米采样一次,我们所讨论的速度大约为2秒。

所以我想更准确的问题是:

  1. 在FPGA上实现Kalman filter - seems that it's可能,但我不了解任何一个可以解决的问题只是如此可能。

  2. 我也不确定卡尔曼的FPGA实现是否能够每1ms循环一次 - 尽管我认为它应该没问题。

  3. 如果我理解正确,那么FPGA就没有内存负载。对于该过程的第三部分,我将发送(大约)4 x 400双打数组用作查找表,这是否可行?

  4. 此外,在两个进程之间进行交换(读/写数据)意味着每次重新编程FPGA,还是可以指示在两者之间切换? (也许只能并行运行并忽略其中一个)。

  5. Another option我见过用Avalda FPGA Developer编译F#到VHDL,我想我很快就会尝试。

7 个答案:

答案 0 :(得分:3)

您没有提及您的目标,客户,预算,可靠性或截止日期,因此很难回答,但......

忘记FPGA。简化您的设计,开发环境和界面,除非您知道将通过其他解决方案满足您的实时要求。

如果您有预算,我首先要看看LabView。

http://www.ni.com/labview/

http://www.ni.com/dataacquisition/

LabView将在一台PC上为您提供数据采集系统和用户GUI。根据我的经验,开发人员不选择LabView,因为它不像一个“真正的”编程环境,但我肯定会推荐它来解决你所描述的问题。

如果您决定使用编译语言,那么我会将实时数据采集组件与RTOS隔离到嵌入式目标,最好是利用MMU进行调度和线程隔离并允许您写入C.如果你得到一个真正的RTOS,你应该能够真实地安排需要运行的进程,并且如果需要也能够调试它们!使用定义的接口使这个脱靶系统尽可能简单。使它足以获得您需要的数据。

然后,我将使用通用接口文件将接口实现回PC GUI进行维护。使用标准接口将数据传输到PC,例如USB2或以太网。 FTDI芯片非常适合这种情况。

答案 1 :(得分:2)

由于您沿着轨道移动,我必须假设采样频率不超过10 kHz。您可以轻松地以该速率将数据卸载到PC,甚至是12 Mb USB(全速)。

对于数学数据的认真处理,Matlab是可行的方法。但由于我没有听说过F#,我无法发表评论。

4 x 400双打没问题。即使是低端FPGA也有100%的kb内存。

您无需更改图像即可在读取和写入之间进行切换。这一直是在FPGA中完成的。

答案 2 :(得分:2)

这是一个建议。

转储FPGA概念。 获得TI的DSP评估板 选择一个有足够的gigaflops让你开心。 足够的RAM来存储您的工作集。

用C编程.TI提供一个小型RT内核。

它与PC通信,比如串口或以太网,无论如何。

它通过握手发送PC熟数据,因此数据不会丢失。 DPS中有足够的内存来存储您的数据,而PC则有高级时刻。

DSP没有性能问题。

实时位是实时的,具有MP的RAM。 处理速度很快,GUI不是时间关键的。

答案 3 :(得分:1)

您与PC的连接是什么?如果它是基于网络的连接,.Net将非常适合,因为您可以使用流来处理数据输入。

关于F#或任何涉及大数据集的函数式编程语言,我唯一警告你的是内存使用情况。它们很精彩并且在数学上可以证明,但是当你从多次递归中获得堆栈溢出异常时,这意味着你的程序将无法正常工作而且你会浪费时间和精力。

如果你需要开发一个GUI,那么C#会很棒,winforms和GDI +可以让你在没有巨大努力的情况下使用它。

向我们提供有关数据速率和连接的更多信息,也许我们可以提供更多帮助?

答案 4 :(得分:1)

Microsoft Robotics Studio中可能有一些有用的东西:link text,特别是对于实时方面。 CCR - 并发协调运行时已经有很多想法,模拟工具可以帮助您构建一个有助于分析的模型。

答案 5 :(得分:1)

听起来像你可以离线进行所有处理。如果是这种情况,那么离线是可行的方法。换句话说,将过程分为3个步骤:

  1. 数据采集
  2. 数据分析
  3. 基于数据分析的物理系统更正。
  4. 数据采集

    如果您无法使用标准界面收集数据,则可能需要使用自定义界面。很难说你是否应该在不了解更多关于界面的情况下使用FPGA。构建自定义界面非常昂贵,因此您应该进行权衡研究以选择方法。无论如何,如果这是基于FPGA的,那么保持FPGA简单并将其用于原始数据采集。使用当前的硬盘驱动器技术,您可以轻松存储100 GB的数据用于后期处理,因此将原始数据存储在磁盘驱动器上。如果你不需要,你甚至不想在FPGA中实现一维卡尔曼滤波器。

    数据分析

    一旦您获得了硬盘驱动器上的数据,您就有了很多数据分析选项。如果您已经知道F#,那么请使用F#。 Python和Matlab都有很多可用的数据分析库。

    这种方法还使测试数据分析软件变得比您必须实时进行所有处理的解决方案更容易。如果结果看起来不正确,您可以轻松地重新运行分析,而无需再次收集数据。

    物理系统更正

    获取数据分析的结果并沿着轨道运行探测器,再次通过接口卡为其提供适当的输入。

答案 6 :(得分:1)

我做了很多嵌入式工程,包括你所描述的混合系统。根据您需要处理的数据速率和大小,我怀疑您需要FPGA ......只需找到现成的数据采集系统即可插入您的PC。

我认为您遇到的最大问题与您的硬件API的语言绑定更相关。在过去,我不得不在C和汇编(甚至一些Forth)中开发大量软件,因为这是从硬件获取数据的最简单方法。