我从事Arduino系列(特别是Sanguino)的工作,构建了一些简单的设备和一个简单的照像镜。因此,我对微控制器(特别是Atmel的)非常满意。我很想知道FPGA与标准微控制器有何不同。我来自技术背景(C / C ++编程),因此喜欢技术解答。请记住,我是电子领域的新手(相对于我的软件经验)。:)
我确实经过了此查询,这很好,但是我正在寻找更深入的细节。
谢谢!Sushrut。
我从事Arduino系列(特别是Sanguino)的工作,构建了一些简单的设备和一个简单的照像镜。因此,我对微控制器(特别是Atmel的)非常满意。我很想知道FPGA与标准微控制器有何不同。我来自技术背景(C / C ++编程),因此喜欢技术解答。请记住,我是电子领域的新手(相对于我的软件经验)。:)
我确实经过了此查询,这很好,但是我正在寻找更深入的细节。
谢谢!Sushrut。
Answers:
为FPGA设计需要硬件描述语言(HDL)。HDL绝对不像C一样。C程序是一系列顺序的指令,必须扭曲自身才能实现并行执行,而HDL描述了并发电路,并且必须扭曲自身才能实现顺序执行。这是一个截然不同的世界,如果您试图像软件开发人员那样在FPGA中构建电路,那将会很痛苦。
MCU有时间限制。为了完成更多的工作,您需要更多的处理器周期。时钟对其频率有非常严格的限制,因此很容易碰到计算壁垒。但是,FPGA受空间限制。为了完成更多工作,您只需添加更多电路。如果您的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还具有许多精美的玩具。我最喜欢的之一是Xilinx芯片中的Digital Clock Manager。您向它提供一个时钟信号,然后可以使用各种各样的倍频器和分频器从中获得四个信号,所有这些信号都具有原始的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,但其目的是通过例如FPGA来产生/使用USB数据。
“现实世界中的示例……结合了FPGA和微控制器?”
原则上,足够大的FPGA可以完成FPGA加微控制器可以完成的任何工作-也许可以通过在FPGA内部实现软CPU来完成。实际上,与单独的FPGA(或单独的MCU)相比,使用FPGA加单独的微控制器实现时,给定的性能水平通常具有较低的零件成本和更低的功耗。以下是一些同时带有FPGA和微控制器的著名器件:
通常,FPGA专门用于执行微控制器无法高效完成的任务,例如高度并行或低延迟的操作,在多个时钟域中运行或以硬件速度执行自定义逻辑。这样一来,它们就会很繁重,并且您几乎不需要MCU作为设计的核心-它们可能会移到管理位置,例如加载配置位流。一个例子是Minimig中的PIC或ARM ,它实现了存储接口。
但是,有些产品模糊了界限。一些例子:
来自命令式编程背景,这是对硬件设计的相当大的调整,因为您需要获得FPGA的优势。但是,您也会在其他地方找到有用的经验。
像AVR这样的MCU与编程到FPGA中的MCU之间并没有什么区别。OpenCores站点具有可在FPGA中使用的AVR的VHDL代码。您可以研究它,看看它是如何工作的,甚至无需购买合适的FPGA板就可以在模拟器中亲自尝试。