You are on page 1of 8

BİL264L - Mantıksal Devre Tasarımı Laboratuvarı

PARAMETRİK TASARIM VE SEVEN SEGMENT DISPLAY


1. PARAMETRİK TASARIM
Verilog modüllerini parametrik tasarlayarak farklı bit genişlikleri için aynı işi yapan farklı
modüller tasarlama zahmetinden kurtulabiliriz. Örneğin; 3 bitlik sayılar toplama yerine, 4 bitlik
sayılar toplayan bir toplayıcı modüle ihtiyaç duymamız durumunda, 4 bitlik sayıları toplayan yeni
bir modül gerçekleştirmemiz gerekir. Fakat bir adet parametrik toplayıcı modül gerçekleştirerek,
ihtiyaç duyulan bit genişliğindeki sayıları toplayan toplayıcılar örnekleyebiliriz (istance
oluşturabiliriz).
Parametrik toplayıcı modül Verilog ile davranışsal modelleme kullanarak aşağıdaki
gibi kodlanabilir.

module AdderNBit #(parameter N=8)(


input [N-1:0] sayi1, sayi2,
output reg[N:0] sonuc
);

always @(num1 or num2) begin


sonuc = sayi1 + sayi2;
end
endmodule

Parametrik modüller gerçekleştirmek için, kullanacağımız parametreleri modül isminden


sonra “#(...)” şeklinde tanımlamalıyız. Yukarıdaki örnekte “N” isminde bir parametre tanımlanmış
olup bunun varsayılan değeri 8 olarak belirlenmiş. Birden fazla parametre tanımlarken virgül ile
yeni bir parametre ismi ve varsayılan değerini yazabiliriz (“parameter N = 8, M = 6” gibi). Her
parametre için varsayılan değer atamanız zorunludur. “AdderNBit” modülünün örnekleri
oluşturulurken “N” parametresi değiştirilerek farklı bit genişliklerindeki sayıları toplayan
toplayıcılar elde edilebilir.
Daha önce gerçekleştirdiğimiz “AdderLeds_behavioral” (Lab4 öncesi) modülünü
parametrik şekilde aşağıdaki gibi kodlayabiliriz.

1
BİL264L - Mantıksal Devre Tasarımı Laboratuvarı

module AdderLeds_param #(parameter ADDER_WIDTH = 3) (


input[ADDER_WIDTH - 1:0] sayi1, sayi2,
output reg[LEDS_WIDTH - 1:0] ledler
);

localparam LEDS_WIDTH = (1 << (ADDER_WIDTH) + 1) - 2;

wire[ADDER_WIDTH:0] sonuc;

AdderNBit #(.N(ADDER_WIDTH)) adder (


.sayi1(sayi1),
.sayi2(sayi2),
.sonuc(sonuc)
);

always @* begin
ledler = (1 << sonuc) - 1;
end
endmodule

“AdderLeds_param” modülünün tek parametresine “ADDER_WIDTH” ismini verdik. Bu


parametre, toplanacak sayıların kaç bit olduğunu ifade etmek için kullanılıyor. Çıkışın kaç bit
olacağı ise “LEDS_WIDTH” yerel parametresi (“localparam”) ile gösterilmiştir. “localparam” ile
sadece o modül içinde kullanılacak parametreleri tanımlıyoruz. Bir modülü içerisinde birden fazla
kullanacağınız sayı değerlerinizi “localparam” ile tanımlayarak okunması daha kolay bir kod
yazabilirsiniz. Bir sonraki kısımda (Seven Segment Display) yerel parametreler daha okunaklı kod
yazmak için kullanılmıştır. Modülün örneğini oluştururken “localparam” olan değerleri
değiştiremeyiz. Fakat “localparam” değerler parametrelere bağlı olarak farklı şekilde
hesaplanabilir. Örneğin; yukarıdaki örnekte “ADDER_WIDTH” 5 olduğunda “LEDS_WIDTH” 62,
“ADDER_WIDTH” 3 olduğunda ise “LEDS_WIDTH” 14 olur.
Girişlerden gelen “ADDER_WIDTH” bitlik sayıları toplayabilmek için, “ADDER_WIDTH”
genişliğinde sayıları toplayan toplayıcıya ihtiyacımız var. Bu toplayıcıyı parametrik olarak
gerçekleştirdiğimiz “AdderNBit” modülünü kullanarak oluşturuyoruz. Parametrik modüllerin
parametrelerinin değerlerini belirlemek için modül isminden önce
“#(.<PARAMETRE_ISMI1>(<DEGER1>), .<PARAMETRE_ISMI2>(<DEGER2>))” şeklinde bir kod
parçası yazıyoruz. Yukarıdaki örnekte, “AdderNBit” modülünün örneğini oluştururken, bu modülün
“N” parametresine “ADDER_WIDTH” değeri verilmiş.
“sonuc” değeri sabit bir uzunlukta değil. Bu sebepten ötürü “if” ve “case” ifadelerini
kullanarak “’sonuc’ değeri 2 ise ‘ledler’ çıkışına 2’b11 ata” şeklinde her bir durum için tek tek kod
yazamayız. “ledler” çıkışını “sonuc”un değerine göre formüle etmemiz gerekiyor.
“(1 << sonuc) – 1” ifadesi “sonuc” değeri kadar biti yanyana 1 değeri üretmektedir. Bu
değeri “ledler” çıkışına sunduğumuz zaman ise “sonuc” değeri kadar led yakmış oluruz. Örneğin;
“sonuc = 5” için,
ledler = (1 << 5) – 1 = 100000 – 1 = 011111 olmaktadır.

