Laboratuvar Föy Kitapçığı
Transkript
Laboratuvar Föy Kitapçığı
O NDOKUZ M AYIS Ü N İVERS İTES İ B İLG İSAYAR M ÜHEND İSL İ Ğ İ B ÖLÜMÜ S AYISAL TASARIM L ABORATUVARI Föy Kitapçığı Düzenleyenler: Doç. Dr. Erdal KILIÇ Erdem ALKIM 12 Şubat 2013 Sayısal Tasarım Laboratuvar Föyü Giriş Bu dökuman Altera DE2-115 serisi FPGA geliştirme kitleri için hazırlanmış oniki deneyden oluşmaktadır. Bu deneyler öğrencilerin Sayısal Devreler ve Mantıksal Tasarım" dersini daha iyi anlayabilmeleri için ders müfredatına göre oluşturulmuştur. Deneyler Altera’nın Quartus II yazılımı kullanılarak gerçeklenmektedir. Bu yazılımın kullanımının anlatılması dersin müfredatı içinde bulunmamaktadır. Laboratuvara ait internet sitesinde DE2 geliştirma kitleri için Verilog HDL ile oluşturulmuş basit bir devrenin Quartus II yazılımında nasıl derleneceğini ve karta yükleneceğini anlatan bir doküman bulunmaktadır. Öğrenciler laboratuvara gelmeden önce Quartus II yazılımını edinmeli ve bu dokümanları inceleyip uygulamalıdırlar. Ayrıca deney kartları ve yazılımlar hakkında birçok ingilizce dokümana Altera’nın sitesinde University Program sayfasında Educational Materials linkinden ulaşılabilir. Deneyler Hakkında Deneyler DE2 geliştirme kitlerinin üzerindeki anahtarları kullanarak ledlerin yada 7-segment göstergelerin kontrol edilmesi gibi basit uygulamalarla başlamaktadır. Bu, öğrencilerin geliştirme kitini daha iyi tanımasını sağlayarak, aritmetik devreler, flip-floplar, sayaçlar, durum makineleri, hafıza birimleri ve basit işlemci gibi daha karmaşık tasarımları gerçeklemek için nasıl kullanacaklarını öğretir. Her deney birden çok uygulama içermektedir. Çoğu zaman bir önceki uygulamada oluşturuln devre bir sonrakinde kullanılmaktadır. Bu yapı öğrencilerin karmaşık devreleri küçük görevlere bölerek adım adım gerçeklemesini sağlamak amacıyla kullanılmıştır. i ii İçindekiler Lab1: Anahtarlar, Ledler, Multiplexerlar . . . . Lab2: Rakamlar ve Göstergeler . . . . . . . . Lab3: Mandallar, Flip-floplar, Kaydediciler . . Lab4: Sayaçlar . . . . . . . . . . . . . . . . . Lab5: Zamanlayıcılar ve Gerçek Zamanlı Saat . Lab6: Toplayıcı, Çıkarıcı ve Çarpıcılar . . . . . Lab7: Sonlu Durum Makinesi . . . . . . . . . Lab8: Hafıza Birimleri . . . . . . . . . . . . . Lab9: Basit İşlemci I . . . . . . . . . . . . . . Lab10: Basit İşlemci II . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . iii . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1 9 15 21 23 27 33 39 43 51 iv Laboratuvar Çalışması 1 Anahtarlar, Ledler ve Multiplexerlar Bu çalışmanın amacı, FPGA yongalarının giriş çıkışlarını yönetmek ve devreleri bu gürüş çıkışlara nasıl bağlayacağımızı öğrenmektir. Bu çalışmada anahtarları (SW17−0 ) giriş olarak, ledleri ve 7-segment göstergeleri çıkış olarak kullanacağız. Uygulama I DE2 serisi kartlar herhengi bir devreye giriş olarak kullanılabilinecek 18 tane anahtar (SW17−0 ) içerirler. Bunun yanında devrenin çıkışlarını görmek için kullanılabilinecek 18 tanede led (LEDR17−0 ) barındırırlar. Anahtarların durumlarını ledler ile gösteren bir Verilog Modülü Şekil 3 te gösterilmiştir. 18 seçici ve led olmasına rağmen Verilogda bunları tek bir vektör ile gösterebiliriz. Bununla birlikte bütün ledlere ayrı ayrı atamalarda yapabiliriz. assign LEDR[17] = SW[17]; assign LEDR[16] = SW[16]; ... assign LEDR[0] = SW[0]; DE2 serisi kartların üstündeki anahtar ve ledleri kullanmak için değişken tanımlamak yeterli değildir. Tanımladığımız değişkenleri FPGA’in DE2-series User Manual da verilen doğru pinlerine bağlamamız gerekir. Örnek olarak kullandığımız DE2-115 modelinde SW0 değişkenini FPGA’in AB28 ve LEDR0 değişkenini ise FPGA’de G19 pinine bağlamamız gerekmektedir. Doğru pin ataması yapmanın en güvenilir yolu Quartus II yazılımına DE2_115_pin_assignments.qsf dosyasını import etmektir. Böylece verilog kodunda LEDR0 değişkenini kullandığımızda otomatik olarak G19 pinine bağlanır. Quartus II programına pin_assignments dosyasını import etmek için;Import Assignments’a tıklandıktan sonra açılan Şekil 1’deki pencereden Advanced... butonuna tıklanır, açılan Şekil 2’deki pencereden ise Global assignments kutusu işaretlenip OK butonuyla kapatılır. Şekil 1: DE2-115 Import Assignments Penceresi. Burada önemli olan .qsf dosyasının kullanılması sadece pin isimlerinin verilog modülündeki portlarla tam olarak aynı olmasıyla yararlı olur. Bu yüzden Şekil 3’te olduğu gibi kolarımızda hep büyük harflerle kullanacağız. Şekil 3’teki kodu FPGA kartında uygulamak için aşağıdaki adımları izleyin: 1 Şekil 2: DE2-115 Advanced Import Settings Penceresi. // Ledlerle anahtarların bağlandığı basit bir modül module part1 (SW, LEDR); input [17:0] SW; // Anahtarlar output [17:0] LEDR; // Kırmızı Ledler assign LEDR = SW; endmodule Şekil 3: Ledlerin ve anahtarların kullanıldığı verilog kodu 1. eni bir Quartus II projesi oluşturun. Cyclone IV EP4CE115F29C7 FPGA yongasını seçin. 2. Şekil 3’teki kod için verilog modülü oluşturun ve projenize ekleyin. 3. Projenize pin assignments dosyasını ekleyin ve derleyin. 4. Derlenmiş devreyi FPGA yongasına yükleyin ve seçicilerin konumunu değiştirerek ledleri kontrol edin. Uygulama II Şekil 4a s seçici ucuna sahip, 2x1’lik bir multiplexerı çarpımlar toplamı olarak göstermektedir. Eğer s = 0 ise multiplexerın çıkışı (m) x girişine eşittir. Eğer s = 1 ise çıkış y girişine eşit olacaktır. b şeklinde multiplexerın doğruluk tablosu c şeklinde ise devre sembolü gösterilmiştir. 2 x m s y a) Circuit s s m 0 1 x y x y b) Truth table 0 m 1 c) Symbol Şekil 4: 2x1’lik multiplexer. Bir multiplexer verilog kodunda aşağıdaki gibi tanımlanır. assign m = (∼s & x) | (s & y); Bu kodu kullanarak 8 atamadan oluşan şekil 5a’daki gibi bir devrenin verilog modülü oluşturun. Devre iki 8-bitlik girişi ve bir 8-bitlik çıkışa sahip, ve eğer s = 0 ise M = X, s = 1 ise M = Y şeklinde çalışmaktadır. Şekil 5b’de oluşturacağımız 8-bitlik multiplexerin devre sembolü gösterilmiştir. Bu modülü oluştururken aşağıdaki adımları izleyin. s x7 y7 0 x6 y6 0 m7 1 m6 1 s X Y x0 y0 0 8 0 1 8 m0 1 a) Circuit b) Symbol Şekil 5: 8-bit 2x1’lik multiplexer. 3 8 M 1. Quartus II programında devreniz için yeni bir proje oluşturun. 2. Oluşturduğunuz 8-bitlik multiplexer verilog kodunu projeye ekleyin. Burada X yerine SW7−0 , Y için SW15−8 ve s girişi içinde SW17 anahtarlarını atayın. Bu anahtarları aynı sıradaki kırmızı ledlere (LEDR) bağlayın ve son olarak M çıkışını yeşil ledlere (LEDG7−0 ) bağlayın. 3. Projenize pin assignments dosyasını ekleyin. 4. Projeyi derleyin. 5. Derlenmiş projeyi FPGA kartına yükleyin ve devrenin işlevlerini kontrol edin. Uygulama III Uygulama II’de 2x1’lik multiplexer uygulaması gösterilmişti. Ancak multiplexerlar ikiden fazla sayıda girişe sahip olabilmektedir. Şekil 6’da 2x1’lik multiplexerler yardımıyla nasıl 5x1’lik bir multiplexer oluşturabileceğiniz gösterilmiştir. Devre 3-bitlik seçici uç kullanmaktadır(s2 s1 s0 ). Daha önce 2x1’lik multiplexerda 8-bitlik değişkenler kullanmıştık, Şekil 7’de 5x1’lik multiplexerda 3-bitlik değişkenlerin kullanıldığı bir örnek gösterilmiştir. Uygulama II’de yaptığımız gibi bu devreyide Şekil 6a’daki devrenin kombinasyonu şeklinde oluşturmanız gerekmektedir. s2 s1 s0 u v w x 0 1 0 1 0 m 1 0 1 y a) Circuit s2 s1 s0 m 0 0 0 0 1 1 1 1 u v w x y y y y 0 0 1 1 0 0 1 1 0 1 0 1 0 1 0 1 s2 s1 s0 u v w x y b) Truth table 000 001 010 011 100 c) Symbol Şekil 6. 5x1’lik multiplexer. 4 m s2 s1 s0 U V W X Y 3 3 000 001 010 011 100 3 3 3 M 3 Şekil 7. 3-bit 5x1’lik multiplexer. Bunun için aşağıdaki adımları izleyin: 1. Devreniz için bir Quartus II projesi oluşturun. 2. Verilogda 3-bitlik değişkenlerin kullanıldığı bir 5x1’lik multiplexer modülü oluşturun ve seçme ucu SW17−15 , diğer beş girişide SW14−0 uçlarına bağlayın, Anahtarların durumlarını görmek için kırmızı ledleri ve devrenin çıkışını görmek için ise yeşil ledleri kullanın. 3. Projenize pin assignment dosyasını ekleyerek derleyin. 4. Derlediğiniz dosyayı FPGA kartına yükleyip devrenizin doğru çalışıp çalışmadığını test edin. Uygulama IV Şekil 8’de 3-bit girişli (c2 c1 c0 ) bir 7-segment dekoder gösterilmiştir. Dekoder 7-segment göstergeyi sürmek üzere 7 çıkışa sahiptir. Tablo 1’de girişin kombinasyonlarına göre göstergede gösterilmesi gereken harfler verilmiştir.( 100 − 111 arasındaki girişler boş olarak ayarlanmalıdır.) 7-segment göstergeler şekil 8’deki gibi 0-6 indisleriyle tanımlanır. Yazacağınız verilog modülünde verilen harfler için gerekli olan lojic fonksiyonlarını içermelidir. Kodunuzda boolean işlemleri gerçeklemek için sadece basit assign kodunu kullanmalısınız. 0 c2 c1 c0 5 7-segment decoder 6 4 2 3 Şekil 8. 7-segment çözücü. 5 1 c2 c1 c0 Karakter 000 001 010 011 100 101 110 111 H E L O Tablo 1. Karakter Kodları. Aşağıdaki adımları takip edin: 1. Devreniz için yeni bir Quartus II projesi oluşturun. 2. 7-segment dekoderi yazacağınız verilog dosyasını oluşturun. Girişleri SW2−0 ’a bağlayın ve çıkışı HEX06−0 ’a bağlamanız gerekmektedir. 7-segment göstergeyi modülünüze çıkış olarak verebilmeniz için çıkışı aşağıdaki şekilde tanımlamalısınız. output [0:6] HEX0; 3. pin assignment dosyasını projenize ekledikten sonra projenizi derleyin. 4. Derlediğiniz projeyi FPGA kartına yükleyip anahtarları değiştirerek 7- segment göstergeyi test edin. Uygulama V Uygulama III ve Uygulama IV’de oluşturduğunuz modülleri Şekil 9’daki devreyi oluşturacak şekilde birleştirerek yeni bir devre oluşturmalısınız. Oluşturmanız gereken verilog kodunun iskelet yapısı Şekil 10’da verilmiştir. Daha sonra kodunuzu tablo 2’deki gibi “HELLO” kelimesini gösterecek ve girişin durumuna göre kaydırabilecek şekilde düzenlemelsiniz. SW 17 SW 16 SW 15 SW 14 – 12 3 SW 11 – 9 3 SW 8 – 6 3 SW 5 – 3 SW 2 – 0 3 0 000 001 010 011 100 7-segment decoder 3 7 5 6 4 2 3 3 Şekil 9. Beş karakterden birini seçip gösteren devre. 6 1 module part5 (SW, HEX0); input [17:0] SW; // anahtarlar output [0:6] HEX0; // 7-seg göstergeler wire [2:0] M; mux_3bit_5to1 M0 (SW[17:15], SW[14:12], SW[11:9], SW[8:6], SW[5:3], SW[2:0], M); char_7seg H0 (M, HEX0); endmodule // 3-bit 5x1’lik multiplexer module mux_3bit_5to1 (S, U, V, W, X, Y, M); input [2:0] S, U, V, W, X, Y; output [2:0] M; . . . kod gösterilmiyor endmodule module char_7seg (C, Display); input [2:0] C; // input output [0:6] Display; // output . . . code not shown endmodule Şekil 10. Şekil 9’daki devrenin verilog kodu. Karakter SW17 SW16 SW15 000 001 010 011 100 H E L L O E L L O H L L O H E L O H E L O H E L L Tablo 2. Beş göstergede kayan "HELLO" yazısı. Aşağıdaki adımları izleyin: 1. Yeni bir proje oluşturun. 2. Projeye verilog codunuzu ekleyin. Modülünün girişini SW ve çıkışını HEX4, HEX3, HEX2, HEX1, ve HEX0 olacak şekilde ayarlayın. 3. pin assignment dosyasını projenize ekleyip derleyin. 4. Derlediğiniz projeyi FPGA kartına yükleyip, girişin durumuna göre göstergelerin doğruluğunu test edin. 7 Uygulama VI Uygulama V’deki kodu tüm 7-segment göstergeleri kapsayacak şekilde genişletin. Tablo 3’teki gibi göstergeleri sürecek modülü oluşturun. Character pattern SW17 SW16 SW15 000 001 010 011 100 101 110 111 H E L L O H E L L O H E L L O H E L L O E L L O H L L O H E L O H E L O H E L L Tablo 3. Sekiz gösterge kayan "HELLO" yazısı. Aşağıdaki adımları izleyin: 1. Yeni bir proje oluşturun. 2. Projeye verilog codunuzu ekleyin. Modülünüün girişini SW ve çıkışını HEX7, . . ., HEX0 olacak şekilde ayarlayın. 3. pin assignment dosyasını projenize ekleyip derleyin. 4. Derlediğiniz projeyi FPGA kartına yükleyip, girişin durumuna göre göstergelerin doğruluğunu test edin. 8 Laboratuvar Çalışması 2 Sayılar ve Göstergeler Bu çalışmanın amacı kombinasyonel devreler tasarlayarak ikilik sayılar ile onluk sayılar üzerinde işlem yapmak ve ikili olarak kodlanmış onluk sistemde (BSD) toplama işlemini gerçeklemektir. Uygulama I 7-segment göstergeleri (HEX3 – HEX0) anahtarlarla (SW15−0 ) ile sürmek istiyoruz. Oluşturacağınız modül göstergelerde 0’dan 9’a kadar olan rakamları gösterecek yapıda olmalıdır. Bunun için dekoderinizin girişi 4-bit olmalı ve herbir dekoder için 1010’dan 1111’e kadar girişler etkisiz olmalıdır. Aşağıdaki adımları izleyin: 1. Yeni bir proje oluşturun. 2. Projeye verilog dosyası ekleyin. Verilog ile oluşturacağınız modülünüzde 7- segment göstergeleri sadece basit assign komutuyla atamalısınız. 3. Modülün girişini SW[15:0] ve çıkışını HEX3, HEX2, HEX1 ve HEX0 olacak şekilde ayarlayın. 4. pin assignment dosyasını projenize ekleyip derleyin. 5. Derlediğiniz projeyi FPGA kartına yükleyip, girişin durumuna göre göstergelerin doğruluğunu test edin. Uygulama II 4-bit ikilik sayıyı iki basamaklı onluk sayıya çeviren bir devre tasarlamalısınız. Tablo 1’de girişin durumuna göre olması gereken çıkışlar verilmiştir. Oluşturmanız gereken devrenin sembolik gösterimi Şekil 1’de verilmiştir. Oluşturacağınız modül if-else yada case gibi ifadeler içermemeli sadece boolean işlemler ile oluşturulmuş olmalıdır. Binary value Decimal digits 0000 0001 0010 ... 0 0 0 ... 0 1 2 ... 1001 1010 1011 1100 1101 1110 1111 0 1 1 1 1 1 1 9 0 1 2 3 4 5 Table 1. Binary-to-decimal conversion values. Aşağıdaki adımları izleyin: 1. Yeni bir proje oluşturun. 2. Projeye verilog dosyası ekleyin. Modülünüzü B devresi ve dekoder olmadan oluşturun. v3−0 girişlerini anahtarlara, m3−0 ile z çıkışlarınıda ledlere bağlayarak derleyin ve devrenizin doğru çalıştığından emin olun. 3. B devresini ve dekoderi kodunuza ekleyerek modülün çıkışını HEX1 ve HEX0 olarak ayarlayın. 9 4. pin assignment dosyasını projenize ekleyip derleyin. 5. Derlediğiniz projeyi FPGA kartına yükleyip, girişin durumuna göre göstergelerin doğruluğunu test edin. d1 z 0 Comparator Circuit B v3 5 6 4 m3 0 0 7 1 2 3 1 d0 v2 m2 0 0 1 7-segment decoder v1 7 0 v0 1 m1 0 m0 5 6 4 1 2 3 1 Circuit A Şekil 1: Partial design of the binary-to-decimal conversion circuit. Uygulama III a, b ve cj girişlerine, s ve c0 çıkılarına sahip bir tam toplayıcıya ait devre şeması Şekil 2a’da verilmiştir. Şekil 2b ve c’de tam toplayıcıya ait devre sembolü ve doğruluk tablosu gösterilmiştir. Şekil 2d’de ise 4-bitlik bir tam toplayıcının devre şeması verilmiştir. Burada her bir bitin toplanması sonucu oluşan eldenin bir sonraki toplama işlemine eklendiği görülebilir. 10 ci s a ci s a b 0 a) Full adder circuit b a ci 0 0 0 0 1 1 1 1 0 0 1 1 0 0 1 1 0 1 0 1 0 1 0 1 co s 0 0 0 1 0 1 1 1 0 1 1 0 1 0 0 1 c) Full adder truth table co b co 1 FA b) Full adder symbol b3 a3 c 3 b2 a2 c 2 FA FA c out s 3 b1 a1 c 1 b 0 a 0 c in FA s2 FA s1 s0 d) Four-bit ripple-carry adder circuit Şekil 2: A ripple-carry adder circuit. Bu devrenin verilog kodunu aşağıdaki adımları takip ederek oluşturun. 1. Yeni bir proje oluşturun. Bir tam toplayıcı alt modülü yazın ve ana modülü 4-bitlik toplamayı yapmak için bu alt modülü kulanacak şekilde oluşturun. 2. Modülün girişlerini anahtarlara ve anahtarlarıda durumlarını görmek için kırmızı ledlere bağlayın. Modülün çıkışlarını ise yeşil ledlere bağlayın. 3. pin assignment dosyasını projenize ekleyin ve projenizi derleyip FPGA kartına yükleyin. 4. Devrenizi test etmek için değişik giriş değerleriyle sonucun doğruluğunu test edin. Uygulama IV Uygulama II’de ikilik sayılarıla onluk tabandaki rakamların ilişkisinden bahsetmiştik. Bu tarz bir kullanım devrenin çıkışını kullanıcının algılamasını kolaylaştırmaktadır. Herbir rakamın 4-bitlik ikilik sayılarla temsil edilmesine binary coded decimal (BCD) denilmektedir. Örnek olarak onluk sistemde 59 olan bir sayının BCD karşılığı 1010 1001 dir. İki BCD sayıyı toplayan bir devre oluşturmalısınız. Girişleriniz tek basamaklı iki BCD sayı ve elde, çıkışınız ise iki basamaklı BCD sayı olmalıdır. Oluşturacağınız toplayıcının ulaşacağı en büyük sonuç 9 + 9 + 1 = 19 olacaktır. Modülünüzü aşağıdaki adımları takip ederek oluşturun. 1. BCD toplayıcınız için yeni bir proje oluşturun. Uygulama III’te oluşturduğunuz 4-bit tam toplayıcıyı kullanmalısınız. İki basamaklı BCD çıkışı ise Uygulama II’de oluşturduğunuz çeviriciye benzer şekilde oluşturabilirsiniz. Verilog kodunuzu basit assign komutunu kullanarak oluşturmalı, if-else yada case gibi karmaşık yapılar kullanmamalısınız. 2. Modülün girişlerini anahtarlara ve anahtarlarıda durumlarını görmek için HEX6 ve HEX4 e bağlayın. Çıkışları ise HEX1 ve HEX0 göstergelerine bağlayın. 11 3. Devrenizin girişleri BCD sayı olduğu için eğer giriş 9’dan büyükse LEDG8 ledini yakarak kullanıcıya uyarı verecek şekilde gerekli ayarlamaları yapın. 4. pin assignment dosyasını projenize ekleyin ve projenizi derleyip FPGA kartına yükleyin. 5. Devrenizi test etmek için değişik giriş değerleriyle sonucun doğruluğunu test edin. Uygulama V Uygulama IV’te yaptığınız toplayıcıyı girişleri iki basamaklı BCD sayı olacak şekilde aşağıdaki adımları izleyerek düzenleyin. 1. Modülün girişlerini anahtarlara ve anahtarlarıda durumlarını görmek için HEX7 - HEX6 ve HEX5 - HEX4 e bağlayın. Çıkışları ise HEX2, HEX1 ve HEX0 göstergelerine bağlayın. 2. pin assignment dosyasını projenize ekleyin ve projenizi derleyip FPGA kartına yükleyin. 3. Devrenizi test etmek için değişik giriş değerleriyle sonucun doğruluğunu test edin. Uygulama VI Uygulama V’de iki basamaklı BCD toplatıcıyı Uygulama IV’de yaptığımız tek basamaklı BCD sayı toplayıcılardan ikisini birleştirerek oluşturduk. Aşağıda iki basamaklı iki BCD sayıyı toplayacak devrenin farklı bir şekilde oluşturulmuş algoritması bulunmaktadır. 1 2 3 4 5 6 7 8 9 T0 = A0 + B0 if (T0 > 9) then Z0 = 10; c1 = 1; else Z0 = 0; c1 = 0; end if S0 = T0 − Z0 10 11 12 13 14 15 16 17 18 19 T1 = A1 + B1 + c1 if (T1 > 9) then Z1 = 10; c2 = 1; else Z1 = 0; c2 = 0; end if S1 = T1 − Z1 S2 = c2 Bu kodun gerçeklenmesinde hangi devrelerin kullanılacağını anlamak için incelenmesi gerekmektedir. 1., 9., 10. ve 18. satırlarda toplayıcılar, 2. ve 8. satırla arası ile 11. ve 17. satırlar arasındaki kodlar için multiplexerlar ve son olarakta T0 > 9 ve T1 > 9 karşılaştırmaları içinde karşılaştırma birimleri kullanılmalıdır. Bu kodu gerçeklerken aşağıdaki adımları izleyerek ve if-else ve > ve + gibi operatorleri kullanarak verilog kodunuzu oluşturacaksınız. 1. Yeni bir proje oluşturun ve bir önceki uygulamadaki aynı giriş çıkışları kullanın. Projenizi derleyin. 12 2. Quartus II RTL Viewer aracıyla oluşturduğunuz devreyi inceleyin. Bir önceki uygulamada oluşturduğunuz devreyle karşılaştırın. 3. Projenizi FPGA kartına yükleyip değişik giriş değerleriyle çıkışın doğruluğunu test edin. Uygulama VII 6-bitlik ikilik sayıyı iki basamaklı onluk sayıya çevirip BCD formda gösteren bir modül oluşturun. Giriş olarak SW5−0 anahtarlarını ve çıkış olarak HEX1 ve HEX0 kullanın. Projenizi FPGA kartına yükleyip değişik giriş değerleriyle çıkışın doğruluğunu test edin. 13 14 Laboratuvar Çalışması 3 Mandallar, Flip-floplar ve Kaydediciler Bu çalışmanın amacı mandalları, flip-flopları ve kaydedicileri anlamaktır. Uygulama I Alteranın FPGA’lerinde kullanıcıların kullanımına açık flip-floplar bulunmaktadır. Uygulama IV’de bu iki durumluları nasıl kullanacağımızı göreceğiz. Ancak ön tanımlı flip-flopları kullanmadan önce hafıza birimlerini nasıl oluşturabileceğimizi göreceğiz. Bir RS latchının kapı yapısı Şekil 1’de veerilmiştir. Bu devreyi Şekil 2’de verildiği gibi iki farklı verilog koduyla gerçekleyebiliriz. Aynı devreyi oluşturmak için Şekil 2a mantık kapılarını kullanırken, Şekil 2b mantık işlemlerini kullanmaktadır. Eğer bu latchı FPGA üzerinde 4-girişli bir Look Up Table (4-LUT) kullanarak gerçeklemek istersek, o zaman Şekil 3a’da görüldüğü gibi sadece tek bir LUT ile gerçekleyebiliriz. R_g R Qa (Q) Clk Qb S_g S Şekil 1: RS mandalı devresi. // A gated RS latch module part1 (Clk, R, S, Q); input Clk, R, S; output Q; wire R_g, S_g, Qa, Qb /* synthesis keep */ ; and (R_g, R, Clk); and (S_g, S, Clk); nor (Qa, R_g, Qb); nor (Qb, S_g, Qa); assign Q = Qa; endmodule Şekil 2a. RS mandalının mantık kapıları kullanılarak tanımlanması. 15 // A gated RS latch module part1 (Clk, R, S, Q); input Clk, R, S; output Q; wire R_g, S_g, Qa, Qb /* synthesis keep */ ; assign R_g = R & Clk; assign S_g = S & Clk; assign Qa = ∼(R_g | Qb); assign Qb = ∼(S_g | Qa); assign Q = Qa; endmodule Şekil 2b. RS mandalının mantık işlemleri kullanılarak tanımlaması. Tek bir 4-LUT ile gerçeklenebilmesine rağmen devrenin iç yapısını gözlemlememize izin vermez. Devrenin iç yapısını inceleyebilmek için derleyici komutlarına ihtiyaç duyarız. Şekil 2’deki /* synthesis keep */ komutu devrenin iç yapısındaki değişiklikleri inceleyebilmemiz için Quartus programının bunları ayrı birer mantık elemanı gibi görmesini sağlar. Eğer 4-LUT kullanarak oluşturduğumuz devrenin iç yapısını görmek istersek o zaman devreyi Şekil 3b’deki gibi dört tane 4-LUT ile oluşturmamız gerekmektedir. R Clk S Qa (Q) 4-LUT (a) Using one 4-input lookup table for the RS latch. R R_g Qa (Q) 4-LUT 4-LUT Clk S_g S 4-LUT 4-LUT Qb (b) Using four 4-input lookup tables for the RS latch. Şekil 3. Şekil 1’deki devrenin gerçeklenmesi. Bir RS mandalı için bir Quartus II projesini aşağıdaki adımları izleyerek oluşturun: 16 1. Yeni bir proje oluşturun. Hedef yonga olarak Cyclone IV EP4CE115F29C7’yi seçin. 2. Şekil 2’deki kodlardan birini seçip verilog dosyasını oluşturun.(İki kodda aynı devreyi oluşturur.) 3. Kodunuzu derleyin. RTL Viewer aracını kullanarak kapı-düzeyinde devrenizi gözlemleyin. Aynı şekilde Technoloji map Viewer aracıyla gözlemleyerek Şekil 3b’deki gerçeklemeyle karşılaştırın. 4. 4. Qsim programını çalıştırıp bir Vector Waveform File (.vwf) dosyası oluşturun. R ve S girişleri için bir sinyal oluşturup programa R_g, S_g, Qa ve Qb için çıkış sinyallerini oluşturun. Uygulama II D mandalının kapı yapısı Şekil 4 de gösterilmiştir. D S S_g Qa (Q) Clk Qb R R_g Şekil 4. D flip-flop’u devresi. Aşağıdaki adımları takip edin: 1. Yeni bir proje oluşturun ve Şekil 2b’deki gibi mantık işlemleri kullanarak D flip-flop’unun verilog kodunu oluşturun. R, S_g, R_g, Qa, ve Qb sinyallerinin ayrı mantık birimlerinde saklanması için /* synthesis keep */ komutunu kullanın. 2. Kodunuzu derleyin ve Technology Viewer aracını kullanarak oluşturduğunuz devreyi inceleyin. 3. fonksiyonel simulasyonu kullanarak devrenizin bütün giriş kombinasyonlarında doğru çalıştığını kontrol edin ve zamanlama simulasyonu yaparak kontrol edin. 4. SW0 anahtarını D girişine, SW1 anahtarını Clk girişine ve LEDR0 ledinide Q çıkışına bağlayın. 5. Projenizi tekrar derlyip karta yükleyin. 6. Anahtarları açıp kapatarak devrenizin doğru çalıştırığını kontrol edin. 17 Uygulama III Şekil 5’te iki D flip-flop’unun bağlandığı bir devre gösterilmiştir. Master D Clock D Q Slave Qm Clk Q D Q Clk Q Qs Q Q Şekil 5. Birbirine bağlı iki D flip-flop’u. Aşağıdaki adımları uygulayın: 1. Yen bir proje oluşturun ve bir önceki uygulamada yazdığınız D flip-flop’u kodundan biri master biri slave olmak üzere iki tane içerecek yeni verilog kodunuzu oluşturun. 2. SW0 anahtarını D girişine, SW1 anahtarını Clock girişine ve LEDR0 ledinide Q çıkışına bağlayın. 3. Projenizi derleyin. 4. Technology Viewer aracını kullanarak oluştruduğunuz devreyi kontrol edin. Simulasyon yaparak sonuçları inceleyin. 5. Devreyi karta yükleyip anahtarları değiştirerek kontrol edin. 18 Uygulama IV Şekil 6’da farklı kenar tetiklemeli D flip-flop’larının devreleri gösterilmiştir. D Clock Q Qa Clk Q Qa Q Qb Q Qb Q Qc Q Qc D D D (a) Circuit Clock D Qa Qb Qc (b) Timing diagram Şekil 6. Bu uygulama için devre ve zaman çizelgesi. Bu devreyi gerçeklemek ve simulasyonunu yapmak için aşağıdaki adımları izleyin: 1. Yeni bir proje oluşturun. 2. Üç tür D flip-flop’unu içeren verilog dosyasını oluşturun. Şekil 7’de standart bir D flip-flop’una ait verilog kodu verilmiştir. 3. Projenizi derleyin ve Technology Viewer aracıyla kontrol edin. 4. Bir Vector Waveform File (.vwf) dosyası oluşturarak Şekil 6’daki gibi D ve Clock girişlerini oluşturun. Daha sonra simulasyonu çalıştırarak üç flip-flop’un çıkışlarını kontrol edin. 19 module D_latch (D, Clk, Q); input D, Clk; output reg Q; always @ (D, Clk) if (Clk) Q = D; endmodule Şekil 7. D flip-flop’u için verilog kodu. Uygulama V Bu uygulamada 16-bitlik A değişkenini HEX7 − 4 göstergelerinde, yine 16-bitlik B değişkenini HEX3 − 0 göstergelerinde gösteren bir devre oluşturacağız. A ve B değişkenlerini SW15−0 anahtarları yardımıyla tanımlayacaksınız. Devreniz çalıştığında ilk A değişkeninin değeri anahtarlardan okunacak ve daha sonra B değişkeninin değeri okunacaktır. B değişkeni okunurken A’nın değeri kaydedicilerde tutulmalıdır. 1. Yeni bir proje oluşturun. 2. Proje için verilog kodunu oluşturun. KEY0 anahtarını negatif kenar tetiklemeli asenkron reset olarak, KEY1 anahtarını da saat girişi olarak ayarlayın. 3. Projenizi derleyin. 4. Gerekli anahtarları ve göstergeleri projenize ekleyin. 5. Projenizi tekrar derleyin ve karta yükleyin. 6. Anahtarların pozisyonlarını değiştirerek göstergeleri kontrol edin. 20 Laboratuvar Çalışması 4 Sayaçlar Bu çalışmada sayaçları nasıl oluşturacağımızı ve kullanacağımızı göreceğiz. Daha sonra oluşturacağımız devreyi FPGA kartına yükleyeceğiz. Uygulama I Şekil 1’de T flip-flop’larından oluşan 4-bit counter gösterilmiştir. Sayaç eğer Enable biti 1 ise clk sinyalinin her positif kenarında bir sonraki durumuna geçer. Clear sinyalinin 0 durumuna geçmesiyle tüm bitler sıfırlanır. Sizde benzer yapıda bir 8-bitlik sayıcı oluşturun. Enable Clock T Q Q T Q T Q Q T Q Q Q Clear Şekil 1: A 4-bit counter. 1. Şekil 1 birdeki yapıda 8-bitlik bir sayıcının verilog kodunu oluşturun. Yazacağınız kod 8 tane T filpflop’undan oluşmalıdır. Kodunuzu derleyin. Devreniz kaç mantık elemanı kaplıyor? Devrenizin maksimum çalışma frekansı (Fmax ) nedir? 2. Simulasyon yaparak devrenizin doğru çalıştığından emin olun. 3. Kodunuzu, Clock girişini butona (KEY0 ), Enable ve Clear girişini SW1 ve SW0 anahtarlarına, 4 bit çıkışı ise HEX1-0 göstergelerine bağlanacak şekilde güncelleyin ve tekrar derleyin. 4. Devrenizi FPGA kartına yükleyin ve çalışmasını test edin. 5. Kodunuzun 4-bitlik versiyonunu derleyip RTL Viewer yardımıyla Şekil 1 ile karşılaştırın. Uygulama II Verilog donanım tanımlama dilinde sayaç yazmanın bir başka yoluda değişkene 1 eklemektir. Bu aşağıdaki gibi yazılabilir. Q <= Q + 1; Bu şekilde oluşturacağınız 16-bitlik bir sayacı derleyin ve yonga üzerinde kaç mantık elemanı kapladığını ve maksimum çalışma frekansını daha önceki yöntemle karşılaştırın. RTL Viewer aracını kullanarak iki yöntemin farklılıklarını gözlemleyin. Uygulama III 16-bitlik bir sayıcı oluşturmak için Library of Parameterized modules(LPM) modülü kullanın. Daha önceki uygumalarda oluşturduklarınızdan farklı mı? Karşılaştırın. 21 Not: LPM kullanımıyla ilgili detaylı bilgiye ulaşabileceğiniz Using the Parameterized Modules(LPM) dosyasını Altera University Program internet sayfasından indirebilirsiniz. Uygulama IV HEX0 7-segment göstergeyi sürecek bir devre tasarlayıp gerçeklyin. Her bir dijit yaklaşık bir saniye yanmalıdır. Saniyeleri oluşturacağınız bir sayıcı ile sayacaksınız. Oluşturacağınız sayıcı FPGA’in üzerindeki 50MHz saati kullanmalıdır. Başka herhangi bir saat kullanmayın, devrenizdeki bütün flip-flopların direk olarak 50MHz saate bağlandığından emin olun. Uygulama V 7-segmente göstergelerde(HEX7-0) HELLO yazacak devreyi oluşturun. Devrenizi her saniye aşağıdaki Tablo 1’de olduğu gibi bir harf sağdan sola doğru kayacak şekilde düzenleyin. Clock cycle 0 1 2 3 4 5 6 7 8 ... Displayed pattern H E L L O H E L L O H E L L O H E L L O H E L L O H E L L O H E L L O H E L L O H E L L O and so on Tablo 1. Kayan "HELLO" yazısı. Ön Çalışma Laboratuvara gelmeden önce aşağıdakileri yapın. 1. Uygulama I’deki devrenin verilog kodunu oluşturun. 2. Uygulama II’deki devrenin verilog kodunu oluşturun. 3. Uygulama III’deki devrenin verilog kodunu oluşturun. Ayrıca 7-segment göstergelerde 16-lık tabanda sayıları gösteren bir modül oluşturmak ileriki laboratuvarlarda yararlı olabilir. 22 Laboratuvar Çalışması 5 Zamanlayıcılar ve Gerçek Zamanlı Saat Bu çalışmada zamanlanmış devrelerin gerçeklenmesini göreceğiz. Oluşturduğumuz devreleri FPGA kartı üzerinde deneyeceğiz. Ön Bilgi Verilog donanım tanımlama dilinde parametre tanımlayarak değişken boyutlu sayıcılar tasarlayabiliriz. Şekil 1’de bir n-bit sayacın verilogda nasıl tanımlanacağı gösterilmiştir. module counter(clock, reset_n, Q); parameter n = 4; input clock, reset_n; output [n-1:0] Q; reg [n-1:0] Q; always @(posedge clock or negedge reset_n) begin if (~reset_n) Q <= ’d0; else Q <= Q + 1’b1; end endmodule Şekil 1: Verilog da n-bit sayaç kodu. n parametresi sayıcının kaç bit olduğunu tanımlar. N parametresine defparam komutuyla değer atayabilirsiniz. Örnek olarak 8-bitlik bir sayacı aşağıdaki gibi tanımlanabilir. counter eight_bit(clock, reset_n, Q); defparam eight_bit.N = 8; Parametre kullanarak yeni bir modül oluşturmak zorunda kalmadan değişik boyutlarda sayıcılar oluşturabiliriz. Uygulama I 8-bitlik sayıcıya fazladan bir parametre daha ekleyerek modulo-k sayıcı oluşturun. Oluşturduğunuz sayıcı 0’dan k − 1’e kadar sayıp k − 1’e ulaştığında 0’a geri dönecek şekilde çalışmalıdır. Devreniz KEY0 butonunu asenkron reset olarak ve KEY1 butonunuda saat olarak kullanmalıdır. Sayacın değerleri kırmızı ledler ile gösterilmelidir. Oluşturduğunuz devreyi Quartus II yazılımında derleyin ve FPGA kartına yükleyip test edin. Aşağıdaki adımları takip edin: 1. İstenen devrenin gerçeklenmesinde kullanmak için yeni bir proje oluşturun. 2. İstenen devrenin verilog kodunu oluşturun ve projeye ekleyip derleyin. 3. İslevselliğini kontrol etmek için devrenin simulasyonunu yapın. 23 4. pin assignment dosyasını projenize ekleyip derleyin. 5. Tekrar derleyip FPGA kartına yükleyin. 6. Botunlara basarak devrenin çalışmasını kontrol edin. Uygulama II 3-basamaklı bir BCD sayıcı oluşturun. Oluşturduğunuz devrenin çıkışını HEX2−0 7-segment göstergelerine bağlayın. Saat sinyali olarak kartın üzerindeki 50MHz’lik saati, her saniye devrenin çıkışını değiştirecek şekilde kullanın. Son olarak KEY0 butonunu sayıcıyı sıfırlamak için kullanın. Uygulama III FPGA kartı üzerinde günlük saat oluşturun. Devreniz saatleri(0-23) HEX7−6’da, dakikaları(0-59) HEX5−4’de ve saniyeleri(0-59) HEX3−2’de göstermelidir. Ayrıca saatin ilk durumunu ayarlamak için SW15−0 anahtarları kullanılmalıdır. Uygulama IV Eski bir haberleşme metodu olan telgraf mors kodlarına dayanmaktadır. Bu kodlar kısa(nokta) ve uzun(çizgi) sinyallerden oluşmaktadır. Her harf bu sinyalllerin değişik kombinasyonlarıyla oluşturulur. Örnek olarak mors kodunda alfabedeki ilk sekiz harf aşağıdaki gibi temsil edilir. A B C D E F G H •— —••• —•—• —•• • ••—• ——• •••• Alfabenin ilk sekiz harfinden birini alıp kırmızı ledlerde o harfe ait mors kodunu gösteren devreyi tasarlayın. Devrenizde giriş olarak SW2−0 anahtarlarını ve KEY1−0 butonlarını kullanmalısınız. KEY1 butonuna basıldığında SW2−0 anahtarlarıyla belirtilen(A için 000, b için 001,...) harfin mors kodu kırmızı led ile nokta 0.5 saniye ve çizgi 1.5 saniye olacak şekilde gösterilmelidir. KEY0 ise asenkron reset olarak görev yapmalıdır. Devrenin şematik gösterimi Şekil 5’de verilmiştir. Design and implement a circuit that takes as input one of the first eight letters of the alphabet and displays the Morse code for it on a red LED. Your circuit should use switches SW2−0 and pushbuttons KEY1−0 as inputs. When a user presses KEY1 , the circuit should display the Morse code for a letter specified by SW2−0 (000 for A, 001 for B, etc.), using 0.5-second pulses to represent dots, and 1.5-second pulses to represent dashes. Pushbutton KEY0 should function as an asynchronous reset. A high-level schematic diagram of the circuit is shown in Figure 5. İpucu: 0.5 saniyelik saati oluşturmak için bir sayacı, LEDR0 ’ın 0.5 yada 1.5 saniye yanmasını sağlamak için başka bir sayacı kullanın. 24 Pushbuttons and switches Letter size register Data Enable Load Letter Selection Logic Letter symbols shift register Logic Data Enable Load 2-bit counter Reset Enable Şekil 2: Uygulama IV için şematik gösterim. Ön Çalışma Laboratuvara gelmeden önce aşağıdakileri yapın: 1. Uygulama I’deki devrenin verilog kodunu oluştur. 2. Uygulama II’deki devrenin verilog kodunu oluştur. 3. Uygulama III’deki devrenin verilog kodunu oluştur. 25 LEDR0 26 Laboratuvar Çalışması 6 ci Toplayıcı, Çıkarıcı ve Çarpıcılar s ci a s a FA co b 0 Bu çalışmanın amacı sayıların arasındakic toplama, bçıkarma ve çarpma işlemlerini yapabilecek devre elemanları o oluşturmaktır. Her devre verilog ile oluşturulup FPGA kartında gerçeklenecektir. 1 Uygulama I a) Full adder circuit b) Full adder symbol Laboratuvar Çalışması 2’de yaptığımız 4-bitlik tam toplayıcı Şekil 1’de gösterilmiştir. b a ci 0 0 0 0 1 1 1 1 0 0 1 1 0 0 1 1 0 1 0 1 0 1 0 1 co s 0 0 0 1 0 1 1 1 0 1 1 0 1 0 0 1 b3 a3 c 3 FA b2 a2 c 2 FA c out s 3 c) Full adder truth table b1 a1 c 1 FA s2 b 0 a 0 c in FA s1 s0 d) Four-bit ripple-carry adder circuit Şekil 1: 4-bit tam toplayıcı. Bu devre verilogda “+” işaretiyle tanımlanabilir. Mesela aşağıdaki kodda n-bitlik bir toplayıcı tanımlanmıştır: wire [n-1:0] sum; wire carry; ... assign {carry, sum} = A + B; Bu yapıyı kullanarak Şekil 2’deki sistemi oluşturun. Aşağıdaki gibi kodunuzu oluşturup Quartus II yazılımında derleyin, FPGA kartına yükleyerek test edin. 1. Yeni bir proje oluşturun. 2. Şekil 2’deki devre için bir verilog dosyası oluşturun. 3. A girişini SW7−0 anahtarlarına, asenkron reseti KEY0 butonuna ve saatide KEY1 butonuna bağlayın. Sum çıkışını LEDR7−0 kırmızı ledlerine veson olarak elde bitini(carry) LEDR8 kırmızı ledine bağlayın. 4. Pin assignment dosyasını projeye ekleyin. 5. Projenizi derleyin ve zamanlama simulasyonunu kullanarak test edin. Simulasyon sorunsuz çalışırsa projenizi FPGA kartına yükleyip farklı giriş değerleri için test edin. 6. Quartus II Compilation Report’ta timing analyzer kısmını inceleyin. Devrenizin maksimum frekansı nedir? Devrenizin en uzun gecikme süresi nedir? 27 c out s 3 s2 s1 s0 a) Four-bit ripple-carry adder circuit A 8 R Clock Q 8 overflow Q D c in + 0 8 R Q Overflow S b) Eight-bit adder circuit Şekilregistered 2: 8-bit akümülator. Uygulama II Uygulama I’deki devrenizi toplama ve çıkartma yapabilecek şekilde genişletin. Bunun için bir devreye add_sub girişi ekleyin. Eğer add_sub girişi 1 ise devre S’den A’yı çıkaracak, sıfır olduğunda ise uygulama I’deki gibi A ile S’yi toplayacak. Uygulama III Şekil 3a’da bir çarpma işlemi gösterilmiştir. x 1 1 x 1 2 2 2 1 1 1 3 2 1 x 1 0 0 0 1 0 1 1 0 1 1 0 1 1 1 0 0 a) Decimal a2 b2 a1 b1 a0 b0 a3 b0 a2 b0 a1 b0 a0 b0 a3 b1 a2 b1 a1 b1 a0 b1 0 0 0 0 0 1 1 0 0 0 0 1 0 0 a3 b3 a3 b2 a2 b2 a1 b2 a0 b2 a3 b3 a2 b3 a1 b3 a0 b3 p7 b) Binary p6 p5 p4 p3 p2 p1 p0 c) Implementation Şekil 3: Multiplication of binary numbers. P = A × B ifadesini iki sayının toplamı şeklinde hesaplarız. İlki A ile B sayısının birler basamağının çarpımı, ikincisi ise A sayısıyla B sayısının onlar basamağının çarpımının bir birim sola kaydırılmış halidir. Bu iki sayıyı toplayarak sonuca ulaşırız. Şekil 3b’de aynı örneğin 4-bitlik ikilik sistemde sayıların kullanıldığı hali gösterilmiştir. P = A × B eşitliğini hesaplamak için A ile B’nin bütün basamaklarının çarpımlarını toplamalıyız. Şekil 3c’de çarpma işleminin mantık işlemleriyle gösterimi verilmiştir. 4-bitlik bir çarpma işleminin devre şeması Şekil 4’te verilmiştir. Düzenli yapısı nedeniyle bu tarz yapılara dizi çarpıcı denir. Her satırdaki AND kapıları toplam terimlerini oluşturur tam toplayıcılarda bu terimleri toplayarak çarpma işleminin sonucunu oluştururlar. 28 a3 a2 a3 a1 a2 a0 a1 a0 b0 b1 0 b a c o FA c i b a c o FA c i b a c o FA c i b a c o FA c i s s s s a2 a3 a1 0 a0 b2 a3 b a c o FA c i b a c o FA c i b a c o FA c i b a c o FA c i s s s s a2 a1 0 a0 b3 p7 b a c o FA c i b a c o FA c i b a c o FA c i b a c o FA c i s s s s p6 p5 p4 p3 0 p2 p1 p0 Şekil 4: Dizi çarpıcı devresi. Dizi çarpıcı devreyi oluşturmak için aşağıdaki adımları izleyin: 1. Yeni bir proje oluşturun. 2. Gerekli olan verilog dosyasını oluşturun ve devrenizi derleyin. 3. İşlevsel simulasyon yaparak devrenizi test edin. 4. Devrenin A girişini SW11−8 anahtarlarına, B girişini SW3−0 anahtarlarına bağlayın. A ve B nin 16-lık tabanda değerlerini sırasıyla HEX6 ve HEX4 göstergelernde sonucu ise HEX1 ve HEX0 göstergelerinde gösterecek şekilde çıkışları ayarlayın. 5. Projenizi tekrar derleyip FPGA kartına yükleyin. 6. Devrenizin işlevselliğini farklı girişler kullanarak test edin. Uygulama IV 29 Uygulama III’te bir dizi çarpıcıyı tam toplayıcılar kullanarak gerçeklemiştik. Bu uygulamada ise tam toplayıcıların bir dizisi olan n-bit toplayıcılar kullanarak devreyi tekrar gerçekleyeceğiz. Oluşturmanız istenen devrenin şeması Şekil 5’te verilmiştir. a3 a2 a1 a0 b0 a3 a0 a1 a2 b1 0 b3 co a3 b2 s3 a3 a2 a2 b1 a1 n-bit Adder s2 s1 a1 b0 a0 ci s0 0 a0 b2 b3 a3 co s3 a3 a2 b2 a2 b1 a1 n-bit Adder s2 s1 a1 b0 a0 ci s0 0 a0 b3 b3 a3 co s3 p7 p6 b2 a2 b1 a1 n-bit Adder s2 s1 p5 p4 b0 a0 ci s0 p3 0 p2 p1 p0 Şekil 5: An array multiplier implemented using n-bit adders. Çarpıcı devreyi sıralı toplamlar şeklinde oluşturmak bize tasarımımızı genişletme olanağı tanımaktadır. Bu yapıyı kullanarak 8x8 çarpıcı Şekil 5’daki gibi giriş çıkışlara flip-flop bağlayarak gerçekleyin. Çarpıcı devreyi sıralı toplamlar şeklinde oluşturmak bize tasarımımızı genişletme olanağı tanımaktadır. Bu yapıyı kullanarak 8x8 çarpıcı Şekil 6’daki gibi giriş çıkışlara flip-flop bağlayarak gerçekleyin. 30 A B 5 Clock 5 D D Q Q Multiplier 10 D R Q P Şekil 6: A registered multiplier circuit. Aşağıdaki adımları takip edin: 1. Yeni bir proje oluşturun. 2. İstenen devrenin verilog dosyasını oluşturarak derleyin. 3. İşlevsel simulasyon yaparak oluşturduğunuz devreyi kontrol edin. 4. Devrenin A girişini SW15−8 anahtarlarına ve B girişini SW7−0 anahtarlarına bağlayın. A ve B değişkenlerini sırasıyla HEX7-6 ve HEX5-4 göstergelerine ve P = A × B çıkışınıda HEX3-0 göstergelerine bağlayın. 5. Projenizi tekrar derleyip FPGA kartına yükleyin. 6. Devrenizin çalışmasını anahtar ve göstergeler yardımıyla kontrol edin. 7. Devreniz kaç mantıksal eleman kaplıyor? 8. Devrenizin maksimum frekansı nedir? 31 Uygulama V Uygulama IV’te sıralı toplayıcılar kullanarak çarpıcı oluşturduk. Ancak bir çarpıcı oluşturmanın bir diğer yolu ise toplayıcı ağaçları kullanmaktır. Bir toplayıcı ağacı birkaç sayının aynı anda paralel olarak toplanmasıdır. Bir toplayıcı ağacı Şekil 7’de gösterilmiştir. Şekil 7’de A, B, C, D, E, F , G ve H sayıları ikili gruplar halinde(A + B, C + D, E + F ve G + H) paralel olarak toplanır. Daha sonra bu toplamlarda ikili gruplar halinde paralel olarak toplanır. Sonuca ulaşıncaya kadar işlemler bu şekilde devam eder. A B C + D E + F G + + H + + + P Şekil 7: 8 rakam için toplayıcı ağacı. Bu uygulamada sizden 8x8 dizi çarpıcı oluşturmanız istenmektedir. Bir toplayıcı ağacı kullanarak Şekil 5’teki devreyi oluşturun. Girişler A ile B ve çıkış olarak P Uygulama IV’teki gibi flip-flop ile devreye bağlanmalıdır. Oluşturduğunuz devrenin maksimum frekansı nedir? Ön Çalışma Laboratuvara gelmeden önce bütün uygulamaların verilog kodlarını oluşturun. 32 Laboratuvar Çalışması 7 Sonlu Durum Makinesi Bu çalışma sonlu durum makinelerini anlamayı ve kullanmayı amaçlamaktadır. Uygulama I Girişin dört saat darbesi boyunca aynı kalmasıyla çıkışı bir yapan diğer durumlarda çıkışın sıfır kaldığı bir sonlu durum makinesi tasarlamak istiyoruz. Devrenin bir girişi (w) ve bir çıkışı (z) olacak. w dört saat darbesi boyunca bir yada dört saat dilimi boyunca sıfır olarak kalırsa z 1 olacak diğer tüm durumlarda z 0 olarak kalacak. Eğer w 5 saat darbesi boyunca sabit kalırsa o zaman z iki saat darbesi boyunca 1 olarak kalıp 0’a dönecek. Şekil 1 w, z ve saat arasındaki ilişkiyi göstermektedir. Clock w z Şekil 1: z için zaman diagramı. Bu sonlu durum makinesi için oluşturulan durum diagramı Şekil 2’de verilmiştir. Bu uygulamada diagramdaki her durumun flip-flopta tutulduğu sonlu durum makinesini kendimiz oluşturacağız. Sonlu durum makinesi oluşturmak için 9 durum flip-flopunun (y8 , . . . , y0 ) Tablo 1’deki gibi atamalarının yapıması gerekir. Reset A/0 w=0 w=1 1 B/0 F/0 0 w=0 1 1 0 G/0 C/0 w=0 D/0 1 0 1 0 w=0 0 1 H/0 1 E/1 I/1 1 Şekil 2: Sonlu durum makinası için durum diagramı. 33 Name State Code y8 y7 y6 y5 y4 y3 y2 y1 y0 A B C D E F G H I 000000001 000000010 000000100 000001000 000010000 000100000 001000000 010000000 100000000 Tablo 1: Sonlu durum makinası için kodlar. Devrenizi aşağıdaki gibi tasarlayıp gerçekleyin: 1. Sonlu durum makinesi için yeni bir proje oluşturun. 2. Devrenizin verilog kodunu oluşturun. Bunu yaparken sadece assign komutunu kullanmalısınız. Senkron reset girişi için SW0 anahtarını, sonlu durum makinesinin w girişi için iseSW1 anahtarını ve saat için KEY[0] butonunu kullanın. Devrenin z çıkışı için yeşil ledi (LEDG0 ) ve durum flip-flopunun çıkışınıda kırmızı ledleri (LEDR8 - LEDR0 ) kullanın. 3. Verilog kodunuzu projenize ekleyin ve giriş çıkışları ilgili pinlere bağlayın ve projenizi derleyin. 4. Devrenizi davranışını simulasyon yaparak kontrol edin. 5. Devreniz doğru çalışıyorsa FPGA kartına yükleyin ve değişik girişlerle test edin. 6. Son olarak tablo 1’deki kodlamayı değiştirmeyi göz önünde bulundurmalısınız. Sonlu durum makinesini FPGA üzerinde gerçeklediğinizde bütün durum flip-floplarının 0 olduğunu göreceksiniz. Çünkü FPGA üzerindeki flip-floplar clear biti içerirler ancak ilklendirme girişi içermezler. Tablo 2’de tüm flip-flopların sıfır olduğu durumu içerecek şekilde değiştirilmiş durum atamaları gösterilmiştir. Yeni tabloya göre kodunuzu değiştirin (İpucu: sadece durum atamalarını değiştirmeniz yeterli olacaktır.) devrenizi derleyin. Hem simulasyon hemde FPGA kartına yükleyerek devrenizi test edin. Name State Code y8 y7 y6 y5 y4 y3 y2 y1 y0 A B C D E F G H I 000000000 000000011 000000101 000001001 000010001 000100001 001000001 010000001 100000001 Tablo 2: Modified one-hot codes for the FSM. Uygulama II 34 Bu uygulama için farklı bir yöntemle Şekil 2’deki gibi bir sonlu durum makinesini verilog ile gerçekleyeceksiniz. Sonlu durum makinesinin bu versiyonunda durumlara ait flip-flopları direk atama yöntemiyle atamayacaksınız. Bunun yerine verilog donanım tanımlama dilinin always bloğu içinde case komutunu kullanacaksınız. Bir başka always bloğunuda durum flip-floplarını temsil etmek için oluşturacaksınız. Devrenin çıkışını sürmek için ayrı bir always bloğu yada assign komutunu kullanabilirsiniz. Dört durumlu sonlu durum makinesini gerçeklemek için Tablo 3’teki ikilik kodları kullanın. Name State Code y3 y2 y1 y0 A B C D E F G H I 0000 0001 0010 0011 0100 0101 0110 0111 1000 Tablo 3: Binary codes for the FSM. Bu devreyi gerçeklemek için oluşturacağınız verilog kodunun iskelet yapısı Şekil 3’te verilmiştir. module part2 ( . . . ); . . . define input and output ports . . . define signals reg [3:0] y_Q, Y_D; // y_Q represents current state, Y_D represents next state parameter A = 4’b0000, B = 4’b0001, C = 4’b0010, D = 4’b0011, E = 4’b0100, F = 4’b0101, G = 4’b0110, H = 4’b0111, I = 4’b1000; always @(w, y_Q) begin: state_table case (y_Q) A: if (!w) Y_D = B; else Y_D = F; . . . remainder of state table default: Y_D = 4’bxxxx; endcase end // state_table always @(posedge Clock) begin: state_FFs ... end // state_FFS . . . assignments for output z and the LEDs endmodule Şekil 3: Skeleton Verilog code for the FSM. 35 Devrenizi aşağıdaki gibi gerçekleyin: 1. Yeni bir proje oluşturun. 2. Şekil 3’teki gibi oluşturduğunuz verilog kodunu projenize ekleyin. Senkron reset girişi için SW0 anahtarını, sonlu durum makinesinin w girişi için ise SW1 anahtarını ve saat için KEY0 butonunu kullanın. Devrenin z çıkışı için yeşil ledi (LEDG0 ) ve durum flip-flopunun çıkışınıda kırmızı ledleri (LEDR3 - LEDR0 ) kullanın. 3. Kodunuzu derlemeden önce Quartus II’deki Synthesis aracına sonlu durum makinenizi tanıtmalısınız. Eğer yapmazsanız Synthesis aracı durum tanımlamalarınızı değişken ataması gibi algılayacak ve sonlu durum makinenizi tanımayacaktır. Bu ayarı yapmak için Quartus II programında Assignments > Settings menüsüne girip Analysis and Synthesis’e tıklayın. Daha sonra More Setting butonuna tıklayın. Şekil 4’de gösterildiği gibi State Machine Processing kısmında User-Encoded seçeneğini seçin. 4. Quartus II programında RTL Viewer aracını kullanarak devrenizi inceleyin. Durum diagramını görüntülemek için durum makinesinin simgesinin üzerine çift-tıklayın. Compilation Report kısmından Analysis and Synthesis’in altında State Machines yazısına tıklayın. 5. Devrenizin simulasyonunu yapın. 6. Devrenizin doğru çalıştığından emin olduktan sonra FPGA kartına yükleyin ve test edin. 7. 7. Adım 3’teki ayarları geri alıp devrenizi tekrar derleyin. Tekrar Quartus II programında Assignments > Settings menüsüne girip Analysis and Synthesis’e tıklayın. Daha sonra More Setting butonuna tıklayın. Açılan pencereden State Machine Processing kısmında User-Encoded yerine One-Hot seçin ve Tablo 2’de verilen durum kodlarını karşılaştırın. Şekil 4: Quartus II’de durum atamaları. 36 Uygulama III Uygulama I ve II’de yaptığımız devreyi kayan kaydediciler yardımıyla oluşturabiliriz. İki tane 4-bit kayan kaydedici oluşturun; birini peşpeşe dört tane biri tespit etmek için, diğerini ise dört tane sıfırı tespit etmek için ayarlayın. z çıkışını üretmek için mantık işlemlerini kullanacaksınız. Quartus II programında yeni bir proje oluşturun. Anahtar ve ledleri Uygulama I ve II’de olduğu gibi kullanın ve devrenizin davranışını gözlemleyin. Bu devreyi tek bir kayan kaydediciyle oluşturabilir misiniz? Nasıl? Uygulama IV Bu uygulamada mors kodu çözücüyü sonlu durum makinesi kullanarak oluşturacaksınız. Mors kodu kısa(nokta) ve uzun(çizgi) sinyallerden oluşmaktadır. Herbir harf bu sinyallerin değişik kombinasyonlarıyla oluşturulur. Alfabenin ilk sekiz harfi için mors kodları: •— —••• —•—• —•• • ••—• ——• •••• A B C D E F G H Sonlu durum makinesi kullanan bir mors kodu çözücüyü tasarlayıp gerçekleyin. Devreniz giriş olarak alfabenin ilk sekiz harfinden birini almalı ve kırmızı ledlerden birinde harfe ait mors kodunu gösterecektir. SW2−0 anahtarlarını ve KEY1−0 butonlarını giriş olarak kullanın. Eğer KEY1 butonuna basılırsa SW2−0 anahtarlarıyla belirtilen (A için 000, B için 001, ...) harfe ait mors kodunu kırmızı ledde göstermelisiniz. Nokta için 0,5 saniye, çizgi için ise 1,5 saniye ledi yakacaksınız. KEY0 butonu ise asenkron reset olarak devreyi sıfırlamak için kullanılacaktır. Bir mors kodu çözücünün şematik gösterimi Şekil 5’te verilmiştir. Pushbuttons and switches Letter size register Data Enable Load Letter Selection Logic Letter symbols shift register Logic LEDR0 Data Enable Load 2-bit counter Reset Enable Şekil 5: Uygulama IV için kod çözücü. Ön Çalışma Laboratuvara gelmeden önce Uygulama I’den IV’e kadar olan bütün devrelerin verilog kodlarını oluşturun. 37 38 Laboratuvar Çalışması 8 Hafıza Birimleri Bilgisayar sistemlerinde hafıza birimleri büyük bir öneme sahiptir. Eğer bilgisayar sistemini FPGA kartı üzerinde gerçeklemek isterseniz, kartın üzerindeki hafıza birimlerini kullanabilirsiniz. Ancak bu hafıza birimleri yeterli gelmediğinde FPGA’ye dışarıdan hafıza birimleri bağlamanız gerekmektedir. Bu çalışmada hafıza birimlerini nasıl gerçekleyeceğimizi inceleyeceğiz. İlk olarak FPGA’in kaynaklarını kullanarak hafıza birimleri oluşturmayı, daha sonrada FPGA kartının üzerindeki hafıza birimlerini nasıl FPGA yongasına bağlayacağımızı göreceğiz. Şekil 1a’da 32 tane 8-bit kelime uzunluğuna ve 5-bit adres girişine sahip bir rasgele erişimli hafıza (Random Access Memory - RAM) bloğu gösterilmiştir. Address 5 32 x 8 RAM 8 Data Write (a) RAM organization Address DataIn 5 5 8 8 32 x 8 RAM 8 DataOut Write Clock (b) RAM implementation Şekil 1: A 32 x 8 RAM module. Uygulama I Toplayıcı, kaydedici, sayıcı ve hafıza birimleri gibi mantık yapıları genelde LPM modülleri kullanılarak gerçeklenir. Altera rastgele erişimli bellek (RAM) gerçeklemek için altsyncram LPM modülünün kullanılmasını önermektedir. Bu LPM modülünü kullanarak 8-bitlik 32 kelime hafızalı bir hafıza birimi oluşturmak için aşağıdaki adımları takip edin: 1. ramlpm isminde yeni bir proje oluşturun. 39 2. MegaWizard Plug-in Manager aracını kullanarak bahsedilen hafıza birimini oluşturun. MegaWizard projeyle aynı isme sahip ramlpm.v verilog dosyasını oluşturacaktır. Şekil 2: RAM: 1-PORT LPM. Şekil 3: RAM: 1-PORT LPM’daki giriş - çıkışların ayarlanması. 3. Devrenizi derleyin. Compilation Report’u inceleyin, 256-bitlik bir hafıza birimini raporda görmeniz gerekiyor. 40 4. Simulasyonu çalıştırarak devrenizin davranışını inceleyin. Uygulama II Bu uygulamada da oluşturduğumuz hafıza birimine anahtarlar ile veri girmek ve içindeki verileri 7-segment göstergelerde görmek için gerekli ayarlamaları yapacağız. 1. fpgaram adında yeni bir proje oluşturun. 2. Gerekli fonksiyonları içeren bir verilog dosyası oluşturun. Ramlpm.v dosyasını projenize ekleyin. SW7−0 anahtarlarını veri girişi için, SW15−11 anahtarlarını verinin tutulacağı adres girişi için kullanın. Her bir baytı sırayla iki 16’lık tabanda sayı olarak HEX1 ve HEX0. göstergelerinde 2 saiyede bir bir sonrakine geçecek şekilde gösterin. Herbir byte gösterilirken adreside yine 16’lık tabanda HEX5 and HEX4 göstergelerinde gösterin. 3. Verilog dosyanızı projeye ekleyin. 4. Simulasyonu çalıştırarak devrenizin davrranışını denetleyin. 5. Gerekli pin atamalarını yapın. 6. Tekrar derleyip FPGA kartına yükleyin ve devrenizin çalışmasını farklı girişlerle kontrol edin. Uygulama III Hafıza birimlerini LPM modulleri yerine verilog kodlarıyla kendimizde tasarlayabiliriz. Verilog dilinde hafıza birimi tanımlamak için iki boyutlu diziler tanımlarız. 32 x 8-bitlik dizi 8-bitlik 32 kelime kapasiteye sahip bir hafıza birimine işaret eder ve verilogda aşağıdaki gibi tanımlanır. reg [7:0] memory_array [31:0]; FPGA yongalarında hafıza birimlerini her lojik elemanın sahip olduğu flip-flopları kullanarak oluşturabileceğiniz gibi yonganın üzerinde özel olarak tanımlanmış olan hafıza bloklarınıda kullanabilirsiniz. Hafıza bloklarını kullanmanın iki farklı yolu vardır. Biri uygulama I’de gördüğümüz gibi LPM modülleri kullanmak, diğeri ise hafıza biriminizi Quartus II programının hafıza blokları kullanması gerektiğini anlayacağı şekilde tanımlamak. Quartus II Help dosyalarında bunun nasıl yapılacağını bulabilirsiniz. Perform the following steps: 1. Yeni bir proje oluşturun. 2. Devreniz için verilog kodunu oluşturun. Uygulama II’deki gibi giriş ve çıkışları ayarlayın. 3. Kodunuzu projeye ekleyip derleyin. 4. Simulasyonu çalıştırarak devrenizin davranışını gözlemleyin. 5. Gerekli pin atamalarını yapın. 6. Tekrar derleyip FPGA kartına yükleyin. 7. Oluşturduğunuz devrenin girişlerini değiştirerek çıkışlarını denetleyin. Uygulama IV FPGA kartları 16-bitlik 256K kelime kapasiteye sahip SRAM yongaları içerirler. Sram yapısı bir adres ve bir data girişine sahiptir. Ayrıca aşağıdaki kontrol sinyallerinide giriş olarak alırlar: Chip Enable (CE) devre işlem yaptığı 41 sürece sıfır olmalıdır. Write Enable (W E) yazma işlemi boyunca sıfır olmalıdır. Upper Byte (U B) ve Lower Byte (LB) geçerli bir veri okunduğunda yaza yazıldığında sıfır olmalılardır. Okuma işlemi için geçerli bir data girişe verilmeli ve bir saat döngüsü sonra gerekli sinyaller sıfır yapılmalıdır. Bir yazma işlemi ise bir saat döngüsünde gerçekleşir. 1. FPGA kartının üzerindeki SRAM’i kullanacağınız sram adında bir proje oluşturun. 2. sram.v adında bir verilog dosyası oluşturun. SW7−0 anahtarlarını data girişi için SW15−8 anahtarlarını ise 8-bitlik adres girişi için ayarlayın. Key[0] butonunu okuma işlemi için read girişine ve KEY1 butonunuda yazma işlemi için write girişine bağlayın. Son olarak SRAM’den okuyacağınız veriyi HEX1 ve HEX0’da göstermek üzere bağlayın. 3. Gerekli pin atamalarını yapın(anahtarlar, göstergeler ve SRAM). 4. Devrenizi derleyip FPGA kartına yükleyin. 5. Devrenizin farklı girişlere verdiği tepkileri test edin. 42 Laboratuvar Çalışması 9 Basit İşlemci I Şekil 1’de 16-bit kaydedici, multiplexer, toplayıcı/çıkarıcı ve kontrol birimi(sonlu durum makinesi) bulunan sayısal bir sistem gösterilmiştir. 16-bit data sisteme DIN girişinden girer. Bu data 16-bitlik multiplexer aracılığıyla kaydedicilere(R0, . . . , R7 ve A) aktarılır. Multiplexer aynı zamanda bir kaydedicinin içindeki datayı başka bir kaydediciye kaydetmek içinde kullanılabilmektedir. Şekilde multiplexerın çıkışı bus olarak adlandırılmıştır. Bunun sebebi genellikle bir datayı sistemin içinde bir yerden diğerine taşıyan birimlere bus denilmesidir. Toplayıcı yada çıkarıcı multiplexerın çıkışının A kaydedicisine kaydedildiği zaman işleme girer. A kaydedicisine bir data kaydedildiğinde ikinci 16-bitlik sayı bus’a gelir işlem yapıldıktan sonra sonuç G kaydedicisine kaydedilir. Daha sonra G kaydedicisindeki data diğer kaydedicilere yollanabilir. 16 16 R0 in 16 R7 in R0 16 16 A in R7 A Clock DIN AddSub 16 Addsub 16 G in Multiplexers G 8 16 Bus 9 R0 out R7 out G out DIN out IR in IR 9 Control unit FSM Run Resetn Done Şekil 1: A digital system. Sistem kontrol birimi sayesinde her bir saat döngüsünde farklı bir işlem yapabilir. Kontrol birimi gelen veriyi tanımlar ve hangi kaydediciye kaydedileceğini belirler. Örnek olarak, eğer kontrol birimi R0 kaydedicisindeki datanın A’ya yazılmasına karar verdiyse bir sonraki saat döngüsünde data A’ya yazılır. Böyle sistemlere genellikle işlemci denir. Tablo 1’de bu çalışmada tanımlanan işlemcinin sahip olduğu komutların listesi verilmiştir. Operation kolonu komutları ve ve bu komutların argumanlarını göstermektedir. RX ← [RY] RY kaydedicisindeki datanın RX kaydedicisine kaydedileceğini belirtmektedir. mv (move) komutu bir kaydediciden diğerine datanın taşınması için kullanılmaktadır. mvi komutu ise D sabitini kaydediciye taşımak için kullanılmaktadır. 43 Kod İşletilen fonksiyon mv Rx,Ry Rx ← [Ry] mvi Rx,#D Rx ← D add Rx, Ry Rx ← [Rx] + [Ry] sub Rx, Ry Rx ← [Rx] − [Ry] Tablo 1. Komut seti Her komut IR kaydedicisine 9-bitlik IIIXXXYYY şeklinde kodlanarak kaydedilir. Burada III kısmı komutun ne olduğunu, XXX kısmı RX kaydedicisinin hangisi olduğunu, YYY kısmı ise RY kaydedicisinin hangisi olduğunu işaret eder. Komut için 2-bitlik kod yeterli olmasına karşın işlemciye daha sonra başka komutlarda ekleyeceğimiz için 3-bit kulandık. Bu yüzden Şekil 1’de gösterildiği gibi DIN girişinin 9-biti IR kaydedicisine bağlanmıştır. mvi komutu için YYY kodlarının bir anlamı yoktur ve mvi komutu IR kaydedicisine yazıldığında DIN girişine gelen 16-bitlik veri işleme alınır. Soplama yada çıkarma gibi işlenmesi sırasında çoklu atama yapılan komutlar tamamlanmaları için birden çok saat döngüsüne ihtiyaç duyarlar. Kontrol birimindeki sonlu durum makinesi bir sonraki komuta geçmeden işlemdeki komutun tamamlanmasını sağlamak için saati komtrol etmektedir. İşlemci bir komutu işlerken Run sinyali verilir ve komut tamamlandığında ise Done sinyali verilerek komutun bittiği haber verilir. Tablo 2’de Tablo 1’deki komutların kontrol sinyalleri gösterilmiştir. Burada T0 anında IRin kontrol sinyali olmasına karşın tabloda T0 anı verilmemiştir. T1 T2 T3 (mv): I0 RYout , RXin , Done (mvi): I1 DINout , RXin , Done (add): I2 RXout , Ain RYout , Gin Gout , RXin , Done (sub): I3 RXout , Ain RYout , Gin , AddSub Gout , RXin , Done Tablo 2. Komut seti/zaman ilişkisi. Uygulama I Şekil 1’deki işlemciyi verilog dilini kullanarak aşağıdaki gibi tasarlayıp gerçekleyin: 1. Yeni bir proje oluşturun. 2. İstenen verilog dosyasını oluşturun, projenize ekleyin ve derleyin. Oluşturmanız gereken verilog kodunun iskelet yapısı Şekil 2’de verilmiştir. 3. Simulasyonu çalıştırarak devrenizin davranışını gözlemleyin. Düzgün tasarlanmış devrenin simulasyon çıktısı Şekil 3’teki gibi olmalıdır. Bu şekilde 30. ns’de DIN girişine (2000)16 verisi verilmiştir. Yani mvi R0, #D komutu verilmiştir, 50. ns’de ise girişe verilen 5 verisi R0 kaydedicisine yüklenmiştir. 90. ns’de mv R1,R0, 110. ns’de add R0,R1 ve 190. ns’de ise sub R0,R0 komutları verilmiştir. Burada simulasyon çıktısının DIN girişini 4 basamaklı 16lık sayı olarak ve IR kaydedicisindeki veriyi 3 basamaklı 8lik sayı olarak gösterdiğine dikkat edin. 4. Bir modül daha oluşturarak giriş ve çıkışları FPGA kartına uygun şekilde ayarlayın. SW15−0 anahtarlarını DIN girişine, SW17 anahtarını Run girişine, KEY0 butonunu Resetn girişine ve KEY1 botununuda Clock girişine bağlayın. Bus çıkışını LEDR15−0 ledlerine ve LEDR17 ledinide Done çıkışına bağlayın. 44 5. pin assignment dosyasını projenize ekleyin. Devrenizi derleyip FPGA kartına yükleyin. 6. Anahtarların konumlarını değiştirerek işlemcinizin davranışını test edin. module proc (DIN, Resetn, Clock, Run, Done, BusWires); input [15:0] DIN; input Resetn, Clock, Run; output Done; output [15:0] BusWires; parameter T0 = 2’b00, T1 = 2’b01, T2 = 2’b10, T3 = 2’b11; . . . declare variables assign I = IR[1:3]; dec3to8 decX (IR[4:6], 1’b1, Xreg); dec3to8 decY (IR[7:9], 1’b1, Yreg); Şekil 2a. İşlemci kodu için iskelet yapı. 45 // Kontrol SDM durumları always @(Tstep_Q, Run, Done) begin case (Tstep_Q) T0: // Bu adımda girişteki veri yüklenir. if (!Run) Tstep_D = T0; else Tstep_D = T1; T1: . . . endcase end // Kontrol SDM çıkışları always @(Tstep_Q or I or Xreg or Yreg) begin . . . ilklendirmeleri yap. case (Tstep_Q) T0: // Girişi DIN-e kaydet begin IRin = 1’b1; end T1: //Bu adımdaki sinyalleri tanımla case (I) ... endcase T2: //Bu adımdaki sinyalleri tanımla case (I) ... endcase T3: //Bu adımdaki sinyalleri tanımla case (I) ... endcase endcase end // Kontrol SDM kaydedicileri always @(posedge Clock, negedge Resetn) if (!Resetn) ... regn reg_0 (BusWires, Rin[0], Clock, R0); . . . diğer kaydedicileri ve toplama çıkarma birimini oluştur. . . . bus-ı tanımla. endmodule Şekil 2b. İşlemci kodu için iskelet yapı. 46 module dec3to8(W, En, Y); input [2:0] W; input En; output [0:7] Y; reg [0:7] Y; always @(W or En) begin if (En == 1) case (W) 3’b000: Y = 8’b10000000; 3’b001: Y = 8’b01000000; 3’b010: Y = 8’b00100000; 3’b011: Y = 8’b00010000; 3’b100: Y = 8’b00001000; 3’b101: Y = 8’b00000100; 3’b110: Y = 8’b00000010; 3’b111: Y = 8’b00000001; endcase else Y = 8’b00000000; end endmodule module regn(R, Rin, Clock, Q); parameter n = 16; input [n-1:0] R; input Rin, Clock; output [n-1:0] Q; reg [n-1:0] Q; always @(posedge Clock) if (Rin) Q <= R; endmodule Şekil 2c. İşlemci için altmodüller. 47 Şekil 3. İşlemci simülasyon sonuçları. Uygulama II Bu uygulamada Şekil 4’deki bir sayıcı ve bir hafıza birimi eklenmiş işlemciden oluşan devreyi tasarlayacaksınız. Sayıcı hafıza biriminin adreslerini elde etmek için kullanılacak ve devrenizde PClock (işlemci için) ve MClock(hafıza için) olmak üzere iki ayrı saat kullanılacaktır. Processor Memory Counter n addr data Bus 16 16 Bus DIN Done Run Resetn Done MClock PClock Resetn Run Şekil 4. İşlemciye hafızanın ve sayacın bağlanması. 1. Yeni bir proje oluşturun. 2. İşlemci, sayıcı ve hafıza birimini birleştiren bir verilog dosyası oluşturun. Hafıza birimini ROM: 1-PORT LPM modülünü kullanarak 16-bitlik 32 kelime kapasitesine sahip olacak şekilde oluşturun. Sihirbazın 4. ekranı Şekil 5’te verilmiştir. Hafıza birimi sadece okuma için olduğundan senkron sadece okunabilir hafıza (senkron ROM) olarak adlandırılır. Hafıza birimlerinin adresleri yüklemek için bir kaydedici kullandığına dikkat edin. Bu kaydedici FPGA’lerin hafıza kaynaklarının tasarımından dolayı gereklidir. İşlemcinin komutlarını hafıza birimine yazmak için öntanımlı değerleri hafızaya kaydetmelisiniz. Bu sihirbaza memory initialization file (MIF) tanımlayarak yapılabilir. Şekil 6’da MegaWizard Plug-in Manager aracının ilgili ekranı gösterilmiştir. Bu ekranda projemizle aynı klasörde oluşturacağımız inst_mem.mif dosyasını ekliyeceğiz. Quartus II On-line Help’ten MIF dosyalarının formatı hakkında bilgi edinebilir ve işlemciniz için yeteri kadar kod içeren bir MIF dosyasını oluşturabilirsiniz. 48 3. Simulasyonu çalıştırarak işlemciniz ile ROM devrenizin doğru haberleştiğinden emin olun. 4. Projenize pin assignment dosyasını ekleyin, SW17 anahtarını Run girişine, KEY0 butonunu Resetn girişine, KEY1 butonunu MClock girişine ve KEY2 butonunu PClock girişine bağlayın. LEDR15−0 ledlerini bus çıkışına ve son olarak LEDR17 ledine Done çıkışına bağlayın. 5. Devrenizi derleyin ve FPGA kartına yükleyin. 6. Girişleri değiştirerek devrenizin davranışlarını gözlemleyin. Şekil 5. 1-PORT ROM için ayarlar. Şekil 6. Öntanımlı değerlerin hafızaya kaydedilmesi. 49 50 Laboratuvar Çalışması 10 Basit İşlemci II Laboratuvar çalışması 9’da basit bir işlemci tanımlamıştık. Uygulama I’de işlemcinin kendisini tanımladık, Uygulama II’de de bu işlemciyi bir sayıcı ve hafıza brimine bağladık. Bu çalışmada ise işlemci tasarlamanın daha sonraki adımlarını gerçekleyeceğiz. Bu çalışmadaki Şekil ve Tablolar bir önceki çalışmanın devamıdır. Uygulama III Bu uygulamada işlemcimizi geliştireceğiz; oluşturacağımız işlemcinin harici bir sayıcıya ihtiyacı olmayacak. Bunun yanında hafıza yada diğer donanımlar için bir yazma-okuma biti ekleyeceğiz. Tablo 3’teki üç yeni komutu işlemcinize ekleyeceksiniz. ld (load) komutu harici hafızanın RY kaydedisinin içindeki veriyle belirtilen adresindeki veriyi RX kaydedicisine yazar. st (store) komutu RX kaydedicisinin içerdiği veriyi hafıza biriminin RY kaydedicisi ile verilen adresine kaydeder. Son olarak mvnz (move if not zero) komutu ise daha önce tanımladığınız mv komutunun denetleme ifadesi eklenmiş bir versiyonudur. Bu komut eğer G kaydedicisinin içindeki verinin sıfırdan farklı olduğu durumlarda çalışır. İşletilen fonksiyon Kod ld Rx,[Ry] Rx ← [[Ry]] st Rx,[Ry] [Ry] ← [Rx] mvnz Rx, Ry if G != 0, Rx ← [Ry] Tablo 3. İşlemciye eklenen komutlar. Geliştirilmiş işlemcinizin şematik görünümü Şekil 7’de verilmiştir. Bu şekilde, R0-R6 kaydedicileri Laboratuvar çalışması 9’daki Şekil 1’dekilerle aynıdır. Ancak R7 yerine bir sayıcı bulunmaktadır. Bu sayıcı daha önceki çalışmada kullanılan harici sayıcı gibi, işlemcinin hafıza biriminden verileri okuması için gerekli adress verilerini oluşturmak için kullanılmaktadır. R7 sayıcısı endüstride kullanılan gerçek işlemcilerde program counter (PC) ismiyle anılmaktadır. İşlemci sıfırlandığında sayıcı 0 adresine işaret eder. Bir komutun başlaması için hafıza biriminin PC’nin içerdiği adreste o komutun bulunması gerekir. Komut IR kaydedicisine yazılır ve PC bir sonraki komut için bir artar. (mvi komutu için PC verilen sabitin hafıza adresini verir, daha sonra bir artar.) İşlemcinin Kontrol birimi PC’yi sayıcıyı aktif konuma geçiren incr_PC sinyaliyle artırır. Bunun yanında işlemci mv yada mvi komutlarını gerçekleştirirken R7 kaydedicisi verilirse direk olarak adres bilgisi PC (R7)’ye kaydedilebilir. Paralel yüklenen sayaçta R7in sinyali kontrol ünite anahtarı olarak kullanılır. Bu yolla, üretecin hafıza adresini öğrenebilir ve art arda gelen adresteki depolarda bulunan uygulamaları karşılaştıracağız. Benzer şekilde bilgisayardaki akım miktarı başka bir kayıta kopyalanıp bir mv’de kullanılabilir. Bilgisayar kayıt defteri araçlarında kullanılan kodun döngüsü aşağıda gösterilmiş, kodda ki her satırdan sonra % işareti kullanılmış. mv R5,R7 komutunun adresteki hafızaları sub R4,R2 ‘dedir. mvnz R7,R5 kodu R4 sıfır olana kadar sub kodunun uygulanmasını sağlar. Aşağıdaki döngü uzun programlarda bir gecikme oluşturmak için kullanılabilir. mvi mvi mv sub mvnz R2,#1 R4,#10000000 R5,R7 R4,R2 R7,R5 % ikilik tabanda gecikme değeri % yan bilgilerin saklandığı adres % gecikme sayacındaki azalma miktarı % sayaç 0 olana kadar işlemin devam etmesini sağlar 51 Bus 16 16 incr_pc R7 in R0 E L 16 16 A in Counter (R7) A Clock DIN AddSub 16 Addsub ADDR R0 in ADDR DOUT 16 DOUT 16 G in Multiplexers G 8 16 9 DIN out R0 out R7 out G out IR in ADDR in IR DOUT in 9 Control FSM W_D W Run Resetn Done Şekil 7. İşlemcinin geliştirilmiş versiyonu Şekil 7’deki işlemcide veri transferi için kullanılan iki kaydedici vardır. ADDR kaydedicisi Hafıza bloğu gibi harici bir modüle adres bilgisini göndermek için kullanılırken, DOUT verinin harici modüllere gönderilmesini sağlar. ADDR kaydedicisi okuma ve yazma olarak iki farklı şekilde kullanılır. Bunlardan biri hafızadan komutların okunması (fetching) için PC (R7)’deki adres bilgisinin bu kaydediciye yüklenmesidir. Bu adres hafıza birimine gönderilir ve ilgili veri DIN girişinden işlemciye ulaşır. Diğer kullanım ise işlemcinin elde ettiği sonuçların DOUT kaydedicisi yardımıyla hafıza biriminin ADDR kaydedicisindeki adresine çıkış değerinin yazılmasıdır. Bu kullanımlar W (write) flip-flopu yardımıyla yönetilir (0 hafızadan okuma, 1 hafızaya yazma). Şekil 8’de İşlemcinin hafıza brimleri yada diğer aygıtlarla nasıl bağlandığı gösterilmiştir. Şekildeki hafıza birimi yazma ve okuma işlemlerini içermektedir. Birimin adres ve veri girişlerinin haricinde yazma okuma işlevlerinin yönetilmesini sağlayan write enable kontrol ucu ve veri iletişimini düzenlemek için saat ucu bulunmaktadır. Aktif saat tetiklemesinde adres, veri ve write enable kontrol verisi hafıza birimine yüklenir. Bu tarz hafıza birimlerine senkron rastgele erişimli hafıza birimi (synchronous random access memory (synchronous RAM) denir. Şekil 8’de ayrıca işlemcideki bilgilerin yüklenebilmesi için kullanılabilecek 16-bitlik bir kaydedicide gösterilmiştir. Bu kaydedici Ledlere bağlanarak verilerin DE2-serisi kartlarda gösterilmesi sağlanabilir. İşlemcinin yazma işlemini hafızayamı yoksa bu kaydediciyemi yapacağının anlaşılması eklenen bir mantık devresinin adres bilgisinin çözümlemesiyle (address decoding) yapılmaktadır: eğer adres verisinin en anlamlı dört biti A15 A14 A13 A12 = 0000 ise en anlamsız n bit hafıza birimine adres bilgisi olarak gönderilir. Buradaki örnekte hafıza birimi 128 kelime kapasiteye sahiptir. Bu yüzden n = 7 olarak alınır ve hafıza birimine A6 . . . A0 bitler adres bilgisi olarak gönderilir. Eğer en anlamlı dört bit A15 A14 A13 A12 = 0001 ise bu sefer işlemciden gelen veri LEDlere bağlı olan kaydediciye yazılır. 52 A 12 … A 15 Processor ADDR DOUT Memory 4 16 16 n addr data DIN q 16 wr_en W Done … Resetn Run 4 A 12 A 15 Clock E Resetn 16 Run D Q LEDs Şekil 8. İşlemcinin hafıza birimi ve kaydediciye bağlanması. 1. İşlemcinin gelişmiş versiyonu için yeni bir proje oluşturun. 2. İşlemci için verilog konunu oluşturup DIN girişine komutları vererek fonksiyonel simulasyon yapın. İşlemci ile hafıza birimi arasındaki zamanlamaya dikkat edin. 3. Başka bir proje oluşturarak Şekil 8’deki yapıyı oluşturun. Bunun için Quartus II MegaWizard Plug-In Manager aracını kullanarak RAM: 1-PORT hafıza birimini 128 kelime kapasiteli 16-bitlik yazılabilir/okunabilir olacak şekilde ayarlayın. Ve MIF dosyası kullanarak İşlemcinin işleyeceği komutları hafıza birimine yazın. 4. Fonksiyonel simulasyonu kullanarak komutların doğru okunduğunu kontrol edin. 5. Projenize gerekli olan pin atamalarını yapın. SW17 anahtarını işlemcinizin Run girişine, KEY0 butonunu Resetn girişine ve 50MHz’lik saati Clock girişine bağlayın. Projenizin Quartus II yazılımında Timing Analyzer aracı yardımıyla denetleyip işlemcinizin gerçekten 50Mhz saat hızıyla çalıştığına emin olun eğer değilse verilog kodunu düzenleyerek bu hızda çalışmasını sağlayın. Ayrıca Run girişinin işlemcinin saatiyle asenkron olduğuna dikkat edin bu durumu flip-flop kullanarak düzeltin. İşlemcinizin çıkışını takip edebilmek için, LEDs kaydedicisini LEDR15−0 ledlerine bağlayın. 6. Projenizi derleyip FPGA kartına yükleyin. 7. İşlemcinizin işlevselliğini ledleri takip ederek kontrol edin. Uygulama IV Bu uygulamada bir öncekinde oluşturduğumuz işlemciye ek giriş çıkış aygıtları bağlayacağız. seg7_scroll adında yeni bir modül oluşturacağız. Bu modül FPGA kartındaki herbir 7-segment gösterge için bir kaydedici içermelidir. İşlemcinizin bu göstergeleri kullanabilmesi için her kaydedici direk olarak göstergelerdek ledleri kontrol etmelidir. Ayrıca işlemciniz bu kaydedicilere veri yollayabilmesi için yeni bir adres çözümleme devresi oluşturulmalıdır. 1. Yeni bir proje oluşturun. Şekil 8’deki devreye ek olarak yeni oluşturacağınız seg7_scroll modülünün verilog kodlarını oluşturun. 53 2. Devrenizin işleyişin kontrol edin. 3. Projenize gerekli pin atamalarını yapın ve 7-segment göstergeleri kullanabilmek için yeni bir MIF dosyası oluşturun. İlk önce göstergelere bir kelime yazan basit bir kod oluşturun, daha sonra bu kodu yazılan kelimenin sağa yada sola kaydırılmasını sağyalacak şekilde genişletin . 4. Devrenizi çalıştırın ve göstergeleri takip ederek kontrol edin. Uygulama V Bu uygulamada bir önceki uygulamaya port_n adında yeni bir modül ekleyeceğiz. Bu modül kartın üzerindek anahtarların o andaki durumlarını bir kaydediciye yazarak işlemcinin bu bilgiyi ld komutunu kulanarak kullanmasını sağlayacaktır. Ayrıca işlemcinin bu bilgiye ulaşabilmesi için adres çözümlemesinde ek devreye ve çoklayıcıya ihtiyaç duyacaksınız. 1. Oluşturacağınız modülün işlemciyle iletişimini bir devre şemasıyla gösterin. 2. Yeni bir proje oluşturun, verilog kodlarını yazın ve MIF dosyanızı göstergelerdeki kelimenin kayma hızını port_n modülünden okuduğu değere göre ayarlayacak bir uygulama içerecek şekilde ayarlayın. 3. Devrenizin davranışını simulasyon ve karta yükleyerek test edin. Bonus Aşağıda oluşturduğunuz işlemci için bonus uygulamalar verilmiştir. 1. Quartus II yazılımının araçlarını kullanarak işlemciniz için kritik yolu hesaplayınız. İşlemcinizi olabilecek en hızlı çalışacak şekilde güncelleyin. 2. Komutlarınızı işlemcinizi daha esnek hale getirmek için genişletin. Bunun için bazı öneriler mantık işlemleri (AND, OR, XOR), kaydırma komutları ve branch olarak sıralanabilir. Ayrıca mvnz komutundaki “not zero” dan farklı denetleme komutlarıda ekleyebilirsiniz. 3. İşlemciniz için assembly kodundan MIF dosyası oluşturacak bir derleyeci oluşturun. 54
Benzer belgeler
Quartus kullanımı
Şekil 3’teki ekranda sırasıyla projemize ait dosyaların hangi klasörde tutulacağını, projemizin isminin ne olacağını ve proje iskeletinin adının ne olacağını belirliyoruz. Proje iskeletinin adı...