Verilog HDL ile Sayısal Tasarım II (Digital Design with Verilog HDL II)

watch_later 3/04/2016
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 ve Mikroişlemci Karşılaştırılması 
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ı


Kombinasyonel ROM'lar

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



ROM Haritalama Karnaugh Diyagram

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.
I/O Blocks: I/O Tamponlar ile FPGA ve dış dünya iletişim sağlanır. 


Egzersiz
LUT #1: F1 = D0’.D1’.D2’.D3’
LUT #7: F2 = F1.D4’.D5’ ↔ Z (OUTPUT)
LUT #8: F3 = D5  N (OUTPUT)
LUT #9: F4 = Z’.N’  P (OUTPUT)

Xlinix Vivado RTL Project Oluşturma Aşamaları

Level I

Level II
Level III
Level IV
Level V
Level VI
Decoder3x8.v
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



3x8 Decoder Simülasyonu





Bir sonraki yazımda görüşmek üzere...



sentiment_satisfied Emoticon