2
BİL264L - Mantıksal Devre Tasarımı Laboratuvarı

2. SEVEN SEGMENT DISPLAY


Seven segment display genellikle sayısal bilgileri görüntülemek için kullanılan elektronik bir
araçtır. Bu kısımda Basys 3 FPGA kartı üzerinde seven segment display kullanımı anlatılacaktır.
Aşağıdaki resimde kırmızı çizgiyle işaretlenmiş alanda 4 adet seven segment display aygıtı
mevcuttur.

Şimdi tek bir seven segment display aygıtını inceleyim.

Şekilde görüldüğü üzere bu aygıtın A, B, C, D, E, F, G ve DP olmak üzere


toplam 8 girişi vardır.
Hangi harfe karşılık gelen ışığı yakmak istiyorsak o girişe 0 vermeliyiz.
Bu ışıkları belirli bir düzende yakarak harf ve rakamları ifade edebiliriz.
DİKKAT: Daha önceki derslerde bir ledi yakmak için o lede 1 değerini
uygulardık. Ancak seven segment display’de 1 değerini uyguladığımız
girişlere karşılık gelen ışıklar yanmayacaktır. 0 değerini
uyguladıklarımız yanacaktır.

3
BİL264L - Mantıksal Devre Tasarımı Laboratuvarı

Yandaki şekilde A, B, C, D, E, F, G ve DP girişlerine karşılık


gelen portlar gösterilmiştir. Harf-Port Numarası eşleşmesi
aşağıdaki tabloda da görülebilir.

Giriş Port Numarası


A W7
B W6
C U8
D V8
E U5
F V5
G U7
DP V7
Ek olarak W4, V4, U4 ve U2 isimli portlar de yukarıdaki şekilde görülmektedir. Bu portlar
seven segment display aygıtlarının hangilerinin çalışacağını denetlemek için kullanılır.
W4 portu en soldaki aygıtı, U2 portu ise en sağdaki aygıtı denetlemek için kullanılır.
Çalışmasını istediğimiz aygıtların kontrolünü sağlayan portlara 0 değerini sürmeliyiz.
Örneğin, W4, V4, U4, U2 portlarına sırasıyla 1, 1, 1, 0 değerlerini uygularsak yalnızca en sağdaki
aygıt çalışacaktır. Diğer aygıtlar çalışmayacaktır.

Basit bir kod…

Aşağıda seven segment display üzerinde bazı ışıkları yakan bir kod verilmiştir.

4
BİL264L - Mantıksal Devre Tasarımı Laboratuvarı

“isik_yak” isimli modülün girişi yoktur. Sadece çıkışları vardır. Bu çıkışlardan


8 bitlik seg çıkışı en anlamlı bitinden en anlamsız bitine sırasıyla A, B, C, D,
E, F, G ve DP girişlerini kontrol etmek için kullanılıyor. Yani, seg[7] değeri 0
olduğunda A harfine karşılık gelen ışık yanacaktır.
4 bitlik an çıkışı ise hangi aygıtın çalışıp hangi aygıtın çalışmayacağını
denetlemek için kullanılıyor. an çıkışının en anlamlı biti en soldaki aygıtı en anlamsız
biti en sağdaki aygıtı kontrol ediyor.

seg çıkışına doğrudan “10101101” değerini atadık. Bu yüzden sadece B, D ve G harflerine


karşılık gelen ışıklar yanacak.
an çıkışına doğrudan “1101” değerini atadık. Bu yüzden sadece U4 numaralı porta bağlı olan
seven segment display aygıtı çalışacak. Çünkü kısıt(constraint) dosyamızı öyle yazmıştık. O halde,
sağdan ikinci aygıt çalışırken diğer aygıtlar çalışmayacak.
Bu kodu FPGA üzerinde çalıştırdığımızda aşağıdaki gibi bir görüntü elde ederiz.

5
BİL264L - Mantıksal Devre Tasarımı Laboratuvarı

3. PARAMETRELER İLE SEVEN SEGMENT DISPLAY KULLANIMI


