FPGA (veya Alan Programlanabilir Kapı Dizisi), üretim sonrası yeniden programlanabilen bir entegre devredir. İsimde de belirtildiği gibi, FPGAlar, sahada yapılandırılabilen mantık kapıları (AND, OR, XOR vb.) dizilerinden oluşur (bununla ilgili daha fazla bilgi daha sonra verilecektir). Buna karşılık, sabit devreler, üretim sonrası değiştirilemeyen belirli işlevleri yerine getirmek üzere tasarlanmıştır.
Önceki makalemizde, FPGAlar ve FPGA Geliştirme Kartları hakkında detaylı bir tanıtım sağladık, bunların kullanımları ve faydaları hakkında bilgi verdik. FPGAlar hakkında daha fazla bilgi için FPGA ve FPGA Geliştirme Kartları – Nedir ve Ne için Kullanılır? başlıklı tanıtımımıza göz atabilirsiniz.
Bugün, FPGAların arkasındaki prensiplere ve onları elektronik dünyası için önemli kılan unsurlara daha fazla odaklanacağız.

FPGA Mimarisi
Bir FPGA, bir dizi yapılandırılabilir mantık bloğu ve I/O bloğu ile birlikte programlanabilir bağlantılardan oluşur. Ayrıca, her mantık bloğuna saat sinyalleri göndermek için saat devreleri taşır.

Yapılandırılabilir Mantık Blokları (CLB’ler)
FPGAlardaki mantık, yapılandırılabilir mantık bloklarında (veya CLB’lerde) depolanır.
CLB’leri, FPGA’yı oluşturan bireysel yapı taşları olarak düşünebiliriz. Bu yapı taşları, her biri belirli bir işlevi etkili ve verimli bir şekilde yerine getirmek üzere programlanmıştır. FPGAların bilinen çok yönlülüğü, çeşitli CLB’leri programlama ve bağlama esnekliğinden kaynaklanmaktadır!
Bir CLB, aşağıdakiler de dahil olmak üzere birkaç daha küçük bileşen içerir:
- Komplemantel mantık için arama tabloları (LUT’lar) oluşturmak için RAM
- Depolama için flip-flop veya kayıtlar
- İç ve dış mantığı yönlendirmek için çoklayıcılar
Modern FPGAlarda, her CLB, basit bir durum makinesi oluşturmak için yeterli mantık içerir.
Yapılandırılabilir I/O Blokları
Yapılandırılabilir I/O blokları, FPGA’ya giren ve çıkan giriş-çıkış sinyallerini yönetir.

Bu I/O blokları genellikle üç durumlu ve açık kolektör çıkış kontrollerine sahip bir giriş ve çıkış tamponuna sahiptir. Pull-up dirençleri genellikle çıkışlarda kullanılırken, pull-down dirençleri, dış ayrık dirençler olmadan sinyalleri veya veri yollarını sonlandırmak için kullanılabilir.
Ayrıca, çıkışta yapılandırabileceğimiz birçok şey vardır:
- Çıkış polaritesi aktif yüksek veya aktif düşük çıkış için programlanabilir
- Yavaş veya hızlı yükselme ve düşme süreleri için slew oranı programlanabilir
- Pinlere saatli sinyallerin düşük gecikmeli, doğrudan çıkışı için çıkışlarda flip-flop’lar
Programlanabilir Bağlantılar

