1- Giriş:

Bu yazıda bir Verilog tasarımını hızlandırmak amacıyla boru hattı tekniğinin kullanımı göreceğiz.

Boru hattı iyi güzel de o nedir diyorsanız Vikipedi’nin “Boru Hattı (Bilgisayar)” başlığına bakabilirsiniz.

Şimdi lafı daha fazla uzatmadan (kimimiz için “daha” kelimesi burada fazla olabilir) bir örnekle boru hattı tekniğini uygulayalım.

2- Örnek:

4 tane sayının birbiriyle çarpılacağını ve her saat darbesinde modülümüze çarpılmak üzere yeni sayıların geldiğini düşünelim.

Öncelikle boru hattı olmayan aşağıdaki tasarımı ISE ortamında sentezleyip elde edebileceğimiz hıza bakalım.

 

  1. `timescale 1ns / 1ps
  2. module boruhatti(saat,ilklendir,sayi1,sayi2,sayi3,sayi4,sonuc);
  3. // veri genişliği parametresini tanımla
  4. parameter VERI_GENISLIGI = 8;
  5. // girdi-çıktı-yazmaç ve telleri tanımla
  6. input                                           saat;
  7. input                                               ilklendir;
  8. input           [VERI_GENISLIGI-1:0]        sayi1;
  9. input           [VERI_GENISLIGI-1:0]        sayi2;
  10. input           [VERI_GENISLIGI-1:0]        sayi3;
  11. input           [VERI_GENISLIGI-1:0]        sayi4;
  12. output      [2*VERI_GENISLIGI-1:0]  sonuc;
  13. reg             [2*VERI_GENISLIGI-1:0]  sonuc_y;
  14. reg             [VERI_GENISLIGI-1:0]        sayi1_y;
  15. reg             [VERI_GENISLIGI-1:0]        sayi2_y;
  16. reg             [VERI_GENISLIGI-1:0]        sayi3_y;
  17. reg             [VERI_GENISLIGI-1:0]        sayi4_y;
  18. always @ (posedge saat) begin
  19. if(ilklendir) begin
  20. sonuc_y     <= 0;
  21. sayi1_y <= sayi1;
  22. sayi2_y <= sayi2;
  23. sayi3_y <= sayi3;
  24. sayi4_y <= sayi4;
  25. end
  26. else begin
  27. sonuc_y <= sayi1_y * sayi2_y * sayi3_y * sayi4_y;
  28. end
  29. end
  30. assign sonuc = sonuc_y;
  31. //    Minimum period: 14.309ns (Maximum Frequency: 69.886MHz)
  32. //   Minimum input arrival time before clock: 2.838ns
  33. //   Maximum output required time after clock: 4.040ns
  34. //   Maximum combinational path delay: No path found
  35. endmodule

Görüldüğü gibi sentez aracımızın verdiği frekans değeri 69.886MHz. Bu tasarımda öncelikle “ilklendir” girişinin gelmesiyle yazmaçların değerleri yükleniyor. Ardından da bir saat darbesi içinde 4 sayı birbiriyle çarpılıyor ve sonuç dışarı veriliyor.

Şimdi de tasarımımıza boru hattı döşeyelim:

  1. `timescale 1ns / 1ps
  2. module boruhatti(saat,ilklendir,sayi1,sayi2,sayi3,sayi4,sonuc);
  3. // veri genişliği parametresini tanımla
  4. parameter VERI_GENISLIGI = 8;
  5. // girdi-çıktı-yazmaç ve telleri tanımla
  6. input                                           saat;
  7. input                                               ilklendir;
  8. input           [VERI_GENISLIGI-1:0]        sayi1;
  9. input           [VERI_GENISLIGI-1:0]        sayi2;
  10. input           [VERI_GENISLIGI-1:0]        sayi3;
  11. input           [VERI_GENISLIGI-1:0]        sayi4;
  12. output      [2*VERI_GENISLIGI-1:0]  sonuc;
  13. reg             [2*VERI_GENISLIGI-1:0]  sonuc_y;
  14. reg             [VERI_GENISLIGI-1:0]        sayi1_y;
  15. reg             [VERI_GENISLIGI-1:0]        sayi2_y;
  16. reg             [VERI_GENISLIGI-1:0]        sayi3_y;
  17. reg             [VERI_GENISLIGI-1:0]        sayi4_y;
  18. reg             [2*VERI_GENISLIGI-1:0]  sonuc_a_y;
  19. reg             [2*VERI_GENISLIGI-1:0]  sonuc_b_y;
  20. always @ (posedge saat) begin
  21. if(ilklendir) begin
  22. sonuc_y         <= 0;
  23. sayi1_y     <= sayi1;
  24. sayi2_y     <= sayi2;
  25. sayi3_y     <= sayi3;
  26. sayi4_y     <= sayi4;
  27. end
  28. else begin
  29. sonuc_a_y   <= sayi1_y * sayi2_y;
  30. sonuc_b_y   <= sayi3_y * sayi4_y;
  31. sonuc_y     <= sonuc_a_y * sonuc_b_y;
  32. end
  33. end
  34. assign sonuc = sonuc_y;
  35. //   Minimum period: 5.074ns (Maximum Frequency: 197.083MHz)
  36. //   Minimum input arrival time before clock: 3.320ns
  37. //   Maximum output required time after clock: 4.504ns
  38. //   Maximum combinational path delay: No path found
  39. endmodule

Boru hattı tekniği kullandığımızda ise tasarımımızın frekans değerinin 197.083MHz’e çıktığını görüyoruz. Boru hattı kullanmadığımız tasarımın aksine sonuç ilk saat darbesi ile değil, ikinci saat darbesi ile veriliyor. Bu durum başlangıçta boru hattının işleri yavaşlattığı veya istenen hızda cevap veremediği düşüncesini geliştirebilir. Fakat 4 değil de aralıksız olarak 100 tane sayının (yani modülümüz 4*25′den 25 kere çalıştırılmak istenirse) çarpılacağı durum düşünülürse boru hatlı tasarımın düz tasarımı hız olarak katlayacağı açıktır, çünkü her saat darbesinde yeni bir dörtlü alınacak ve her saat darbesinde bir önceki dörtlünün sonucu verilecektir.
3- Son:

Bu yazıda tasarımımıza boru hattı döşeyerek hızlandırmayı gördük. Umarım işinize yarar. Kolay gelsin. İyi kodlamalar.