Bir FPGA için Tasarım, bir Donanım Tanımlama Dili (HDL) gerektirir. HDL'ler kesinlikle C gibi hiçbir şey değildir. Bir C programının sıralı bir talimatlar dizisi olduğu ve paralel yürütmeyi sağlamak için kendisini çarpıtması gerektiğine rağmen, bir HDL eşzamanlı bir devreyi açıklar ve sıralı yürütmeyi elde etmek için kendisini çarpıtması gerekir. Bu çok farklı bir dünya ve bir yazılım geliştiricisi gibi düşünürken FPGA'de bir devre kurmaya çalışırsanız zarar görecektir.
Bir MCU zaman sınırlıdır. Daha fazla iş başarmak için daha fazla işlemci döngüsüne ihtiyacınız var. Saatlerin frekansları için gerçek sınırları var, bu yüzden bilgisayarlı bir duvara çarpmak çok kolay. Ancak, bir FPGA alanı sınırlıdır. Daha fazla iş yapmak için, yalnızca daha fazla devre eklersiniz. FPGA'nız yeterince büyük değilse, daha büyük bir tane satın alabilirsiniz. En büyük FPGA'ya sığamayan bir devre oluşturmak çok zordur ve bunu yapsanız bile FPGA'ların birlikte nasıl zincirleneceğini açıklayan uygulama notları vardır.
FPGA'lar paralel yürütmeye daha fazla odaklanır. Bazen, MCU’nuzun ISR’sinin bu kesintiye hizmet etmesi için ne kadar zaman alacağı ve zor gerçek zamanlı limitlerinizi elde edip edemeyeceğiniz konusunda endişelenmelisiniz. Bununla birlikte, bir FPGA'da her zaman çalışan çok sayıda Sonlu Durum Makinesi (FSM) vardır. "Femto-kontrolörleri" gibidirler, küçük kontrol mantığı bulutları gibi. Hepsi aynı anda çalışıyor, bu yüzden bir ara vermeyi kaçırmaktan endişe duymuyorsunuz. Bir ADC'ye arabirim için bir FSM, bir mikrokontrolörün adres / veri yoluna arabirim için başka bir FSM, bir stereo kodeğe veri akışı için başka bir FSM, ADC'den kodek için veri akışını tamponlamak için başka bir FSM olabilir ... Tüm FSM'lerin uyum içinde şarkı söylediğinden emin olmak için bir simülatör kullanmanız gerekir.
FPGA'lar bir PCB düzeni tasarımcısının ıslak rüyasıdır. Son derece yapılandırılabilirler. Çok farklı mantık arayüzlerine (LVTTL, LVCMOS, LVDS, vb.), Değişken gerilimlere ve hatta sürücü güçlerine sahip olabilirsiniz (böylece seri sonlandırma dirençlerine gerek yoktur). Pimler değiştirilebilir; pinlerin çipin etrafına dağıldığı bir MCU adres veriyolu gördünüz mü? PCB tasarımcınız muhtemelen tüm sinyalleri doğru bir şekilde birleştirmek için bir sürü viyana düşürmek zorunda. Bir FPGA ile, PCB tasarımcısı daha sonra sinyalleri uygun olan herhangi bir sırayla çip içine aktarabilir ve daha sonra tasarım FPGA alet zincirine geri eklenebilir.
FPGA'larda ayrıca çok hoş, süslü oyuncaklar var. Favorilerimden biri, Xilinx çiplerindeki Dijital Saat Yöneticisi. Bir saat sinyalini beslersiniz ve çok çeşitli frekans çarpanları ve bölücüler kullanarak dört% 'den daha fazla türetebilir, hepsi saf% 50 iş çevrimi ve% 100 faz fazında bile olabilir. yonganın dışına yayılma gecikmelerinden doğar!
EDIT (ekine cevap):
Bir FPGA'ya "yumuşak bir çekirdek" yerleştirebilirsiniz. Kelimenin tam anlamıyla bir mikrodenetleyici devresini birbirine bağlıyorsunuz veya daha doğrusu Xilinx'in PicoBlaze veya MicroBlaze veya Altera'nın Nios'u gibi başka birinin devresini tasarımınıza düşürüyorsunuz. Fakat C-> VHDL derleyicileri gibi, bu çekirdekler de bir FSM ve veri yolu veya gerçek bir mikrodenetleyici kullanmaya kıyasla biraz şişirilmiş ve yavaş olma eğilimindedir. Geliştirme araçları ayrıca, FPGA'lar zaten son derece karmaşık çipler olduğunda, kötü bir şey olabilen tasarım sürecine önemli bir karmaşıklık ekleyebilir.
İçlerinde gömülü "sert çekirdeğe" sahip bazı FPGA'lar da var, Xilinx'in çevresinde FPGA kumaşlı gerçek, özel bir IBM PowerPC'ye sahip Virtex4 serisi gibi.
EDIT2 (Yoruma cevap):
Sanırım şimdi görüyorum ki, ayrık bir MCU’yu bir FPGA’ya bağlamayı soruyorsunuz; yani iki ayrı çip. Bunu yapmak için iyi nedenler var; Sert çekirdekli olan ve iyi yumuşak çekirdeği destekleyecek kadar büyük olan FPGA'lar, genellikle bir PCB tasarlama zorluğunu 10'luk bir faktörle kolayca artıran bir BGA paketi gerektiren yüzlerce iğneye sahip canavarlardır.
C, çok daha kolaydır, bu yüzden MCU'lar kesinlikle bir FPGA ile aynı hizada çalışmaktalar. C yazmak daha kolay olduğu için, MCU’da “beyinleri” veya merkezi algoritmayı yazabilirsiniz, FPGA ise hızlandırılması gerekebilecek alt algoritmaları uygulayabilir. Değişen şeyleri C koduna koymaya çalışın, çünkü değiştirmesi daha kolaydır ve FPGA'yı sık sık değişmeyecek daha özel tür şeyler olarak bırakın.
MCU tasarım araçlarının kullanımı da daha kolaydır. Tasarım araçlarının FPGA bit dosyasını oluşturması, birkaç basit tasarım için bile olsa birkaç dakika sürer, ancak karmaşık MCU programları genellikle birkaç saniye sürer. MCU'da yanlış giden çok daha az şey var, bu yüzden hata ayıklamaları daha kolay ... FPGA'ların ne kadar karmaşık olabileceğini anlayamıyorum. Elinizde olanın veri sayfasını almanız gerekiyor ve her sayfasını okumayı denemelisiniz. Biliyorum, birkaç yüz sayfa ... yine de yap.
Onları bağlamanın en iyi yolu, harici bir adres ve veri yolu olan bir MCU kullanmaktır. Daha sonra FPGA devrelerini MCU’ya kaydedebilir ve her biri kendi adreslerine sahip olan kendi “kayıtlarınızı” ekleyebilirsiniz. Şimdi FPGA, 8 bitlik okumalar arasındaki taşmaları önlemek için ilk byte okunduğunda 4 baytın tümünü aynı anda tutabilen 32 bitlik bir zamanlayıcı gibi özel çevre birimleri ekleyebilir. Ayrı bir ADC gibi, diğer yongalardan daha fazla çevre birimini hafızaya almak için yapıştırıcı mantığı olarak da kullanabilirsiniz.
Son olarak, bazı MCU'lar, FPGA gibi bir "harici ana" ile kullanım için tasarlanmıştır. Cypress, içinde 8051 olan birkaç USB MCU'su üretiyor ancak bunun amacı, örneğin bir FPGA tarafından üretilen / tüketilen USB verilerinin kullanılmasıdır.