Alanda Programlanabilir Kapı Dizileri (Field
Programmable Gate Array (FPGA))
FPGA’ler
istenen fonksiyona göre iç yapısı kullanıcı tarafından değiştirilebilen
donanım-programlanabilir entegre devrelerdir. Tasarım
sırasında büyük esneklik sağlaması ve paralel işlem yapabilme kabiliyeti
sebebiyle FPGA kullanımı günümüzde oldukça yaygınlaşmıştır. FPGA
kullanımının artmasına bağlı olarak fiyatlarının düşmesi, gelişen teknoloji ile
birlikte FPGA'lerin kapasitelerinin artması, kullanıcıya büyük kolaylıklar sağlayan
gelişmiş tasarım programları ve örnek uygulamaların kolay erişilebilir hale
gelmesi FPGA’i günümüzde popüler yapan özelliklerdir.
Savunma
sanayi, sayısal işaret işleme, telekomünikasyon, tıbbi görüntüleme ve otomotiv
sanayi FPGA'lerin uygulama alanlarından bazılarıdır. FPGA'leri
programlamak için HDL (Hardware Description Language) kullanılır.
FPGA
ile mikroişlemci arasındaki en büyük ve temel fark FPGA’in donanımsal olarak
sabit bir yapıya sahip olmayıp kullanıcı uygulamasına göre programlanabilir
olmasıdır. İşlemciler ise sabit bir donanım yapısına sahiptir. Yani
içerisindeki tüm transistör, bellek, çevre birimi yapıları ve bağlantıları
sabittir. İşlemcinin yapabileceği işlemler (toplama, çarpma, I/O kontrol vb.)
önceden tanımlıdır.
FPGA’de
ise donanım yapısı sabit değildir ve kullanıcı tarafından tanımlanır. FPGA
içerisindeki mantık hücreleri sabit olmakla birlikte bunların gerçekleştirdiği
fonksiyonlar ve aralarındaki bağlantılar kullanıcı tarafından belirlenir.
Dolayısıyla FPGA’in yapabileceği işlemler önceden tanımlanmış değildir. HDL koduna göre istenilen işlemleri paralel olarak yaptırabilirsiniz. Paralel işlem yapabilme yeteneği FPGA’yi işlemciden ayıran
ve birçok alanda üstün kılan en önemli özelliklerdendir.
Artix 7 Blok Diyagramı |
F
|
A
|
B
|
C
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
1
|
0
|
0
|
1
|
0
|
1
|
0
|
1
|
1
|
0
|
1
|
0
|
0
|
1
|
1
|
0
|
1
|
0
|
1
|
1
|
0
|
1
|
1
|
1
|
1
|
ROM için Fonksiyon Haritalama
F
|
A
|
B
|
C
|
D
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
1
|
0
|
0
|
0
|
1
|
0
|
1
|
0
|
0
|
1
|
1
|
0
|
0
|
1
|
0
|
0
|
0
|
0
|
1
|
0
|
1
|
0
|
0
|
1
|
1
|
0
|
1
|
0
|
1
|
1
|
1
|
0
|
1
|
0
|
0
|
0
|
0
|
1
|
0
|
0
|
1
|
1
|
1
|
0
|
1
|
0
|
1
|
1
|
0
|
1
|
1
|
1
|
1
|
1
|
0
|
0
|
1
|
1
|
1
|
0
|
1
|
1
|
1
|
1
|
1
|
0
|
1
|
1
|
1
|
1
|
1
|
B\CD
|
00
|
01
|
11
|
10
|
0
|
0
|
0
|
1
|
0
|
1
|
0
|
0
|
1
|
0
|
F1=C.D
B\CD
|
00
|
01
|
11
|
10
|
0
|
0
|
0
|
1
|
1
|
1
|
1
|
1
|
1
|
1
|
F2=B+C
LUT (Look Up Table)
LUT FPGA temel yapı
taşıdır. 3x1 multiplexer ile iki farklı LUT elde edilebilir. Örneğin: 3 giriş için 3LUT kullanılabildiği gibi 4LUT da kullanılabilir. Tabi tasarımı daha iyi hale getirmek için, sentez araçları her zaman uygun LUT'u kullanılır. ROM, LUT arama tablosu olarak
kullanılabilir.
Bir
3LUT 3 giriş ve 1 çıkış
Bir
4LUT 4 giriş ve 1 çıkış
F
= A
F
= A.B.C.D
F
= A’.B’.C’.D + A’.B.C.D’ + A’.B’.C’.D’ + A’.B’.C.D
F
= A + B + C + D
F
= (A + B + C + D)(A’ + B’ + C’ + D’)
Bu fonksiyonların her biri tek bir 4LUT kullanılarak oluşturulabilir. LUT sayısı denklem karmaşıklığı ile bağlantılı değildir ancak benzersiz girdilerin sayısı LUT sayısını belirler.
3LUT ile Kapı Ağı Haritalama |
4LUT ile Kapı Ağı Haritalama |
FPGA İç Yapı Simülasyonu |
Programmable Logic Elements (LEs) |
Programmable Interconnect: Programlanabilir kablolama alanlarıdır.
Logic Blocks (Programmable Logic Elements (LEs)): FPGA bir(PLD) işlevi gerçekleştirmek için programlanabilir mantıksal bloklardır.
LUT #1: F1 = D0’.D1’.D2’.D3’ |
LUT #7: F2 = F1.D4’.D5’ ↔ Z (OUTPUT) |
LUT
#9: F4 = Z’.N’ ↔ P
|
Xlinix Vivado RTL Project Oluşturma Aşamaları
Level I
|
Level III |
Level IV |
Level V |
Level VI |
module Decoder3x8(D0,D1,D2,D3,D4,D5,D6,D7,A,B,C); input A,B,C; output D0,D1,D2,D3,D4,D5,D6,D7; assign D0=~A&~B&~C; assign D1=~A&~B&C; assign D2=~A&B&~C; assign D3=~A&B&C; assign D4=A&~B&~C; assign D5=A&~B&C; assign D6=A&B&~C; assign D7=A&B&C; endmodule
Decoder3x8_tb.v
module Decoder3x8_tb; reg a,b,c; wire d0,d1,d2,d3,d4,d5,d6,d7; Decoder3x8 dut(d0,d1,d2,d3,d4,d5,d6,d7,a,b,c); initial begin a=0;b=0;c=0; #10 a=0;b=0;c=1; #10 a=0;b=1;c=0; #10 a=0;b=1;c=1; #10 a=1;b=0;c=0; #10 a=1;b=0;c=1; #10 a=1;b=1;c=0; #10 a=1;b=1;c=1; #10 $finish; end endmodule