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ı

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ı...

Detaylı