Procedürel
Bloklar (Procedural Bloks)
Verilog HDL’de iki tür blok vardır. Bunlar:
Başlangıç Bloğu (Initial Block)
Bir başlangıç bloğu, adından da anlaşıldığı üzere
sadece simülasyon başladığında gerçekleştirilir. Eğer birden fazla başlangıç
bloğu varsa, simülasyonun başlangıcında itibaren hepsini paralel olarak gerçekleştirilir.
initial begin clk = 0; reset = 0; req_0 = 0; req_1 = 0; endHer Zaman Bloğu (Always Block)
Başlangıç bloğundaki gibi sadece bir
kere değil, always bloğu her zaman gerçekleştirilir. Hassasiyet listesi(sensitive list), always bloğuna
kodun ne zaman gerçekleştirileceğini söyler, always bloğu hakkında önemli olan ise wire veri tipinde değerler kullanılamaz, Ancak reg ve integer veri
tiplerinde değerler kullanılabilir.
always @ (a or b or sel) begin y = 0; if (sel == 0) begin y = a; end else begin y = b; end end
if-else ifadesi hangi kod bloğunun yürütülüp hangisinin yürütülmeyeceğini kontrol eder. Eğer koşul sağlanıyorsa ilgili kod
bloğu, sağlanmıyorsa diğer kod bloğu yürütülür. C dilindeki gibi koşul ifadesi herhangi
bir operatörle kullanılabilir. Gerekli durumlarda iç içe if-else ifadeleri
kullanılabilir.
if (enable == 1'b1) begin data = 10; // decimal address = 16'hDEAD; // hexadecimal wr_enable = 1'b1; // binary end else begin data = 32'b0; wr_enable = 1'b0; address = address + 1; endcase İfadesi
case ifadesi, eğer bir anahtarın birden çok değer
için kontrol edilmesi gerekiyorsa kullanılır. İç içe
if-else ifadesi yerine case ifadesi kullanılırsa her değer için bir case ifadesi
kullanılabilir.
case ifadesi, case deyimi ile başlar ve yine endcase deyimi ile biter. Her bir koşul
iki nokta ile sonlanır ve birden fazla koşul olması durumunda koşullar
begin-end bloğu içerisine yazılır. case ifadesinde default deyimi kullanılmaması durumunda belirtilmemiş bir ifade girilmesi durumunda simülasyon hatalı çalışır.
Not: if-else ve case ifadelerinde eğer tüm durumlar kapsanmıyorsa (If- else ifadesinde ‘else’ veya case ifadesinde ‘default’ bulunmuyorsa) ve kombinasyonel bir ifade yazılacaksa, sentezleme aracı kombinasyonel bir devre oluşturmak yerine Latch kullanmayı tercih eder.
Not: Verilog HDL'de kod bloklarını ayırmak için parantez kullanılmaz.
case(address) 0 : $display ("It is 11:40PM"); 1 : $display ("I am feeling sleepy"); 2 : $display ("Let me skip this tutorial"); default : $display ("Need to complete"); endcase
Not: if-else ve case ifadelerinde eğer tüm durumlar kapsanmıyorsa (If- else ifadesinde ‘else’ veya case ifadesinde ‘default’ bulunmuyorsa) ve kombinasyonel bir ifade yazılacaksa, sentezleme aracı kombinasyonel bir devre oluşturmak yerine Latch kullanmayı tercih eder.
Not: Verilog HDL'de kod bloklarını ayırmak için parantez kullanılmaz.
while İfadesi
while deyimi diğer ifade bloklarında olduğu gibi begin ve end
ile sınırlandırılır.
while (free_time) begin $display ("Continue with webpage development"); endfor İfadesi
Verilog HDL’deki for döngüsü C ve C++’daki sentaks
yapısından pek farkı bulunmuyor. Tek fark Verilog HDL ++ ve -- operatörlerini desteklemez. C’deki gibi i++ yazmak yerine, bunun yerine işlemsel karşılığını
i=i+1 yazılması gereklidir.
for (i = 0; i < 16; i = i+1) begin $display ("Current value of i is ‰d", i); endrepeat İfadesi
repeat deyimi de for döngüsü ile benzerdir. Bunun dışında
dışarıdan bir değişken tanımlayarak repeat deyimiyle kullanıldığında döngünün kaç
kez çalışacağı bildirilir, Gerçek donanım gerçeklemesinde
repeat kullanımı çok nadirdir.
Xlinix Vivado Ortamında Tam Toplayıcı (Full Adder)
Davranışsal Modül ile (with Behavioral Module)
Yapısal Modül ile (with Structural Module)
repeat (16) begin $display ("Current value of i is ‰d", i); i = i + 1; end
Xlinix Vivado Ortamında Tam Toplayıcı (Full Adder)
Lojik Kapılar ile Tam Toplayıcı |
module FullAdder(Sum,Cout,A,B,Cin); input A,B,Cin; output Sum,Cout; assign {Cout,Sum}=A+B+Cin; endmodule
Yapısal Modül ile (with Structural Module)
module FullAdder(Sum,Cout,A,B,Cin); input A,B,Cin; output Sum,Cout; wire w1,w2,w3,w4; xor g1(w1,A,B); xor g2(Sum,Cin,w1); and g3(w2,A,B); and g4(w3,B,Cin); and g5(w4,A,Cin); or g6(Cout,w2,w3,w4); endmodule
Artix-7 FPGA |
Level II |
Level III |
Level IV |
Level V |
Level VI |
Level VII |
Level VIII |
Level IX |
Level X |
Level XI |
Level XII |
Basys3_Master.xdc
Bir sonraki yazımda görüşmek üzere...