Yerel parametreleri kullanarak seven segment display aygıtlarını nasıl kontrol
edebileceğimizi bir örnek ile inceleyelim. Bir modülümüz olsun öyle ki bu modül bir bitlik bir girişi,
7 bit uzunluğunda segment çıkışı (seven segment display aygıtlarının üzerindeki ışıkları denetlemek
için) ve bir bitlik dp çıkışı (nokta şeklindeki ışığı denetlemek için) bulunmakta. Giriş değeri 1
olduğunda aygıtlarda U harfi oluşsun, 0 olduğunda L harfi oluşsun. (“segment” çıkışının en anlamlı
bitinden en anlamsız bitinin sırasıyla A, B, C, D, E, F, G harflerine gelen çıkışları denetlediğini kabul
edelim.)

module ornek(
input giris,
output reg [6:0] segment,
output dp
);

localparam L = 7'b111_0001;
localparam U = 7'b100_0001;

assign dp = 1'b1;

always @* begin
if (giris == 1'b1) begin
segment = U;
end
else begin
segment = L;
end
end
endmodule 6
BİL264L - Mantıksal Devre Tasarımı Laboratuvarı

Bu kod parçasında “L” ve “U” adında iki adet yerel parametre tanımladık. Bu parametrelerin
tuttuğu değerler seven segment display üzerinde hangi ışıkların yanacağını belirlemek için
kullanılır. Örneğin “L” yerel parametresinin tuttuğu 7’b111_0001 değeri sadece D, E, F harflerine
karşılık gelen ışıkları yakacağından ekranda L harfine benzeyen bir görüntü oluşacaktır.

4. BINARY DECIMAL CODED BİR DEĞERİN SEVEN SEGMENT DISPLAY UZERINDE


GOSTERİLMESİ
Şimdi ise BCDto7SD isimli bir modül tasarlayacağız öyle ki bu modül girdi olarak 4 bit
Binary Coded Decimal değer alacak ve çıktı olarak 7 bitlik segment ve bir bitlik DP değerlerini
verecek. Burada da bir önceki bölümde olduğu gibi yerel parametreleri (localparam) kullanarak
seven segment display aygıtlarını kontrol edeceğiz.

`timescale 1ns / 1ps

module BCDto7SD(
input [3:0] bcd,
output reg[6:0] segment,
output dp
);

localparam ZERO = 7'b000_0001;


localparam ONE = 7'b100_1111;
localparam TWO = 7'b001_0010;
localparam THREE = 7'b000_0110;
localparam FOUR = 7'b100_1100;
localparam FIVE = 7'b010_0100;
localparam SIX = 7'b010_0000;
localparam SEVEN = 7'b000_1111;
localparam EIGHT = 7'b000_0000;
localparam NINE = 7'b000_0100;

assign dp = 1'b1;

Devam ediyor

7
BİL264L - Mantıksal Devre Tasarımı Laboratuvarı

always @* begin
case(bcd)
4'd0:
segment = ZERO;
4'd1:
segment = ONE;
4'd2:
segment = TWO;
4'd3:
segment = THREE;
4'd4:
segment = FOUR;
4'd5:
segment = FIVE;
4'd6:
segment = SIX;
4'd7:
segment = SEVEN;
4'd8:
segment = EIGHT;
4'd9:
segment = NINE;
endcase
end
endmodule

Kodu inceleyelim.
Giriş ve çıkışların ne olduğundan zaten bahsetmiştik. “localparam” ile başlayan satırlar
dikkatinizi çekebilir. Bu şekilde yerel parametreler tanımlamamızın sebebi kodumuzun daha
okunabilir olmasını sağlamaktır.
Kodun devamında “always” bloğu içerisinde gelen girdi değerine göre çıktılara atama
yapıyoruz. 10 farklı durum var (0’dan 9’a kadar rakamlar). Her bir durum hangi rakamın yanmasını
gerektiriyorsa daha önceden belirlemiş olduğumuz ilgili yerel parametreyi kullanarak atama işlemini
gerçekleştiriyoruz. Örneğin, gelen bcd kodu 4’d3 olduğunda tek bir satırda “segment = THREE”
şeklinde seven segment aygıtlarında 3 (üç) rakamının görüntülenmesini sağlayabiliyoruz.
“assign” kullanarak “dp” çıktısına 1 değerini verdik. Çünkü nokta ışığını kullanmayacağız.
Daha sonraki derslerde ondalıklı sayıları gösterirken bu çıktıyı kullanmak isteyebilirsiniz.
“always” bloğunun hassasiyet listesi “*” olarak verilmiş. Bu şu anlama geliyor: “always”
bloğunda okunan herhangi bir sinyalde değişiklik olduğu zaman bu blok tekrar çalışır. Peki bu blokta
hangi değerler okunuyor? Tek bir değer okunuyor. O da girdi olarak gelen 4 bitlik “bcd” değeri. Yani
girdi her değiştiğinde blok tekrar çalışıyor ve gelen girdiye göre çıktıların değeri tekrar belirleniyor.
Yazdığımız bu modülü bu haftaki laboratuvar çalışmasında ve önümüzdeki laboratuvar
çalışmalarında sık sık kullanacaksınız.

You might also like