Professional Documents
Culture Documents
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ı
reg yavas_saat;
reg [31:0]sayac;
localparam A = 7'b0001_000;
localparam B = 7'b1100_000;
localparam C = 7'b0110_001;
localparam D = 7'b1000_010;
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
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: