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.
- `timescale 1ns / 1ps
- module boruhatti(saat,ilklendir,sayi1,sayi2,sayi3,sayi4,sonuc);
- // veri genişliği parametresini tanımla
- parameter VERI_GENISLIGI = 8;
- // girdi-çıktı-yazmaç ve telleri tanımla
- input saat;
- input ilklendir;
- input [VERI_GENISLIGI-1:0] sayi1;
- input [VERI_GENISLIGI-1:0] sayi2;
- input [VERI_GENISLIGI-1:0] sayi3;
- input [VERI_GENISLIGI-1:0] sayi4;
- output [2*VERI_GENISLIGI-1:0] sonuc;
- reg [2*VERI_GENISLIGI-1:0] sonuc_y;
- reg [VERI_GENISLIGI-1:0] sayi1_y;
- reg [VERI_GENISLIGI-1:0] sayi2_y;
- reg [VERI_GENISLIGI-1:0] sayi3_y;
- reg [VERI_GENISLIGI-1:0] sayi4_y;
- always @ (posedge saat) begin
- if(ilklendir) begin
- sonuc_y <= 0;
- sayi1_y <= sayi1;
- sayi2_y <= sayi2;
- sayi3_y <= sayi3;
- sayi4_y <= sayi4;
- end
- else begin
- sonuc_y <= sayi1_y * sayi2_y * sayi3_y * sayi4_y;
- end
- end
- assign sonuc = sonuc_y;
- // Minimum period: 14.309ns (Maximum Frequency: 69.886MHz)
- // Minimum input arrival time before clock: 2.838ns
- // Maximum output required time after clock: 4.040ns
- // Maximum combinational path delay: No path found
- 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:
- `timescale 1ns / 1ps
- module boruhatti(saat,ilklendir,sayi1,sayi2,sayi3,sayi4,sonuc);
- // veri genişliği parametresini tanımla
- parameter VERI_GENISLIGI = 8;
- // girdi-çıktı-yazmaç ve telleri tanımla
- input saat;
- input ilklendir;
- input [VERI_GENISLIGI-1:0] sayi1;
- input [VERI_GENISLIGI-1:0] sayi2;
- input [VERI_GENISLIGI-1:0] sayi3;
- input [VERI_GENISLIGI-1:0] sayi4;
- output [2*VERI_GENISLIGI-1:0] sonuc;
- reg [2*VERI_GENISLIGI-1:0] sonuc_y;
- reg [VERI_GENISLIGI-1:0] sayi1_y;
- reg [VERI_GENISLIGI-1:0] sayi2_y;
- reg [VERI_GENISLIGI-1:0] sayi3_y;
- reg [VERI_GENISLIGI-1:0] sayi4_y;
- reg [2*VERI_GENISLIGI-1:0] sonuc_a_y;
- reg [2*VERI_GENISLIGI-1:0] sonuc_b_y;
- always @ (posedge saat) begin
- if(ilklendir) begin
- sonuc_y <= 0;
- sayi1_y <= sayi1;
- sayi2_y <= sayi2;
- sayi3_y <= sayi3;
- sayi4_y <= sayi4;
- end
- else begin
- sonuc_a_y <= sayi1_y * sayi2_y;
- sonuc_b_y <= sayi3_y * sayi4_y;
- sonuc_y <= sonuc_a_y * sonuc_b_y;
- end
- end
- assign sonuc = sonuc_y;
- // Minimum period: 5.074ns (Maximum Frequency: 197.083MHz)
- // Minimum input arrival time before clock: 3.320ns
- // Maximum output required time after clock: 4.504ns
- // Maximum combinational path delay: No path found
- 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.