Bağlantılar, CLB’leri birbirine bağlamak için kullanılır ve birbirinden uzak CLB’leri bağlamak için uzun hatlardan oluşur. Birbirine yakın CLB’leri bağlamak için ise kısa hatlar kullanılır. Bu hatlar, FPGA’daki anahtarlama matrisleri tarafından kontrol edilir ve istenen kombinasyona göre bu bağlantıları etkinleştirir veya devre dışı bırakır.
Saat Devreleri
Bir FPGA’nın saat devreleri, saat sürücüleri olarak bilinen yüksek sürüşlü saat tamponları ile özel I/O bloklarından oluşur. Saat sinyallerini global saat hatlarına iletirler.
Global saat hatları, üç durumlu tamponlardan oluşan özel olarak tasarlanmış uzun hatlardır. Düşük empedans ve düşük gecikmeli yayılma için özel olarak tasarlanmıştır.
Bu hatların saat tamponlarına ve CLB’lerdeki saatli elemanlara bağlı olduğunu tahmin edebilirsiniz. Bu, işlem zamanlamalarının FPGA boyunca eşleşmesini sağlar ve çipin farklı bölgelerinde farklı zamanlarda gelen saat sinyallerinin neden olduğu farklılıkları en aza indirir.
Mikrodenetleyici mi, FPGA mı?
Her gün etkileşimde bulunduğumuz tipik bilgisayarlar ve mikrodenetleyiciler, ASIC’ler (Uygulamaya Özel Entegre Devreler) taşıyan cihazlardır.
“Uygulamaya Özel” demek, tüm çalışma ömrü boyunca tek bir işlev için tasarlandıkları anlamına gelir. ASIC’lerin dijital devreleri ve dolayısıyla iç mantıkları, çipin silikonuna kalıcı olarak yerleştirilmiştir. Bu nedenle, ASIC’ler için yazılım, çipin talimat seti etrafında inşa edilmelidir.
Bir Örnek: Buton Tetikli LED
Bir butona basıldığında bir LED’in yanmasını istediğimizi varsayalım.
Arduino gibi bir mikrodenetleyicide, Arduino donanımının anladığı Arduino veya MicroPython’da bazı kodlar yazarız, böylece mevcut devreleri kullanarak işlevi yerine getirir. Donanım, butonun giriş pininde sürekli olarak girişi kontrol etmesi ve ardından LED durumunu buna göre güncellemesi için talimat alır.
Aynı işlevi bir FPGA üzerinde programlasaydık, giriş pininin durumunu kontrol etmemize gerek kalmazdı çünkü buton ve LED, kendi dijital devresi olarak doğrudan bağlanmış olurdu! Arduino mikrodenetleyicisi ile karşılaştırıldığında, bu, gerekli tüm ek talimatlarla birlikte kullanılan işlem gücünü ortadan kaldırır.
FPGA’nın Avantajı: Verimli ve Ölçeklenebilir
Paylaştığımız basit örnekte güç tasarrufu ve hız kazançları önemli olmasa da, süreçlerimiz çok daha karmaşık hale geldiğinde bunların kritik hale gelebileceğini hayal edebilirsiniz.
Ayrıca, FPGAlar, modüler CLB’lerden ve yapılandırılabilir bağlantılardan oluştuğu için, tek bir FPGA içinde birden fazla böyle devre oluşturabiliriz. FPGAların doğası gereği paralel olarak tanımlanmasının anlamı budur.
FPGA ile Başlamak
Artık FPGAları anladığınıza ve onlara yöneldiğinize göre, nasıl başlayacağınızı merak ediyor olabilirsiniz.
Öncelikle, FPGA4Student‘dan uyarlanan bir gösterimle başlayacağız; bu gösterim, bir tam toplayıcı devresinin FPGA’ya nasıl programlanabileceğini göstermektedir.
Devre tasarımımıza başlamak için, aşağıdaki gibi bir devre şeması edinmemiz gerekiyor. Devre tasarımında XOR, AND ve OR dijital mantık kapılarının kullanımına dikkat edin.
Devremizi karta programlamak için, yazılım programlamasına benzer şekilde, istediğimiz devreyi tanımlamak için bir HDL veya Donanım Tanım Dili kullanmamız gerekecek. İki popüler seçenek Verilog veya VHDL‘dir.
Verilog’daki Kod
module full_adder(input A,B,Ci, output S,Co); wire tmp1,tmp2,tmp3; xor u1(tmp1,A,B); and u2(tmp2,A,B); and u3(tmp3,tmp1,Ci); or u4(Co,tmp2,tmp3); xor u5(S,tmp1,Ci); endmodule
Kodun, devre şemasına göre devreyi basitçe tanımladığını görebiliriz – bu daha sonra FPGA kartımıza yüklenebilir.
Unutmayın ki, daha büyük karmaşıklık ile birlikte, FPGA tasarımlarımızın yüklenmeden önce titiz simülasyon ve test edilmesi gerekecektir. Yine de, basit bir devrenin bir HDL ile nasıl tanımlanabileceğini gördük.
FPGA Geliştirme Ortamı
FPGA programlamaya başlamak için birçok mevcut platform bulunmaktadır. Ancak, FPGA programlama ve prototipleme hala karmaşık bir süreçtir – bu da birçok geliştirme yazılımının karmaşık arayüzler ve araçlarla birlikte gelebileceği anlamına gelir ve bu durum bir acemi için bunaltıcı olabilir.
FPGA’lara yeniyseniz, kesinlikle Alchitry Labs‘ı denemelisiniz; bu platform, başlangıç dostu bir deneyim sunmaktadır. Ayrıca, Verilog tabanlı basitleştirilmiş ve daha kolay kullanılabilen bir HDL olan Lucid için destek de sunmaktadır.
Kendi FPGA Kartınızı Seçin!
FPGAların sunduğu büyük olanaklara dalmaya hazırsanız, başlamanız için aşağıdaki kartları öneriyoruz.
En Uygun Fiyatlı Kart: Sipeed Tang Nano FPGA Kartı – GW1N-1 FPGA ile Güçlendirilmiş

Sipeed Tang Nano FPGA kartı, meraklı başlangıçlar için çok iyi bir seçenektir. 5 doların altındaki düşük fiyatıyla, kart zengin I/O seçenekleri sunar ve bir sonraki adımınızı belirlemeden önce FPGA programlamasıyla tanışmanızı sağlar.
Ancak, kartın küçük boyutu nedeniyle, birikim veya çarpan zincirleme gibi karmaşık hesaplamaların mümkün olmayacağını unutmayın.
Python Uyumlu Kart: PYNQ™ Z2 Kartı – Xilinx Zynq C7Z020 SoC Tabanlı

PYNQ™ Z2 kartı, FPGA’ları açıkça bir HDL öğrenmeden keşfetmek istiyorsanız iyi bir seçenektir. Kart, Python programlama dili ve kütüphaneleri aracılığıyla programlanabilir mantığın yapılmasını sağlayan Xilinx’in açık kaynak projesi PYNQ tarafından desteklenmektedir.
En İyi Genel Amaçlı FPGA Kartı: Spartan Edge Accelerator Kartı – ESP32 ile Arduino FPGA Shield

Spartan Edge Accelerator Kartı, Arduino ve FPGA’nın avantajlarını birleştirerek geliştiricilere kapsamlı bir deneyim sunar. Kart, FPGA I/O’larını kontrol etmeyi sağlayan tam bir Arduino FPGA API ile desteklenmektedir ve bu, başlangıç dostu Arduino IDE ile yapılmaktadır.
Faydalı Öğrenme Materyalleri
FPGAlar çok yönlü olduğundan, öğrenilecek çok fazla bilgi ve teknik bulunmaktadır. Devre tasarımının temellerini daha iyi anlamak için Renesas’ın Dijital Devreler Serisi‘ni öneriyoruz.
Aksi takdirde, aşağıdaki FPGA çevrimiçi kurslarına ilginizi çekebilir:
- VHDL ve FPGA Geliştirme Temellerini Öğrenin – Udemy
- Intel’in Çevrimiçi FPGA Eğitim Müfredatı
- Başlangıçlar için FPGA & Verilog Öğrenimi – Numato
- Gömülü Sistemler için FPGA Tasarımına Giriş
Pek çok üniversite artık elektrik mühendisliği veya bilgisayar mühendisliği bölümleri için FPGA tasarımı üzerine resmi giriş ve ileri düzey dersler sunmaktadır.
FPGAlar ile yeniden yapılandırılabilir donanım zamanla daha da popüler hale geliyor. Üniversitede hala okuyan veya henüz gitmemiş olan değerli okuyucularımıza, çalışma planınıza FPGA bilgisi ve tasarım dersleri eklemenizi şiddetle tavsiye ediyoruz!
Özet
Bugünkü makalede FPGAlar hakkında daha fazla bilgi edinmiş olmanızı umuyoruz. FPGAlar korkutucu görünebilir, ancak giderek daha popüler hale geliyorlar ve öğrenmek kesinlikle sonunda buna değecektir!
Bir FPGA kartıyla ne yapacağınızdan emin değil misiniz? İlginç fikirler için Xilinx SEA-7 FPGA Proje Koleksiyonları – Xilinx Yaz Okulu’ndan‘na göz atın!
