You are on page 1of 3

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

ELE263L - Sayısal Sistem Tasarımı Laboratuvarı

Çoklu Seven Segment Gösterimi ve İdeal Butonlar

1. Giriş
FPGA mimarisi gereği aynı anda birden fazla sayı gösteremez. Çünkü tüm segmentler
aynı kablo üzerindedir. Fakat hangi basamaklara gerilim gönderileceği transistörler vasıtasıyla
belirlenebilir. Önceki lablarda saat yavaşlatmanın nedeninin insan gözünün algılama yavaşlığı
olduğunu görmüştük. Bu labda ise bu açığı, aynı anda birden fazla sayıda basamak veya
karakter göstermek için kullanacağız ve ideal butonların genel mantığını işleyeceğiz.
2. Çoklu Segment Gösterimi
Ledlerde saat kullanımını işlerken, saatin yavaşlatılmasıyla ledlerdeki değişimin
insanın algılayabileceği bir düzeye getirilmesi gerektiğini ve bunun nasıl gerçekleneceğini
işlemiştik. Bu sefer bu durumu engellemeye değil; kendi isteğimiz doğrultusunda kullanımını
işleyeceğiz. Eğer basamaklara her saat vuruşunda farklı bir basamak açılırsa ve segmente
verilen değer değişirse, aynı anda birden fazla değer yazılıyormuş gibi görülür. Böylece
rakamları farklı dört basamaklı sayılar ya da dört harfli kelimeler yazılabilir. Örnek olarak
yedi segmente “AbCd” harf dizisini yazdıralım. Bu işlemi gerçekleştirecek modül sonraki
sayfadaki gibi yazılabilir.
Kod incelendiğinde yavaşlatma oranının yine büyük bir sayı olduğu görülebilir. Bunun
nedeni; harf değiştirme işleminin ‘always’ bloğu 10ns periyotlu saat bağlanırsa, değişimin çok
yüksek hızla gerçekleşmesinden ötürü silik çıkmasıdır. Silikliğin nedeni her bir harfin
sönüklük süresinin yanma süresinden fazla olmasıdır.
Tüm bu anlatılanları aşağıdaki figür ile özetleyebiliriz. Her durum arasında (koddaki
gerçeklemeye göre) 0.1ms geçmektedir. Böyle bir durumda ilk durumdaki harf kapanmasını
algılamadan önce diğer durumun açıldığı görülür. Böylece birden fazla harf aynı anda
yanıyormuş gibi görülür.
BİL264L - Mantıksal Devre Tasarımı Laboratuvarı
ELE263L - Sayısal Sistem Tasarımı Laboratuvarı

`timescale 1ns / 1ps


module ABCD(
input saat,
output reg [6:0] segment,
output reg [3:0] an,
output dp
);

reg yavas_saat;
reg [31:0]sayac;

localparam sayi = (10**5)/2;

localparam A = 7'b0001_000;
localparam B = 7'b1100_000;
localparam C = 7'b0110_001;
localparam D = 7'b1000_010;

localparam A_konum = 4'b0111;


localparam B_konum = 4'b1011;
localparam C_konum = 4'b1101;
localparam D_konum = 4'b1110;

assign dp = 1'b1;

initial begin
segment <= A;
an <= A_konum;
sayac = 0;
yavas_saat = 1'b0;
end

always@(posedge saat)begin
if(sayac == sayi) begin
yavas_saat = ~yavas_saat;
sayac = 1;
end
else begin
sayac = sayac + 1;
end
end

always@(posedge yavas_saat) begin


if((segment == A) && (an == A_konum)) begin
segment <= B;
an <= B_konum;
end
else if((segment == B) && (an == B_konum))begin
segment <= C;
an <= C_konum;
end
else if((segment == C) && (an == C_konum))begin
segment <= D;
an <= D_konum;
end
else if((segment == D) && (an == D_konum))begin
segment <= A;
an <= A_konum;
end
end
endmodule
BİL264L - Mantıksal Devre Tasarımı Laboratuvarı
ELE263L - Sayısal Sistem Tasarımı Laboratuvarı
3. Ideal Buton
FPGA üzerindeki butonlar basılı tutulduğu sürece mantık-1 değerini alırlar. Fakat böyle
durumlarda saat vuruşunun çok hızlı olmasından kaynaklı olarak değişim hızı kullanıcının
farkedemeyeceği kadar çabuk olacağından sayıda ani bir atlama gözlemlenecektir. Bunun
yerine butona basılma bilgisi bir değişken ile tutulursa, değişim sadece butona basıldığı anda
gerçekleşir. Örneğin butona her basışta sayıyı bir artıran bir kodu ele alalım. Eğer buton ideal
hale getirilmezse birkaç milisaniye basılsa bile sayı aniden çok artacaktır. Ancak
idealleştirilmiş butonda ise basılı tutulma durumunda sayı artmayacaktır. Basıldığı andan
itibaren sadece bir değişim gözlenmelidir. Böylece hızlı saat vuruşuyla artan bir sayı çıkma
durumu önlenmiş olur. Anlatılan durumu gerçekleyen kod aşağıdaki gibidir.

`timescale 1ns / 1ps


module ideal_buton_ornegi(
input buton,
input saat,
input sifirla,
output reg [15:0] cikis
);
reg bayrak;
initial begin
cikis = 0;
bayrak = 1;
end
always@(posedge saat) begin
if(sifirla) begin
cikis = 0;
end
else if(buton && bayrak) begin
bayrak = 0;
cikis = cikis + 1;
end
else if(!buton) begin
bayrak = 1;
end
end
endmodule

Bu kodda kilit nokta “bayrak” değişkenidir. Değişken, butona ilk basılma bilgisini
saklar. Bu bilgi, butona basıldıktan sonra bayrak değişkeninin sıfırlanmasıyla tutulur. Buton
tekrar mantık-0 durumuna geldiğinde ise bayrak tekrardan mantık-1 durumuna getirilir ve
sonraki buton=mantık-1 sinyaline kadar bekletilir. Böylece “cikis” değişkeninin ani atlayışlar
yapmasının önüne geçilmiş olur.
4. Çok Bit Genişlikli Diziler
Bu kısımda belli bir bit genişliğine sahip değişken dizileri tanımlanacaktır. Bu tür
tanımlamalar aşağıdaki şekilde yapılabilir:

Dizinin içindeki elemanlar veya elemanların arasında seçim yapmak için “[ ]”


operatörü kullanılır. Yukarıdaki örnek için “degisken[39]” ifadesi 40. elemanı işaret eder.
Eğer bu elemanın en önemli bitine erişmek istersek “degisken[39][31]” ifadesinin
kullanılması gerekir. Böylece çok bitli sayı dizisi tanımlanmış olur.

You might also like