Verilog HDL ile Sayısal Tasarım III (Digital Design with Verilog HDL III)

watch_later 3/11/2016
comment 2 Comments
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;
   end
Her 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 İfadesi
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;
     end
case İ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.
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");
end
for İ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);
    end
repeat İ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.
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ı
Davranışsal Modül ile (with Behavioral Module)
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
Prosedürel Modül ile (with Procedural Module)
module FullAdder(Sum,Cout,A,B,Cin);
 input A,B,Cin;
 output Sum,Cout;
 
 reg Sum,Cout;

 always @(A or B or Cin)//always @(A|B|Cin)//always @*
  case ({A,B,Cin})
   3'b000:
    begin
     Sum=1'b0;
     Cout=1'b0;
    end
   3'b001:
    begin
     Sum=1'b1;
     Cout=1'b0;
    end
   3'b010:
    begin
     Sum=1'b1;
     Cout=1'b0;
    end
   3'b011:
    begin
     Sum=1'b0;
     Cout=1'b1;
    end
   3'b100:
    begin
     Sum=1'b1;
     Cout=1'b0;
    end
   3'b101:
    begin
     Sum=1'b0;
     Cout=1'b1;
    end
   3'b110:
    begin
     Sum=1'b0;
     Cout=1'b1;
    end
   3'b111:
    begin
     Sum=1'b1;
     Cout=1'b1;
    end
  endcase
endmodule

Tam Toplayıcı (Full Adder) TestBench
module FullAdder_tb();
 reg A,B,Cin;
 wire Sum,Cout;

 FullAdder DUT(Sum,Cout,A,B,Cin);

 initial
 begin
  $display("Time\tA\tB\tCin\tSum\tCout");
  $monitor("%d\t%b\t%b\t%b\t%b\t%b",$time,A,B,Cin,Sum,Cout);
 end
 
 initial
 begin
  A=0;B=0;Cin=0;
  #100 A=0;B=0;Cin=1;
  #100 A=0;B=1;Cin=0;
  #100 A=0;B=1;Cin=1;
  #100 A=1;B=0;Cin=0;
  #100 A=1;B=0;Cin=1;
  #100 A=1;B=1;Cin=0;
  #100 A=1;B=1;Cin=1;
  #100 $finish;
 end
endmodule

Xlinix Vivado Ortamında Artix-7 FPGA'de 
1. Simülasyon (Simulation)
2. Sentez (Synthesis)
3. Uygulama (İmplementation)
4. Bitstream Oluşturma (Generate Bitstream)

Level I


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...
avatar
Adsız

çok faydalı bir yzı olmuş teşekkürler

delete 16 Mart 2016 23:36



sentiment_satisfied Emoticon