08-20-2012
|
#1
|
Prof. Dr. Sinsi
|
Verilog Örnekler
Örnekler
Bir "Merbaha Dünya" programı şu şekildedir
module main;
initial
begin
$display("Merhaba Dunya!");
$finish;
end
endmodule
Basit şekilde iki Flip-flop şu şekildedir:
module toplevel(clock,reset);
input clock;
input reset;
reg flop1;
reg flop2;
always @ (posedge reset or posedge clock)
if (reset)
begin
flop1 <= 0;
flop2 <= 1;
end
else
begin
flop1 <= flop2;
flop2 <= flop1;
end
endmodule
Tüm benzetim yürütülürken , "<=" işleci ile atanmış bütün sinyaller, işlemlerini aynı anda gerçekleşen tüm ifadeler yürütüldükten sonra yapılacak şekilde sıraya sokarlar Bu işlece tıkanmasız (non-blocking) işleç denmektedir Bir olayda ki tüm ifadeler yürütüldükten sonra, sıralanmış atanmalar yapılır Bu olay eş zamanlı davranan kodların daha kolay çalıştırılmasını sağlar Yukarıdaki örnekte, flop1 değeri, flop2'ye atanmıştır Benzer şekilde flop2 değeri, flop1'e atanmıştır Bu ifadeler aynı zaman olayında yürütülmektedir İfadeler "<=" tıkanmasız işleç ile kodlandığından, işlemler olayın sonunda yapılacak şekilde sıralanmıştır O zamana kadar, flop1 ve flop2 için ihtiyaç duyulan değerler zaman olayının başındaki değerlerdir Bu demektir ki atamalar alakasız bir şekilde sıralansa dahi aynı sonuç elde edilecektir Flop1 ve flop2 her saat vuruşunda (clock olayında) değerlerini takas edeceklerdir Bu atama için bir diğer seçenek ise tıkanmalı (blocking) olarak bilinen "=" işlecidir Bu işleç kullanıldığında olaylar diğer dillerdeki gibi bir sıra halinde meydana gelir Eğer yukarıdaki örnekte "<=" işleç yerine "=" tıkamalı işleci kullanılsaydı, ifadeler sırası davranışı etkilerdi Reset flop2'yi 1 e, flop1 de 0 a değiştirirdi Clock olayı daha sonra flop1 i flop2'ye atardı(reset'ten sonra bu değer 1'dir) Sonraki ifade flop2'yi flop1'e atardı Değerleri takaslamak yerine clock,flop1,flop2 1 olurdu ve değişmezdi
Gecikme Örneği:
  
reg a, b, c, d;
wire e;
  
always @(b or e)
begin
a = b & e;
b = a | b;
#5 c = b;
d = #6 c * e;
end
Yukarıdaki "always" tümcesinin kullanımı diğerlerinden farklıdır Örnek olarak, "always" tümcesindeki "b or e" koşulu b veya e parametrelerinin değişmesi koşulunda aşağıdaki ifadelerin yürütülmesi gerektiğini belirtir 5 birim zamanlık bir gecikmeden sonra b'nin değeri c'ye atanır ve c^e değeri görünmeyen bir yere atanır 6 birim zaman sonra bu yerden d yazmacına atanır Bir işlem içinde (initial veya always bloğunun içinde) yürütülen işaretlerin her zaman "reg (yazmaç)" türünde olmalıdır Dışarıdan yürütülen işlemlerde işaretler "wire(tel)" tipinde olmalıdır "Reg" anahtar sözcüğü donanımsal bir yazmacı belirtmemektedir
Kaynak : Wikipedia
|
|
|