【问题标题】:Programming on an FPGA device在 FPGA 设备上编程
【发布时间】:2014-03-20 10:44:24
【问题描述】:

我正在尝试学习一些关于 FPGA 卡的知识,但我对这个主题非常陌生。我更像是一名软件开发人员,并没有真正的 FPGA 设备编程经验。

我目前正在使用 C 语言在 linux 操作系统上构建一个项目。我想知道如何在 FPGA 设备上实现这样的代码。为此,我有几个问题。

首先,我必须将我的代码翻译成 VHDL 还是可以使用 C?另外,如何在 FPGA 卡上安装操作系统,是否有设备已经安装了操作系统?

对于新手类型的问题,我们深表歉意,我们将不胜感激!

【问题讨论】:

  • 对 FPGA 进行编程与传统编程非常不同。当您对 FPGA 进行编程时,没有寄存器、指令甚至顺序执行的概念(您基本上是自己实现它们)。您无法轻松地将 C 转换为 VHDL。
  • 是否可以在 FPGA 设备上实现我的代码?
  • 你想在 FPGA 上构建什么?
  • @tangrs 我正在尝试在 FPGA 上构建 C 可执行文件

标签: c operating-system fpga


【解决方案1】:

FPGA 擅长通过并行处理运行简单、固定的数据流,而 CPU 针对复杂和/或动态数据流进行了优化。

C 语言不是为描述高度并行的系统而设计的,因为它遵循明显的顺序模式(“将a 分配给b,然后将c 添加到d”);虽然编译器引入了一些并行化作为优化,但重点是生成代码,其行为就像指令被顺序化一样。

另一方面,在 FPGA 中,您希望尽可能分解序列并创建并行电路和流水线,因此通常以互连块的形式描述系统,其中每个块都尽可能简单.

例如,如果您有(a+b)*(c+d),则基于 CPU 的设计可能只有一个加法器,首先输入 ab,然后输入 cd,最后通过两者乘数的结果。

在 FPGA 设计中,这是相当昂贵的,因为您必须创建一个状态机来跟踪我们处于三个计算阶段中的哪一个以及保存结果的位置,因此拥有两个专用的可能更容易加法器分别硬连线到ab,以及cd,并将它们的输出连接到乘法器块。

此时,您基本上已经创建了一个专用机器,可以计算这一项,但它的速度仅受构成逻辑门的晶体管速度的限制,并且与您获得的状态机相比速度至少提高了三倍(因为我们现在只有一个状态/指令),可能更多,因为我们还可以丢弃存储中间结果的逻辑。

为了决定何时创建状态机/处理器以及何时对计算进行硬编码,编译器必须比 C/C++ 更了解程序流程和时序要求,因此这些语言不是不错的选择。

这样的操作系统看起来也大不相同。没有资源可以动态仲裁,所以这部分就省略了,剩下的就是设备驱动了。由于一切都是并行的,因此它们采用外部模块的形式,这些模块简单地链接到您的设计中,并直接进行接口。

如果您刚刚开始,我建议您购买带有几个 LED 的 development kit,并从基本功能开始:

  1. 让 LED 闪烁
  2. 使用系统库中的 PLL 模块派生辅助时钟,并使 LED 以不同的频率闪烁
  3. 添加一个简单的总线接口,例如SPI,并与简单的外部设备通信,例如一个基于 WS2811 的 LED 灯条

在您对系统的工作原理有了基本的了解后,尝试获得一个可以工作的模拟环境(相当于 Debug 构建),并开始包含更复杂的外围设备。

【讨论】:

  • 感谢您的详细描述!
【解决方案2】:

听起来您可以使用初学者教程。我建议从这里开始阅读introduction to digital design。您应该通过阅读这些教程来回答您的一些基本问题。这将使您在未来可以更好地提出更具体的问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-22
    • 1970-01-01
    • 2012-06-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多