C 在FPGA器件上编程

C 在FPGA器件上编程,c,operating-system,fpga,C,Operating System,Fpga,我正在尝试学习一些关于FPGA卡的知识,我对这门学科非常陌生。我更多的是一个软件开发人员,没有实际的FPGA设备编程经验 我目前正在用C语言在linux操作系统上构建一个项目。我想知道如何在FPGA设备上实现这样的代码。为此,我有几个问题 首先,我必须将代码翻译成VHDL还是可以使用C?另外,如何在FPGA卡上安装操作系统,是否有已经安装了操作系统的设备 对于新手类型的问题,我们深表歉意,如果您有任何帮助,我们将不胜感激 FPGA非常擅长通过并行处理运行简单的固定数据流,而CPU则针对复杂和/或

我正在尝试学习一些关于FPGA卡的知识,我对这门学科非常陌生。我更多的是一个软件开发人员,没有实际的FPGA设备编程经验

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

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


对于新手类型的问题,我们深表歉意,如果您有任何帮助,我们将不胜感激

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

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

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

例如,如果您有
(a+b)*(c+d)
,基于CPU的设计可能会有一个加法器,首先向它输入
a
b
,然后输入
c
d
,最后将两个结果传递给乘法器

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

在这一点上,您基本上已经创建了一个专用机器,它可以计算这个单一项,而没有其他内容,但它的速度仅受构成逻辑门的晶体管的速度的限制,与状态机相比,您的速度至少增加了三倍(因为我们现在只有一个状态/指令),可能更多,因为我们还可以放弃存储中间结果的逻辑

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

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

如果您刚刚起步,我建议您使用带有几个LED的LED,并从基本功能开始:

  • 使LED闪烁
  • 使用系统库中的PLL块导出辅助时钟,并使LED以不同频率闪烁
  • 添加一个简单的总线接口,例如SPI,并与一个简单的外部设备进行通信,例如基于WS2811的LED条

  • 在您基本掌握了系统的工作原理之后,尝试获得一个工作模拟环境(相当于调试构建),并开始包括更复杂的外围设备。

    听起来您可以为初学者提供一个教程。我建议从这里开始,阅读一篇文章。你的一些基本问题应该通过阅读这些教程来回答。这将使您在将来更好地提出更具体的问题。

    对FPGA进行编程与传统编程非常不同。编程FPGA时,没有寄存器、指令甚至顺序执行的概念(基本上是自己实现的)。您不可能轻松地将C转换为VHDL。因此,是否可以在FPGA设备上实现我的代码?您试图在FPGA上构建什么?@tangrs我正在尝试在FPGAT上构建C可执行文件谢谢您的详细描述!