我在 Arduino 系列(特别是 Sanguino)上工作过,构建了一些简单的设备和一个简单的向光剂。因此,我对微控制器非常满意——尤其是 Atmel 的。我很想知道 FPGA 与标准微控制器有何不同。我来自技术背景(C/C++ 编程),因此会喜欢技术答案。请记住,我是电子领域的新手(相对于我的软件经验)。:)
我确实通过了这个查询,这很好,但我正在寻找更深入的细节。
谢谢!苏鲁特。
我在 Arduino 系列(特别是 Sanguino)上工作过,构建了一些简单的设备和一个简单的向光剂。因此,我对微控制器非常满意——尤其是 Atmel 的。我很想知道 FPGA 与标准微控制器有何不同。我来自技术背景(C/C++ 编程),因此会喜欢技术答案。请记住,我是电子领域的新手(相对于我的软件经验)。:)
我确实通过了这个查询,这很好,但我正在寻找更深入的细节。
谢谢!苏鲁特。
FPGA 设计需要硬件描述语言 (HDL)。HDL 与 C 完全不同。C 程序是一系列顺序指令,必须扭曲自身才能实现并行执行,而 HDL 描述并发电路,必须扭曲自身才能实现顺序执行。这是一个非常不同的世界,如果您尝试在 FPGA 中构建电路,同时像软件开发人员一样思考,那将会受到伤害。
MCU 是有时间限制的。为了完成更多的工作,您需要更多的处理器周期。时钟对其频率有非常实际的限制,因此很容易撞到计算墙。但是,FPGA 是空间有限的。为了完成更多的工作,您只需添加更多的电路。如果你的 FPGA 不够大,你可以买一个更大的。构建一个无法容纳在最大 FPGA 中的电路非常困难,即使您这样做了,也有描述如何将 FPGA 菊花链在一起的应用说明。
FPGA 更多地关注并行执行。有时您必须担心 MCU 的 ISR 需要多长时间来处理中断,以及您是否能够达到硬实时限制。然而,在 FPGA 中,有很多有限状态机 (FSM) 一直在运行。它们就像“毫微微控制器”,就像控制逻辑的小云。它们都同时运行,所以不用担心错过中断。您可能有一个 FSM 与 ADC 接口,另一个 FSM 与微控制器的地址/数据总线接口,另一个 FSM 将数据流式传输到立体声编解码器,还有另一个 FSM 将数据流从 ADC 缓冲到编解码器......你需要使用模拟器来确保所有 FSM 都能和谐地唱歌。
FPGA 是 PCB 布局设计师的梦想。它们非常可配置。您可以拥有许多不同的逻辑接口(LVTTL、LVCMOS、LVDS 等),它们具有不同的电压甚至驱动强度(因此您不需要串联终端电阻)。引脚可互换;你见过管脚分散在芯片周围的 MCU 地址总线吗?您的 PCB 设计人员可能不得不放弃一堆过孔,才能将所有信号正确连接在一起。使用 FPGA,PCB 设计人员可以以几乎任何方便的顺序将信号运行到芯片中,然后可以将设计回注到 FPGA 工具链中。
FPGA 也有很多漂亮、精美的玩具。我的最爱之一是赛灵思芯片中的数字时钟管理器。你给它一个时钟信号,它可以使用各种各样的倍频器和分频器从中得到四个,所有这些都具有原始的 50% 占空比和 100% 相位......它甚至可以解释时钟偏差来自芯片外部的传播延迟!
编辑(回复附录):
您可以将“软核”放入 FPGA。您实际上是将微控制器电路连接在一起,或者更确切地说,您可能会将其他人的电路放入您的设计中,例如 Xilinx 的 PicoBlaze 或 MicroBlaze 或 Altera 的 Nios。但就像 C->VHDL 编译器一样,与使用 FSM 和数据路径或实际的微控制器相比,这些内核往往有点臃肿和缓慢。开发工具还可以显着增加设计过程的复杂性,当 FPGA 已经是极其复杂的芯片时,这可能是一件坏事。
还有一些 FPGA 嵌入了“硬核”,例如 Xilinx 的 Virtex4 系列,它有一个真正的、专用的 IBM PowerPC,周围有 FPGA 结构。
EDIT2(回复评论):
我想我现在明白了……您问的是如何将分立的 MCU 连接到 FPGA;即两个独立的芯片。这样做有充分的理由;具有硬核的 FPGA 和大到足以支持体面的软核的 FPGA 通常是具有数百个引脚的怪物,最终需要 BGA 封装,这很容易将设计 PCB 的难度增加 10 倍。
不过,C 语言要容易得多,因此 MCU 肯定在与 FPGA 协同工作时占有一席之地。由于编写 C 更容易,您可以在 MCU 中编写“大脑”或中央算法,而 FPGA 可以实现可能需要加速的子算法。尝试将更改的内容放入 C 代码中,因为它更容易更改,并且让 FPGA 成为更专用的类型,不会经常更改。
MCU 设计工具也更易于使用。设计工具构建 FPGA 位文件需要几分钟,即使对于一些简单的设计,但复杂的 MCU 程序通常需要几秒钟。MCU 出错的可能性要小得多,因此它们也更容易调试……我不能低估 FPGA 的复杂程度。您确实需要获取您所拥有的数据表,并且您应该尝试阅读它的每一页。我知道,它有几百页......无论如何都要这样做。
连接它们的最佳方式是使用具有外部地址和数据总线的 MCU。然后,您可以简单地将 FPGA 电路内存映射到 MCU 中,并添加您自己的“寄存器”,每个寄存器都有自己的地址。现在 FPGA 可以添加自定义外设,例如 32 位定时器,它可以在读取第一个字节时立即锁存所有 4 个字节,以防止 8 位读取之间的溢出。您还可以将其用作粘合逻辑,以从其他芯片(例如单独的 ADC)中映射更多外设。
最后,一些 MCU 设计用于与 FPGA 等“外部主机”一起使用。赛普拉斯制造了一些内置 8051 的 USB MCU,但其目的是让 USB 数据由例如 FPGA 产生/使用。
“现实世界中的例子……将 FPGA 与微控制器相结合?”
原则上,一个足够大的 FPGA 可以做任何 FPGA 加微控制器可以做的事情——也许通过在 FPGA 内部实现一个软 CPU。在实践中,与单独使用 FPGA(或单独使用 MCU)相比,与单独使用 FPGA(或单独使用 MCU)相比,使用 FPGA 和单独的微控制器实施时,给定的性能水平通常具有更低的部件成本和更低的功耗。以下是一些比较著名的设备,板载 FPGA 和微控制器:
FPGA 通常专门用于完成微控制器无法高效完成的任务,例如高度并行或低延迟操作、在多个时钟域中操作或以硬件速度执行自定义逻辑。因此,他们将承担繁重的工作,并且您很少需要 MCU 成为设计的核心——它们可能会被移至管理位置,例如加载配置比特流。Minimig中的 PIC 或 ARM 就是一个例子,它实现了存储接口。
然而,一些产品模糊了界限。一些例子:
来自命令式编程背景,这是对硬件设计的相当大的调整,因为您需要获得 FPGA 的优势。但是,您会发现这种体验在其他地方也很有用。
像 AVR 这样的 MCU 和编程到 FPGA 中的 MCU 之间并没有真正的区别。OpenCores 站点有可用于 FPGA的 AVR 的 VHDL 代码。您可以研究它,看看它是如何工作的,甚至可以在模拟器中自己尝试,而无需购买合适的 FPGA 板。