Kasırga Verilog Gelişmeleri
Transkript
Kasırga Verilog Gelişmeleri
[Gizli] PROJE EKİBİ Yrd. Doç. Dr. Oğuz ERGĠN Meltem ÖZSOY Engin ÖZGER Nezire Nur PEPEOĞLU Yusuf Onur KOÇBERBER ġadi Çağatay ÖZTÜRK Özcan YURT Çağatay GÜNGÖR 29.01.2008 Ankara [Gizli] ĠÇĠNDEKĠLER PROJE AŞAMALARI .......................................................................................................................................... 3 BENZETĠM YAZILIMI SEÇĠMĠ ....................................................................................................................... 3 SENTEZ .............................................................................................................................................................. 3 BUYRUK YAKALAMA................................................................................................................................ 3 BUYRUK ÇÖZÜMLEME .............................................................................................................................. 3 YÜRÜTME ..................................................................................................................................................... 4 BELLEK ....................................................................................................................................................... 45 YAZMA ........................................................................................................................................................ 45 BUYRUK KÜMESĠ...................................................................................................................................... 45 BENZETĠM ...................................................................................................................................................... 47 2 [Gizli] PROJE AŞAMALARI BENZETİM YAZILIMI SEÇİMİ Benzetim için ilk önce Icarus ve Modelsim kullanılmıĢtır. Icarus ile tasarımda bellek iĢlemleri hariç diğer iĢlemler çalıĢabilir durumundayken, Icarusun fazla sanal olması ve kartlara uyum sorunu olduğu için Icarus kullanımına son verilmiĢ ve Modelsim kullanımına ağırlık verilmiĢtir. Benzetimler Modelsim üzerinde devam ettirilmiĢtir. Sonrasında Okul tarafından bize sağlanan Altera marka bir FPGA kartı üzerinde çalıĢabilmek için benzetim için Quartus kullanılmaya baĢlanmıĢtır. Böylelikle iĢlemcinin gerçekleĢtirileceği platform olan fpga üzerinde de deneyim sahibi olundu. Quartus’u kullanırken ayrıca bazı durumlarda yine Modelsimden yararlanılmıĢtır. ġu an bize gönderilen Xilinx kartlara uyum adına ISE WebPack 9.1 ve onun benzetim aracını kullanılmaya baĢlanmıĢtır. Çarpma, AMB ve Kaydırıcı birimleri kodlanmıĢ ve benzetimleri gerçekleĢtirilmiĢtir. Benzetim yazılımı seçim süreci basitten karmaĢığa doğru bir yol izlemiĢtir. Bu Ģekilde grubun verilog konusunda da bilgi birikimini artırması sağlanmıĢtır. Son olarak benzetim için yarıĢma tarafından bize sağlanan kartlarla da geçiĢi sağlayacak olan Xilinx ISE benzetim aracı ve Modelsim kullanımında karar kılınmıĢtır. Platform değiĢimleri bilgi birikimimizin ve öğrenme kolaylığı açısından faydalı olduysa da projenin ilerleyiĢini yavaĢlatmıĢtır. SENTEZ BUYRUK YAKALAMA ĠĢlemcinin sanal tasarımı yapılırken ilk adım buyruk türleri ve bir buyrukta hangi bitlerin neleri ifade ettiğini belirlenmesi olmuĢtur. Buyrukların yakalanma iĢlemi sırasında program sayacından belleğe verilen değerin bellekte gösterdiği ilgili adresteki buyruk, veriyoluna verilir. Program sayacının artırılması için birkaç ihtimal bulunmaktadır. Bunlardan birincisi anlık değerle program sayacının artırılması durumudur. Ġkinci olarak program sayacı bir arttırılır. Üçüncü olarak da program sayacına anlık değer yazılmaktadır. BUYRUK ÇÖZÜMLEME GerçekleĢtirilen Kasırga1 iĢlemcisinin buyrukları 16 bit olacaktır ve 11 bitlik anlık değerler kullanılacaktır. GerçekleĢtirilmesi gereken 30 buyruk ise 5 bitle ifade edilecektir. Kasırga1 iĢlemcisinde üç tür buyruk vardır. Bunlar A-tipi, Y-tipi ve D-tipi buyruklardır. A-tipi buyruklar anlık değerle yapılan iĢlemleri ifade eder. Burada 5 bit yapılacak iĢlemi bildirir ve geri kalan 11 bit anlık değerdir. 3 [Gizli] Anlık değerle yapılan iĢlemler genelde birikeçle yapılan iĢlemlerdir. Bunlarda yazmaçtan değer almak yerine direkt kullanıcıdan alınan değerler kullanılır. Y-tipi buyruklar ise yazmaç tipi buyruklardır. Yazmaç tipi buyruklarda iki yazmaçla yapılan iĢlem bir sonuç yazmacına yazılır. Bu tip buyruklarda 16 bit içinden ilk 5 bit iĢlemi gösterirken sonraki 3 bit sonucun yazılacağı yazmacı, daha sonra gelen 6 bit ise iĢlemlerin yapılacağı iki yazmacı gösterir. D-tipi buyruk ise iĢlem biti ve iki yazmacı gösterir. Ġkinci yazmaçtaki değer birinci yazmaçla yapılacak iĢleme dair değerler tutar. YÜRÜTME ARĠTMETĠK MANTIK BĠRĠMĠ (AMB) Bu birimin etkilediği bayraklar sıfır, elde, taĢma ve iĢaret bayraklarıdır. AMB’de iĢlenen temel iĢlemler ve iĢlem bitleri Ģunlardır; 000 ADD 111 SUB 010 XOR 011 AND 100 OR 001 NOT ADD A ve B yazmaçlarındaki 16 bitlik iki sayının toplanması iĢlemidir. SUB B yazmacındaki değerin A yazmacından çıkarılması iĢlemidir. Bu iĢlem toplama iĢleminin aynısıdır. Fakat toplayıcıya giren B yazmacındaki değerin tersi alınarak toplayıcıya sokulması gerekmektedir. XOR A ve B yazmacındaki 16 bitlik iki değere özel veya iĢlemi uygulanmasıdır. ĠĢlem biti 010’dir. AND A ve B yazmacındaki 16 bitlik iki değere “VE” iĢlemi uygulanmasıdır. ĠĢlem biti 011’dir. OR A ve B yazmacındaki 16 bitlik iki değere “VEYA” iĢlemi uygulanmasıdır. ĠĢlem biti 100’dir. 4 [Gizli] NOT B yazmacındaki tersinin alınmasıdır. AMB Bloğu AMB’nin Ģeması 5 [Gizli] Toplayıcı ve bayraklar 4 bitlik CLA toplayıcı 6 [Gizli] Alu.v module alu (a,b,s,out,c_out,overflow,sign,zero,clk); input [15:0] a,b; input [2:0] s; input clk; reg [15:0] out_r; output c_out,overflow,sign,zero; output [15:0] out; reg [2:0] temp_s0; reg [2:0] temp_s1; reg [2:0] temp_s2; wire [15:0] sump,sumn; wire zeronot,c_out2,c_out; always @(posedge clk) begin temp_s0 <= s; temp_s1 <= temp_s0; temp_s2 <= temp_s1; if(temp_s2 == 3'b000) begin out_r <= sump; end else if(temp_s2 == 3'b001) begin out_r <= ~b; end else if(temp_s2 == 3'b010) begin out_r <= a ^ b; end else if(temp_s2 == 3'b011) begin out_r <= a&b ; end else if(temp_s2 == 3'b100) begin out_r <= a | b; end 7 [Gizli] else if(temp_s2 == 3'b101) begin out_r <= out_r; end else if (temp_s2 == 3'b110) begin out_r <= out_r; end else begin out_r <= sumn; end end neg U2(sump,sumn,c_out,a,b,overflow,temp_s2,clk); assign sign=out_r[15]; assign zeronot=out_r[15] |out_r[14]|out_r[13]|out_r[12]|out_r[11]|out_r[10]|out_r[9]|out_r[8] |out_r[7]|out_r[6]|out_r[5] |out_r[4]|out_r[3]|out_r[2]|out_r[1]|out_r[0]; assign zero=~zeronot; assign out = out_r; endmodule Neg.v module neg(sump,sumn,c_out,a,b,overflow,s,clk); input [15:0] a,b; input [2:0] s; input clk; output [15:0] sump,sumn; output c_out,overflow; reg overflow_r,x,c,c_outr; wire [15:0] y,z; wire c_out1,c_out2,overflow2,overflow1,t,d; assign y=~b; assign z=y+16'd1; always @(posedge clk) begin 8 [Gizli] if(s == 3'b000) begin overflow_r <= overflow2; c_outr <= c_out2; end else if(s == 3'b111) begin overflow_r <= overflow1; c_outr <= c_out1; end else begin overflow_r <= overflow1; c_outr <= c_out1; end end add U8(sumn,c_out1,a,z,overflow1); add U7 (sump,c_out2,a,b,overflow2); assign overflow = overflow_r; assign c_out=c_outr; endmodule Add.v module add (sum,c_out,a,b,overflag); output [15:0] sum; output overflag,c_out; input [15:0] a,b; wire [3:0] sum1,sum2,sum3,sum4; wire c_out1,c_out2,c_out3,c_out4,overflag,over3; assign c_in=1'b0; cla4 u1(sum1,c_out1,a[3:0],b[3:0],c_in,over0); cla4 u2(sum2,c_out2,a[7:4],b[7:4],c_out1,over1); cla4 u3(sum3,c_out3,a[11:8],b[11:8],c_out2,over2); cla4 u4(sum4,c_out4,a[15:12],b[15:12],c_out3,over3); assign sum [3:0]=sum1; assign sum [7:4]=sum2; assign sum [11:8]=sum3; assign sum [15:12]=sum4; 9 [Gizli] assign overflag=(a[15]&b[15]&~sum[15]) |( ~a[15]&~b[15]&sum [15]); //assign overflag=over3; assign c_out = c_out4; endmodule Cla4.v module cla4(sum,c_out,a,b,c_in,overflag); output [3:0] sum; output c_out,overflag; input [3:0] a,b; input c_in; wire p0,g0,p1,g1,p2,g2,p3,g3; wire c4,c3,c2,c1,c_in; //assign c_in= 1'b0; assign p0= a[0] ^ b[0]; assign p1= a[1] ^ b[1]; assign p2= a[2] ^ b[2]; assign p3= a[3] ^ b[3]; assign g0= a[0] & b[0], g1= a[1] & b[1], g2= a[2] & b[2], g3= a[3] & b[3]; assign c1=g0 | (p0 & c_in), c2=g1 | (p1 & g0) | (p1 & p0 & c_in), c3= g2 | (p2 & g1) | (p2 & p1 & g0) | (p2 & p1 & p0 & c_in), c4= g3 | (p3&g2) | (p3&p2&g1) | (p3&p2&p1&g0) | (p3 & p2 & p1 & p0 & c_in) ; 10 [Gizli] assign sum[0] = p0 ^ c_in , sum[1] = p1 ^ c1 , sum[2] = p2 ^ c2 , sum[3] = p3 ^ c3 , c_out = c4, overflag=c3; endmodule ÇARPMA BĠRĠMĠ Çarpma Birimi belirli bir çarpım algoritmasını gerçekleĢtirecek bir devredir. Karatsuba Algoritması (1962) : 2320 den büyük sayıların çarpımında etkilidir. Toom - Cook(1966) : Orta büyüklükteki sayıların çarpımında etkili olan bir algoritmadır. Schönhage – Strassen (1971) : Büyük boyutlu sayıların çarpımında en etkili algoritmadır. 217 den büyük sayılarda etkili olduğu için değerlendirilmemiĢtir. FFT kullanılan bir Ģekli de mevcuttur. Booth Algoritması (1951) : Booth çarpım algoritması iĢaretli sayıları 2’ye tümleyen Ģeklinde çarpan bir algoritmadır. CSA Çarpım algoritması : (Carry Selected Adder) Çarpımın toplamalar üzerinden yapılığı bir algoritmadır ancak elde değerlerinin önceden hesaplanıp seçimi yapılması ile hız kazanır. Kasırga iĢlemcisinde CSA algoritması kullanılmıĢtır. Algoritmayı gerçekleĢtiren kodlar ve devre Ģeması aĢağıda gösterilmiĢtir. 11 [Gizli] Çarpıcı ġeması 12 [Gizli] 256 Ara çarpma hücresinden birinin Ģeması 16 bitlik çarpıcı 13 [Gizli] Csa_carpici.v module multiplication_16(x,y,su,outHi,outLo,zr,sgn,clk); input [15:0] x,y; input clk; input su; output [15:0] outHi,outLo; output zr,sgn; reg [15:0] outHi_r,outLo_r; reg zr_r,sgn_r; wire [31:0] sonuc; wire [15:0] satir1_s, satir1_c,satir2_s, satir2_c, satir3_s, satir3_c, satir4_s, satir4_c; wire [15:0] satir5_s, satir5_c,satir6_s, satir6_c, satir7_s, satir7_c, satir8_s, satir8_c; wire [15:0] satir9_s, satir9_c,satir10_s, satir10_c, satir11_s, satir11_c, satir12_s, satir12_c; wire [15:0] satir13_s, satir13_c,satir14_s, satir14_c, satir15_s, satir15_c, satir16_s, satir16_c; wire [13:0] ha_ara; //csa_hucre(toplam,elde,giren_toplam,giren_elde,a,b) //satır1 csa_hucre CSA1(satir1_s[0],satir1_c[0],1'b0,1'b0,x[0],y[0]); csa_hucre CSA2(satir1_s[1],satir1_c[1],1'b0,1'b0,x[1],y[0]); csa_hucre CSA3(satir1_s[2],satir1_c[2],1'b0,1'b0,x[2],y[0]); csa_hucre CSA4(satir1_s[3],satir1_c[3],1'b0,1'b0,x[3],y[0]); csa_hucre CSA5(satir1_s[4],satir1_c[4],1'b0,1'b0,x[4],y[0]); csa_hucre CSA6(satir1_s[5],satir1_c[5],1'b0,1'b0,x[5],y[0]); csa_hucre CSA7(satir1_s[6],satir1_c[6],1'b0,1'b0,x[6],y[0]); csa_hucre CSA8(satir1_s[7],satir1_c[7],1'b0,1'b0,x[7],y[0]); csa_hucre CSA9(satir1_s[8],satir1_c[8],1'b0,1'b0,x[8],y[0]); csa_hucre CSA10(satir1_s[9],satir1_c[9],1'b0,1'b0,x[9],y[0]); csa_hucre CSA11(satir1_s[10],satir1_c[10],1'b0,1'b0,x[10],y[0]); [Gizli] csa_hucre CSA12(satir1_s[11],satir1_c[11],1'b0,1'b0,x[11],y[0]); csa_hucre CSA13(satir1_s[12],satir1_c[12],1'b0,1'b0,x[12],y[0]); csa_hucre CSA14(satir1_s[13],satir1_c[13],1'b0,1'b0,x[13],y[0]); csa_hucre CSA15(satir1_s[14],satir1_c[14],1'b0,1'b0,x[14],y[0]); csa_hucre CSA16(satir1_s[15],satir1_c[15],1'b0,1'b0,x[15],y[0]); //satır2 csa_hucre CSA17(satir2_s[0],satir2_c[0],satir1_s[1],satir1_c[0],x[0],y[1]); csa_hucre CSA18(satir2_s[1],satir2_c[1],satir1_s[2],satir1_c[1],x[1],y[1]); csa_hucre CSA19(satir2_s[2],satir2_c[2],satir1_s[3],satir1_c[2],x[2],y[1]); csa_hucre CSA20(satir2_s[3],satir2_c[3],satir1_s[4],satir1_c[3],x[3],y[1]); csa_hucre CSA21(satir2_s[4],satir2_c[4],satir1_s[5],satir1_c[4],x[4],y[1]); csa_hucre CSA22(satir2_s[5],satir2_c[5],satir1_s[6],satir1_c[5],x[5],y[1]); csa_hucre CSA23(satir2_s[6],satir2_c[6],satir1_s[7],satir1_c[6],x[6],y[1]); csa_hucre CSA24(satir2_s[7],satir2_c[7],satir1_s[8],satir1_c[7],x[7],y[1]); csa_hucre CSA25(satir2_s[8],satir2_c[8],satir1_s[9],satir1_c[8],x[8],y[1]); csa_hucre CSA26(satir2_s[9],satir2_c[9],satir1_s[10],satir1_c[9],x[9],y[1]); csa_hucre CSA27(satir2_s[10],satir2_c[10],satir1_s[11],satir1_c[10],x[10],y[1]); csa_hucre CSA28(satir2_s[11],satir2_c[11],satir1_s[12],satir1_c[11],x[11],y[1]); csa_hucre CSA29(satir2_s[12],satir2_c[12],satir1_s[13],satir1_c[12],x[12],y[1]); csa_hucre CSA30(satir2_s[13],satir2_c[13],satir1_s[14],satir1_c[13],x[13],y[1]); csa_hucre CSA31(satir2_s[14],satir2_c[14],satir1_s[15],satir1_c[14],x[14],y[1]); csa_hucre CSA32(satir2_s[15],satir2_c[15],1'b0,satir1_c[15],x[15],y[1]); 15 [Gizli] //satır3 csa_hucre CSA33(satir3_s[0],satir3_c[0],satir2_s[1],satir2_c[0],x[0],y[2]); csa_hucre CSA34(satir3_s[1],satir3_c[1],satir2_s[2],satir2_c[1],x[1],y[2]); csa_hucre CSA35(satir3_s[2],satir3_c[2],satir2_s[3],satir2_c[2],x[2],y[2]); csa_hucre CSA36(satir3_s[3],satir3_c[3],satir2_s[4],satir2_c[3],x[3],y[2]); csa_hucre CSA37(satir3_s[4],satir3_c[4],satir2_s[5],satir2_c[4],x[4],y[2]); csa_hucre CSA38(satir3_s[5],satir3_c[5],satir2_s[6],satir2_c[5],x[5],y[2]); csa_hucre CSA39(satir3_s[6],satir3_c[6],satir2_s[7],satir2_c[6],x[6],y[2]); csa_hucre CSA40(satir3_s[7],satir3_c[7],satir2_s[8],satir2_c[7],x[7],y[2]); csa_hucre CSA41(satir3_s[8],satir3_c[8],satir2_s[9],satir2_c[8],x[8],y[2]); csa_hucre CSA42(satir3_s[9],satir3_c[9],satir2_s[10],satir2_c[9],x[9],y[2]); csa_hucre CSA43(satir3_s[10],satir3_c[10],satir2_s[11],satir2_c[10],x[10],y[2]); csa_hucre CSA44(satir3_s[11],satir3_c[11],satir2_s[12],satir2_c[11],x[11],y[2]); csa_hucre CSA45(satir3_s[12],satir3_c[12],satir2_s[13],satir2_c[12],x[12],y[2]); csa_hucre CSA46(satir3_s[13],satir3_c[13],satir2_s[14],satir2_c[13],x[13],y[2]); csa_hucre CSA47(satir3_s[14],satir3_c[14],satir2_s[15],satir2_c[14],x[14],y[2]); csa_hucre CSA48(satir3_s[15],satir3_c[15],1'b0,satir2_c[15],x[15],y[2]); //satır4 csa_hucre CSA49(satir4_s[0],satir4_c[0],satir3_s[1],satir3_c[0],x[0],y[3]); csa_hucre CSA50(satir4_s[1],satir4_c[1],satir3_s[2],satir3_c[1],x[1],y[3]); csa_hucre CSA51(satir4_s[2],satir4_c[2],satir3_s[3],satir3_c[2],x[2],y[3]); 16 [Gizli] csa_hucre CSA52(satir4_s[3],satir4_c[3],satir3_s[4],satir3_c[3],x[3],y[3]); csa_hucre CSA53(satir4_s[4],satir4_c[4],satir3_s[5],satir3_c[4],x[4],y[3]); csa_hucre CSA54(satir4_s[5],satir4_c[5],satir3_s[6],satir3_c[5],x[5],y[3]); csa_hucre CSA55(satir4_s[6],satir4_c[6],satir3_s[7],satir3_c[6],x[6],y[3]); csa_hucre CSA56(satir4_s[7],satir4_c[7],satir3_s[8],satir3_c[7],x[7],y[3]); csa_hucre CSA57(satir4_s[8],satir4_c[8],satir3_s[9],satir3_c[8],x[8],y[3]); csa_hucre CSA58(satir4_s[9],satir4_c[9],satir3_s[10],satir3_c[9],x[9],y[3]); csa_hucre CSA59(satir4_s[10],satir4_c[10],satir3_s[11],satir3_c[10],x[10],y[3]); csa_hucre CSA60(satir4_s[11],satir4_c[11],satir3_s[12],satir3_c[11],x[11],y[3]); csa_hucre CSA61(satir4_s[12],satir4_c[12],satir3_s[13],satir3_c[12],x[12],y[3]); csa_hucre CSA62(satir4_s[13],satir4_c[13],satir3_s[14],satir3_c[13],x[13],y[3]); csa_hucre CSA63(satir4_s[14],satir4_c[14],satir3_s[15],satir3_c[14],x[14],y[3]); csa_hucre CSA64(satir4_s[15],satir4_c[15],1'b0,satir3_c[15],x[15],y[3]); //satır5 csa_hucre CSA65(satir5_s[0],satir5_c[0],satir4_s[1],satir4_c[0],x[0],y[4]); csa_hucre CSA66(satir5_s[1],satir5_c[1],satir4_s[2],satir4_c[1],x[1],y[4]); csa_hucre CSA67(satir5_s[2],satir5_c[2],satir4_s[3],satir4_c[2],x[2],y[4]); csa_hucre CSA68(satir5_s[3],satir5_c[3],satir4_s[4],satir4_c[3],x[3],y[4]); csa_hucre CSA69(satir5_s[4],satir5_c[4],satir4_s[5],satir4_c[4],x[4],y[4]); csa_hucre CSA70(satir5_s[5],satir5_c[5],satir4_s[6],satir4_c[5],x[5],y[4]); csa_hucre 17 [Gizli] CSA71(satir5_s[6],satir5_c[6],satir4_s[7],satir4_c[6],x[6],y[4]); csa_hucre CSA72(satir5_s[7],satir5_c[7],satir4_s[8],satir4_c[7],x[7],y[4]); csa_hucre CSA73(satir5_s[8],satir5_c[8],satir4_s[9],satir4_c[8],x[8],y[4]); csa_hucre CSA74(satir5_s[9],satir5_c[9],satir4_s[10],satir4_c[9],x[9],y[4]); csa_hucre CSA75(satir5_s[10],satir5_c[10],satir4_s[11],satir4_c[10],x[10],y[4]); csa_hucre CSA76(satir5_s[11],satir5_c[11],satir4_s[12],satir4_c[11],x[11],y[4]); csa_hucre CSA77(satir5_s[12],satir5_c[12],satir4_s[13],satir4_c[12],x[12],y[4]); csa_hucre CSA78(satir5_s[13],satir5_c[13],satir4_s[14],satir4_c[13],x[13],y[4]); csa_hucre CSA79(satir5_s[14],satir5_c[14],satir4_s[15],satir4_c[14],x[14],y[4]); csa_hucre CSA80(satir5_s[15],satir5_c[15],1'b0,satir4_c[15],x[15],y[4]); //satır6 csa_hucre CSA81(satir6_s[0],satir6_c[0],satir5_s[1],satir5_c[0],x[0],y[5]); csa_hucre CSA82(satir6_s[1],satir6_c[1],satir5_s[2],satir5_c[1],x[1],y[5]); csa_hucre CSA83(satir6_s[2],satir6_c[2],satir5_s[3],satir5_c[2],x[2],y[5]); csa_hucre CSA84(satir6_s[3],satir6_c[3],satir5_s[4],satir5_c[3],x[3],y[5]); csa_hucre CSA85(satir6_s[4],satir6_c[4],satir5_s[5],satir5_c[4],x[4],y[5]); csa_hucre CSA86(satir6_s[5],satir6_c[5],satir5_s[6],satir5_c[5],x[5],y[5]); csa_hucre CSA87(satir6_s[6],satir6_c[6],satir5_s[7],satir5_c[6],x[6],y[5]); csa_hucre CSA88(satir6_s[7],satir6_c[7],satir5_s[8],satir5_c[7],x[7],y[5]); csa_hucre CSA89(satir6_s[8],satir6_c[8],satir5_s[9],satir5_c[8],x[8],y[5]); csa_hucre CSA90(satir6_s[9],satir6_c[9],satir5_s[10],satir5_c[9],x[9],y[5]); 18 [Gizli] csa_hucre CSA91(satir6_s[10],satir6_c[10],satir5_s[11],satir5_c[10],x[10],y[5]); csa_hucre CSA92(satir6_s[11],satir6_c[11],satir5_s[12],satir5_c[11],x[11],y[5]); csa_hucre CSA93(satir6_s[12],satir6_c[12],satir5_s[13],satir5_c[12],x[12],y[5]); csa_hucre CSA94(satir6_s[13],satir6_c[13],satir5_s[14],satir5_c[13],x[13],y[5]); csa_hucre CSA95(satir6_s[14],satir6_c[14],satir5_s[15],satir5_c[14],x[14],y[5]); csa_hucre CSA96(satir6_s[15],satir6_c[15],1'b0,satir5_c[15],x[15],y[5]); //satır7 csa_hucre CSA97(satir7_s[0],satir7_c[0],satir6_s[1],satir6_c[0],x[0],y[6]); csa_hucre CSA98(satir7_s[1],satir7_c[1],satir6_s[2],satir6_c[1],x[1],y[6]); csa_hucre CSA99(satir7_s[2],satir7_c[2],satir6_s[3],satir6_c[2],x[2],y[6]); csa_hucre CSA100(satir7_s[3],satir7_c[3],satir6_s[4],satir6_c[3],x[3],y[6]); csa_hucre CSA101(satir7_s[4],satir7_c[4],satir6_s[5],satir6_c[4],x[4],y[6]); csa_hucre CSA102(satir7_s[5],satir7_c[5],satir6_s[6],satir6_c[5],x[5],y[6]); csa_hucre CSA103(satir7_s[6],satir7_c[6],satir6_s[7],satir6_c[6],x[6],y[6]); csa_hucre CSA104(satir7_s[7],satir7_c[7],satir6_s[8],satir6_c[7],x[7],y[6]); csa_hucre CSA105(satir7_s[8],satir7_c[8],satir6_s[9],satir6_c[8],x[8],y[6]); csa_hucre CSA106(satir7_s[9],satir7_c[9],satir6_s[10],satir6_c[9],x[9],y[6]); csa_hucre CSA107(satir7_s[10],satir7_c[10],satir6_s[11],satir6_c[10],x[10],y[6]); csa_hucre CSA108(satir7_s[11],satir7_c[11],satir6_s[12],satir6_c[11],x[11],y[6]); csa_hucre CSA109(satir7_s[12],satir7_c[12],satir6_s[13],satir6_c[12],x[12],y[6]); csa_hucre 19 [Gizli] CSA110(satir7_s[13],satir7_c[13],satir6_s[14],satir6_c[13],x[13],y[6]); csa_hucre CSA111(satir7_s[14],satir7_c[14],satir6_s[15],satir6_c[14],x[14],y[6]); csa_hucre CSA112(satir7_s[15],satir7_c[15],1'b0,satir6_c[15],x[15],y[6]); //satır8 csa_hucre CSA113(satir8_s[0],satir8_c[0],satir7_s[1],satir7_c[0],x[0],y[7]); csa_hucre CSA114(satir8_s[1],satir8_c[1],satir7_s[2],satir7_c[1],x[1],y[7]); csa_hucre CSA115(satir8_s[2],satir8_c[2],satir7_s[3],satir7_c[2],x[2],y[7]); csa_hucre CSA116(satir8_s[3],satir8_c[3],satir7_s[4],satir7_c[3],x[3],y[7]); csa_hucre CSA117(satir8_s[4],satir8_c[4],satir7_s[5],satir7_c[4],x[4],y[7]); csa_hucre CSA118(satir8_s[5],satir8_c[5],satir7_s[6],satir7_c[5],x[5],y[7]); csa_hucre CSA119(satir8_s[6],satir8_c[6],satir7_s[7],satir7_c[6],x[6],y[7]); csa_hucre CSA120(satir8_s[7],satir8_c[7],satir7_s[8],satir7_c[7],x[7],y[7]); csa_hucre CSA121(satir8_s[8],satir8_c[8],satir7_s[9],satir7_c[8],x[8],y[7]); csa_hucre CSA122(satir8_s[9],satir8_c[9],satir7_s[10],satir7_c[9],x[9],y[7]); csa_hucre CSA123(satir8_s[10],satir8_c[10],satir7_s[11],satir7_c[10],x[10],y[7]); csa_hucre CSA124(satir8_s[11],satir8_c[11],satir7_s[12],satir7_c[11],x[11],y[7]); csa_hucre CSA125(satir8_s[12],satir8_c[12],satir7_s[13],satir7_c[12],x[12],y[7]); csa_hucre CSA126(satir8_s[13],satir8_c[13],satir7_s[14],satir7_c[13],x[13],y[7]); csa_hucre CSA127(satir8_s[14],satir8_c[14],satir7_s[15],satir7_c[14],x[14],y[7]); csa_hucre CSA128(satir8_s[15],satir8_c[15],1'b0,satir7_c[15],x[15],y[7]); //satır9 20 [Gizli] csa_hucre CSA129(satir9_s[0],satir9_c[0],satir8_s[1],satir8_c[0],x[0],y[8]); csa_hucre CSA130(satir9_s[1],satir9_c[1],satir8_s[2],satir8_c[1],x[1],y[8]); csa_hucre CSA131(satir9_s[2],satir9_c[2],satir8_s[3],satir8_c[2],x[2],y[8]); csa_hucre CSA132(satir9_s[3],satir9_c[3],satir8_s[4],satir8_c[3],x[3],y[8]); csa_hucre CSA133(satir9_s[4],satir9_c[4],satir8_s[5],satir8_c[4],x[4],y[8]); csa_hucre CSA134(satir9_s[5],satir9_c[5],satir8_s[6],satir8_c[5],x[5],y[8]); csa_hucre CSA135(satir9_s[6],satir9_c[6],satir8_s[7],satir8_c[6],x[6],y[8]); csa_hucre CSA136(satir9_s[7],satir9_c[7],satir8_s[8],satir8_c[7],x[7],y[8]); csa_hucre CSA137(satir9_s[8],satir9_c[8],satir8_s[9],satir8_c[8],x[8],y[8]); csa_hucre CSA138(satir9_s[9],satir9_c[9],satir8_s[10],satir8_c[9],x[9],y[8]); csa_hucre CSA139(satir9_s[10],satir9_c[10],satir8_s[11],satir8_c[10],x[10],y[8]); csa_hucre CSA140(satir9_s[11],satir9_c[11],satir8_s[12],satir8_c[11],x[11],y[8]); csa_hucre CSA141(satir9_s[12],satir9_c[12],satir8_s[13],satir8_c[12],x[12],y[8]); csa_hucre CSA142(satir9_s[13],satir9_c[13],satir8_s[14],satir8_c[13],x[13],y[8]); csa_hucre CSA143(satir9_s[14],satir9_c[14],satir8_s[15],satir8_c[14],x[14],y[8]); csa_hucre CSA144(satir9_s[15],satir9_c[15],1'b0,satir8_c[15],x[15],y[8]); //satır10 csa_hucre CSA145(satir10_s[0],satir10_c[0],satir9_s[1],satir9_c[0],x[0],y[9]); csa_hucre CSA146(satir10_s[1],satir10_c[1],satir9_s[2],satir9_c[1],x[1],y[9]); csa_hucre CSA147(satir10_s[2],satir10_c[2],satir9_s[3],satir9_c[2],x[2],y[9]); csa_hucre 21 [Gizli] CSA148(satir10_s[3],satir10_c[3],satir9_s[4],satir9_c[3],x[3],y[9]); csa_hucre CSA149(satir10_s[4],satir10_c[4],satir9_s[5],satir9_c[4],x[4],y[9]); csa_hucre CSA150(satir10_s[5],satir10_c[5],satir9_s[6],satir9_c[5],x[5],y[9]); csa_hucre CSA151(satir10_s[6],satir10_c[6],satir9_s[7],satir9_c[6],x[6],y[9]); csa_hucre CSA152(satir10_s[7],satir10_c[7],satir9_s[8],satir9_c[7],x[7],y[9]); csa_hucre CSA153(satir10_s[8],satir10_c[8],satir9_s[9],satir9_c[8],x[8],y[9]); csa_hucre CSA154(satir10_s[9],satir10_c[9],satir9_s[10],satir9_c[9],x[9],y[9]); csa_hucre CSA155(satir10_s[10],satir10_c[10],satir9_s[11],satir9_c[10],x[10],y[9]); csa_hucre CSA156(satir10_s[11],satir10_c[11],satir9_s[12],satir9_c[11],x[11],y[9]); csa_hucre CSA157(satir10_s[12],satir10_c[12],satir9_s[13],satir9_c[12],x[12],y[9]); csa_hucre CSA158(satir10_s[13],satir10_c[13],satir9_s[14],satir9_c[13],x[13],y[9]); csa_hucre CSA159(satir10_s[14],satir10_c[14],satir9_s[15],satir9_c[14],x[14],y[9]); csa_hucre CSA160(satir10_s[15],satir10_c[15],1'b0,satir9_c[15],x[15],y[9]); //satır11 csa_hucre CSA161(satir11_s[0],satir11_c[0],satir10_s[1],satir10_c[0],x[0],y[10]); csa_hucre CSA162(satir11_s[1],satir11_c[1],satir10_s[2],satir10_c[1],x[1],y[10]); csa_hucre CSA163(satir11_s[2],satir11_c[2],satir10_s[3],satir10_c[2],x[2],y[10]); csa_hucre CSA164(satir11_s[3],satir11_c[3],satir10_s[4],satir10_c[3],x[3],y[10]); csa_hucre CSA165(satir11_s[4],satir11_c[4],satir10_s[5],satir10_c[4],x[4],y[10]); csa_hucre CSA166(satir11_s[5],satir11_c[5],satir10_s[6],satir10_c[5],x[5],y[10]); csa_hucre CSA167(satir11_s[6],satir11_c[6],satir10_s[7],satir10_c[6],x[6],y[10]); 22 [Gizli] csa_hucre CSA168(satir11_s[7],satir11_c[7],satir10_s[8],satir10_c[7],x[7],y[10]); csa_hucre CSA169(satir11_s[8],satir11_c[8],satir10_s[9],satir10_c[8],x[8],y[10]); csa_hucre CSA170(satir11_s[9],satir11_c[9],satir10_s[10],satir10_c[9],x[9],y[10]); csa_hucre CSA171(satir11_s[10],satir11_c[10],satir10_s[11],satir10_c[10],x[10],y[10]); csa_hucre CSA172(satir11_s[11],satir11_c[11],satir10_s[12],satir10_c[11],x[11],y[10]); csa_hucre CSA173(satir11_s[12],satir11_c[12],satir10_s[13],satir10_c[12],x[12],y[10]); csa_hucre CSA174(satir11_s[13],satir11_c[13],satir10_s[14],satir10_c[13],x[13],y[10]); csa_hucre CSA175(satir11_s[14],satir11_c[14],satir10_s[15],satir10_c[14],x[14],y[10]); csa_hucre CSA176(satir11_s[15],satir11_c[15],1'b0,satir10_c[15],x[15],y[10]); //satır12 csa_hucre CSA177(satir12_s[0],satir12_c[0],satir11_s[1],satir11_c[0],x[0],y[11]); csa_hucre CSA178(satir12_s[1],satir12_c[1],satir11_s[2],satir11_c[1],x[1],y[11]); csa_hucre CSA179(satir12_s[2],satir12_c[2],satir11_s[3],satir11_c[2],x[2],y[11]); csa_hucre CSA180(satir12_s[3],satir12_c[3],satir11_s[4],satir11_c[3],x[3],y[11]); csa_hucre CSA181(satir12_s[4],satir12_c[4],satir11_s[5],satir11_c[4],x[4],y[11]); csa_hucre CSA182(satir12_s[5],satir12_c[5],satir11_s[6],satir11_c[5],x[5],y[11]); csa_hucre CSA183(satir12_s[6],satir12_c[6],satir11_s[7],satir11_c[6],x[6],y[11]); csa_hucre CSA184(satir12_s[7],satir12_c[7],satir11_s[8],satir11_c[7],x[7],y[11]); csa_hucre CSA185(satir12_s[8],satir12_c[8],satir11_s[9],satir11_c[8],x[8],y[11]); csa_hucre CSA186(satir12_s[9],satir12_c[9],satir11_s[10],satir11_c[9],x[9],y[11]); csa_hucre 23 [Gizli] CSA187(satir12_s[10],satir12_c[10],satir11_s[11],satir11_c[10],x[10],y[11]); csa_hucre CSA188(satir12_s[11],satir12_c[11],satir11_s[12],satir11_c[11],x[11],y[11]); csa_hucre CSA189(satir12_s[12],satir12_c[12],satir11_s[13],satir11_c[12],x[12],y[11]); csa_hucre CSA190(satir12_s[13],satir12_c[13],satir11_s[14],satir11_c[13],x[13],y[11]); csa_hucre CSA191(satir12_s[14],satir12_c[14],satir11_s[15],satir11_c[14],x[14],y[11]); csa_hucre CSA192(satir12_s[15],satir12_c[15],1'b0,satir11_c[15],x[15],y[11]); //satır13 csa_hucre CSA193(satir13_s[0],satir13_c[0],satir12_s[1],satir12_c[0],x[0],y[12]); csa_hucre CSA194(satir13_s[1],satir13_c[1],satir12_s[2],satir12_c[1],x[1],y[12]); csa_hucre CSA195(satir13_s[2],satir13_c[2],satir12_s[3],satir12_c[2],x[2],y[12]); csa_hucre CSA196(satir13_s[3],satir13_c[3],satir12_s[4],satir12_c[3],x[3],y[12]); csa_hucre CSA197(satir13_s[4],satir13_c[4],satir12_s[5],satir12_c[4],x[4],y[12]); csa_hucre CSA198(satir13_s[5],satir13_c[5],satir12_s[6],satir12_c[5],x[5],y[12]); csa_hucre CSA199(satir13_s[6],satir13_c[6],satir12_s[7],satir12_c[6],x[6],y[12]); csa_hucre CSA200(satir13_s[7],satir13_c[7],satir12_s[8],satir12_c[7],x[7],y[12]); csa_hucre CSA201(satir13_s[8],satir13_c[8],satir12_s[9],satir12_c[8],x[8],y[12]); csa_hucre CSA202(satir13_s[9],satir13_c[9],satir12_s[10],satir12_c[9],x[9],y[12]); csa_hucre CSA203(satir13_s[10],satir13_c[10],satir12_s[11],satir12_c[10],x[10],y[12]); csa_hucre CSA204(satir13_s[11],satir13_c[11],satir12_s[12],satir12_c[11],x[11],y[12]); csa_hucre CSA205(satir13_s[12],satir13_c[12],satir12_s[13],satir12_c[12],x[12],y[12]); csa_hucre CSA206(satir13_s[13],satir13_c[13],satir12_s[14],satir12_c[13],x[13],y[12]); 24 [Gizli] csa_hucre CSA207(satir13_s[14],satir13_c[14],satir12_s[15],satir12_c[14],x[14],y[12]); csa_hucre CSA208(satir13_s[15],satir13_c[15],1'b0,satir12_c[15],x[15],y[12]); //satır14 csa_hucre CSA209(satir14_s[0],satir14_c[0],satir13_s[1],satir13_c[0],x[0],y[13]); csa_hucre CSA210(satir14_s[1],satir14_c[1],satir13_s[2],satir13_c[1],x[1],y[13]); csa_hucre CSA211(satir14_s[2],satir14_c[2],satir13_s[3],satir13_c[2],x[2],y[13]); csa_hucre CSA212(satir14_s[3],satir14_c[3],satir13_s[4],satir13_c[3],x[3],y[13]); csa_hucre CSA213(satir14_s[4],satir14_c[4],satir13_s[5],satir13_c[4],x[4],y[13]); csa_hucre CSA214(satir14_s[5],satir14_c[5],satir13_s[6],satir13_c[5],x[5],y[13]); csa_hucre CSA215(satir14_s[6],satir14_c[6],satir13_s[7],satir13_c[6],x[6],y[13]); csa_hucre CSA216(satir14_s[7],satir14_c[7],satir13_s[8],satir13_c[7],x[7],y[13]); csa_hucre CSA217(satir14_s[8],satir14_c[8],satir13_s[9],satir13_c[8],x[8],y[13]); csa_hucre CSA218(satir14_s[9],satir14_c[9],satir13_s[10],satir13_c[9],x[9],y[13]); csa_hucre CSA219(satir14_s[10],satir14_c[10],satir13_s[11],satir13_c[10],x[10],y[13]); csa_hucre CSA220(satir14_s[11],satir14_c[11],satir13_s[12],satir13_c[11],x[11],y[13]); csa_hucre CSA221(satir14_s[12],satir14_c[12],satir13_s[13],satir13_c[12],x[12],y[13]); csa_hucre CSA222(satir14_s[13],satir14_c[13],satir13_s[14],satir13_c[13],x[13],y[13]); csa_hucre CSA223(satir14_s[14],satir14_c[14],satir13_s[15],satir13_c[14],x[14],y[13]); csa_hucre CSA224(satir14_s[15],satir14_c[15],1'b0,satir13_c[15],x[15],y[13]); //satır15 csa_hucre 25 [Gizli] CSA225(satir15_s[0],satir15_c[0],satir14_s[1],satir14_c[0],x[0],y[14]); csa_hucre CSA226(satir15_s[1],satir15_c[1],satir14_s[2],satir14_c[1],x[1],y[14]); csa_hucre CSA227(satir15_s[2],satir15_c[2],satir14_s[3],satir14_c[2],x[2],y[14]); csa_hucre CSA228(satir15_s[3],satir15_c[3],satir14_s[4],satir14_c[3],x[3],y[14]); csa_hucre CSA229(satir15_s[4],satir15_c[4],satir14_s[5],satir14_c[4],x[4],y[14]); csa_hucre CSA230(satir15_s[5],satir15_c[5],satir14_s[6],satir14_c[5],x[5],y[14]); csa_hucre CSA231(satir15_s[6],satir15_c[6],satir14_s[7],satir14_c[6],x[6],y[14]); csa_hucre CSA232(satir15_s[7],satir15_c[7],satir14_s[8],satir14_c[7],x[7],y[14]); csa_hucre CSA233(satir15_s[8],satir15_c[8],satir14_s[9],satir14_c[8],x[8],y[14]); csa_hucre CSA234(satir15_s[9],satir15_c[9],satir14_s[10],satir14_c[9],x[9],y[14]); csa_hucre CSA235(satir15_s[10],satir15_c[10],satir14_s[11],satir14_c[10],x[10],y[14]); csa_hucre CSA236(satir15_s[11],satir15_c[11],satir14_s[12],satir14_c[11],x[11],y[14]); csa_hucre CSA237(satir15_s[12],satir15_c[12],satir14_s[13],satir14_c[12],x[12],y[14]); csa_hucre CSA238(satir15_s[13],satir15_c[13],satir14_s[14],satir14_c[13],x[13],y[14]); csa_hucre CSA239(satir15_s[14],satir15_c[14],satir14_s[15],satir14_c[14],x[14],y[14]); csa_hucre CSA240(satir15_s[15],satir15_c[15],1'b0,satir14_c[15],x[15],y[14]); //satır16 csa_hucre CSA241(satir16_s[0],satir16_c[0],satir15_s[1],satir15_c[0],x[0],y[15]); csa_hucre CSA242(satir16_s[1],satir16_c[1],satir15_s[2],satir15_c[1],x[1],y[15]); csa_hucre CSA243(satir16_s[2],satir16_c[2],satir15_s[3],satir15_c[2],x[2],y[15]); csa_hucre CSA244(satir16_s[3],satir16_c[3],satir15_s[4],satir15_c[3],x[3],y[15]); 26 [Gizli] csa_hucre CSA245(satir16_s[4],satir16_c[4],satir15_s[5],satir15_c[4],x[4],y[15]); csa_hucre CSA246(satir16_s[5],satir16_c[5],satir15_s[6],satir15_c[5],x[5],y[15]); csa_hucre CSA247(satir16_s[6],satir16_c[6],satir15_s[7],satir15_c[6],x[6],y[15]); csa_hucre CSA248(satir16_s[7],satir16_c[7],satir15_s[8],satir15_c[7],x[7],y[15]); csa_hucre CSA249(satir16_s[8],satir16_c[8],satir15_s[9],satir15_c[8],x[8],y[15]); csa_hucre CSA250(satir16_s[9],satir16_c[9],satir15_s[10],satir15_c[9],x[9],y[15]); csa_hucre CSA251(satir16_s[10],satir16_c[10],satir15_s[11],satir15_c[10],x[10],y[15]); csa_hucre CSA252(satir16_s[11],satir16_c[11],satir15_s[12],satir15_c[11],x[11],y[15]); csa_hucre CSA253(satir16_s[12],satir16_c[12],satir15_s[13],satir15_c[12],x[12],y[15]); csa_hucre CSA254(satir16_s[13],satir16_c[13],satir15_s[14],satir15_c[13],x[13],y[15]); csa_hucre CSA255(satir16_s[14],satir16_c[14],satir15_s[15],satir15_c[14],x[14],y[15]); csa_hucre CSA256(satir16_s[15],satir16_c[15],1'b0,satir15_c[15],x[15],y[15]); assign sonuc[0] = satir1_s[0]; assign sonuc[1] = satir2_s[0]; assign sonuc[2] = satir3_s[0]; assign sonuc[3] = satir4_s[0]; assign sonuc[4] = satir5_s[0]; assign sonuc[5] = satir6_s[0]; assign sonuc[6] = satir7_s[0]; assign sonuc[7] = satir8_s[0]; assign sonuc[8] = satir9_s[0]; assign sonuc[9] = satir10_s[0]; assign sonuc[10] = satir11_s[0]; assign sonuc[11] = satir12_s[0]; assign sonuc[12] = satir13_s[0]; assign sonuc[13] = satir14_s[0]; assign sonuc[14] = satir15_s[0]; assign sonuc[15] = satir16_s[0]; 27 [Gizli] // full adder basamağı // full_adder(sum,cout,a,b,cin) full_adder FA1(sonuc[16],ha_ara[0],satir16_s[1],satir16_c[0],1'b0); full_adder FA2(sonuc[17],ha_ara[1],satir16_s[2],satir16_c[1],ha_ara[0]); full_adder FA3(sonuc[18],ha_ara[2],satir16_s[3],satir16_c[2],ha_ara[1]); full_adder FA4(sonuc[19],ha_ara[3],satir16_s[4],satir16_c[3],ha_ara[2]); full_adder FA5(sonuc[20],ha_ara[4],satir16_s[5],satir16_c[4],ha_ara[3]); full_adder FA6(sonuc[21],ha_ara[5],satir16_s[6],satir16_c[5],ha_ara[4]); full_adder FA7(sonuc[22],ha_ara[6],satir16_s[7],satir16_c[6],ha_ara[5]); full_adder FA8(sonuc[23],ha_ara[7],satir16_s[8],satir16_c[7],ha_ara[6]); full_adder FA9(sonuc[24],ha_ara[8],satir16_s[9],satir16_c[8],ha_ara[7]); full_adder FA10(sonuc[25],ha_ara[9],satir16_s[10],satir16_c[9],ha_ara[8]); full_adder FA11(sonuc[26],ha_ara[10],satir16_s[11],satir16_c[10],ha_ara[9]); full_adder FA12(sonuc[27],ha_ara[11],satir16_s[12],satir16_c[11],ha_ara[10]); full_adder FA13(sonuc[28],ha_ara[12],satir16_s[13],satir16_c[12],ha_ara[11]); full_adder FA14(sonuc[29],ha_ara[13],satir16_s[14],satir16_c[13],ha_ara[12]); full_adder FA15(sonuc[31],sonuc[30],satir16_s[15],satir16_c[14],ha_ara[13]); always @ (posedge clk) begin outHi_r <= sonuc[31:16]; outLo_r <= sonuc[15:0]; zr_r <= !(|sonuc); sgn_r <= sonuc[31]; end 28 [Gizli] assign zr = zr_r; assign sgn = sgn_r; assign outHi = outHi_r; assign outLo = outLo_r; endmodule Csa_hucre.v module csa_hucre(toplam,elde,giren_toplam,giren_elde,a,b); input giren_toplam,giren_elde,a,b; output toplam,elde; wire ara; assign ara = a&b; full_adder FA(toplam,elde,ara,giren_toplam,giren_elde); endmodule Full_adder.v module full_adder(sum,cout,a,b,cin); output sum,cout; input a,b,cin; assign sum = a^b^cin; assign cout = (a&b)|(cin&(a|b)); endmodule 29 [Gizli] KAYDIRMA BĠRĠMĠ Kaydırma iĢlemi sağa/sola ve aritmetik/mantıksal olarak farklılaĢmıĢtır. Buna göre sağa aritmetik, sağa mantıksal ve sola aritmetik, sola mantıksal olmak üzere dört Ģekilde yapılabilir. Sağ ve sol kaydırmanın yönlerini bildirirken aritmetik ve mantıksal olması da kaydırmanın türünü bildirir. Kaydırıcı bloğu Sonucu seçmek için kullanılan 17 çoklayıcıdan biri 30 [Gizli] Kaydırıcı Devre ġeması 31 [Gizli] Shifter.v module shifter_16(reset,toShift,shifted,cAl,amount,cRl,zf,sf,clk); input [15:0] toShift; input [3:0] amount; input cAl; input cRl; input clk; input reset; output [15:0] shifted; output zf; output sf; reg [15:0] shifted_r; reg zf_r; reg sf_r; reg [4:0] cntrl; reg [1:0] ind; reg temp_cAl0; reg temp_cAl1; reg temp_cAl2; reg temp_cRl0; reg temp_cRl1; reg temp_cRl2; reg [31:0] in1,in2,in3,in4,in5,in6,in7,in8; reg [31:0] in9,in10,in11,in12,in13,in14,in15,in16; wire out1,out2,out3,out4,out5,out6,out7,out8; wire out9,out10,out11,out12,out13,out14,out15,out16; wire direc; always @ (posedge clk) 32 [Gizli] begin if(reset == 1'b0) begin in1 <= 0; in2 <= 0; in3 <= 0; in4 <= 0; in5 <= 0; in6 <= 0; in7 <= 0; in8 <= 0; in9 <= 0; in10 <= 0; in11 <= 0; in12 <= 0; in13 <= 0; in14 <= 0; in15 <= 0; in16 <= 0; cntrl <= 0; ind <= 0; temp_cAl0 <= 0; temp_cAl1 <= 0; temp_cAl2 <= 0; temp_cRl0 <= 0; temp_cRl1 <= 0; temp_cRl2 <= 0; end else begin temp_cAl0 <= cAl; temp_cAl1 <= temp_cAl0; temp_cAl2 <= temp_cAl1; temp_cRl0 <= cRl; temp_cRl1 <= temp_cRl0; 33 [Gizli] temp_cRl2 <= temp_cRl1; cntrl [4:0] <= {temp_cRl2,amount}; ind[0] <= 1'b0; ind[1] <= toShift[15]; in1[0] <= toShift[0]; in1[15:1] <= 15'h0; in1[16] <= toShift[0]; in1[17] <= toShift[1]; in1[18] <= toShift[2]; in1[19] <= toShift[3]; in1[20] <= toShift[4]; in1[21] <= toShift[5]; in1[22] <= toShift[6]; in1[23] <= toShift[7]; in1[24] <= toShift[8]; in1[25] <= toShift[9]; in1[26] <= toShift[10]; in1[27] <= toShift[11]; in1[28] <= toShift[12]; in1[29] <= toShift[13]; in1[30] <= toShift[14]; in1[31] <= toShift[15]; in2[0] <= toShift[1]; in2[1] <= toShift[0]; in2[15:2] <= 14'h0; in2[16] <= toShift[1]; in2[17] <= toShift[2]; in2[18] <= toShift[3]; in2[19] <= toShift[4]; in2[20] <= toShift[5]; in2[21] <= toShift[6]; in2[22] <= toShift[7]; in2[23] <= toShift[8]; in2[24] <= toShift[9]; in2[25] <= toShift[10]; in2[26] <= toShift[11]; 34 [Gizli] in2[27] <= toShift[12]; in2[28] <= toShift[13]; in2[29] <= toShift[14]; in2[30] <= toShift[15]; in2[31] <= direc; in3[0] <= toShift[2]; in3[1] <= toShift[1]; in3[2] <= toShift[0]; in3[15:3] <= 13'h0; in3[16] <= toShift[2]; in3[17] <= toShift[3]; in3[18] <= toShift[4]; in3[19] <= toShift[5]; in3[20] <= toShift[6]; in3[21] <= toShift[7]; in3[22] <= toShift[8]; in3[23] <= toShift[9]; in3[24] <= toShift[10]; in3[25] <= toShift[11]; in3[26] <= toShift[12]; in3[27] <= toShift[13]; in3[28] <= toShift[14]; in3[29] <= toShift[15]; in3[31:30] <= {2{direc}}; in4[0] <= toShift[3]; in4[1] <= toShift[2]; in4[2] <= toShift[1]; in4[3] <= toShift[0]; in4[15:4] <= 12'h0; in4[16] <= toShift[3]; in4[17] <= toShift[4]; in4[18] <= toShift[5]; in4[19] <= toShift[6]; in4[20] <= toShift[7]; in4[21] <= toShift[8]; in4[22] <= toShift[9]; in4[23] <= toShift[10]; in4[24] <= toShift[11]; 35 [Gizli] in4[25] <= toShift[12]; in4[26] <= toShift[13]; in4[27] <= toShift[14]; in4[28] <= toShift[15]; in4[31:29] <= {3{direc}}; in5[0] <= toShift[4]; in5[1] <= toShift[3]; in5[2] <= toShift[2]; in5[3] <= toShift[1]; in5[4] <= toShift[0]; in5[15:5] <= 11'h0; in5[16] <= toShift[4]; in5[17] <= toShift[5]; in5[18] <= toShift[6]; in5[19] <= toShift[7]; in5[20] <= toShift[8]; in5[21] <= toShift[9]; in5[22] <= toShift[10]; in5[23] <= toShift[11]; in5[24] <= toShift[12]; in5[25] <= toShift[13]; in5[26] <= toShift[14]; in5[27] <= toShift[15]; in5[31:28] <= {4{direc}}; in6[0] <= toShift[5]; in6[1] <= toShift[4]; in6[2] <= toShift[3]; in6[3] <= toShift[2]; in6[4] <= toShift[1]; in6[5] <= toShift[0]; in6[15:6] <= 10'h0; in6[16] <= toShift[5]; in6[17] <= toShift[6]; in6[18] <= toShift[7]; in6[19] <= toShift[8]; in6[20] <= toShift[9]; in6[21] <= toShift[10]; in6[22] <= toShift[11]; 36 [Gizli] in6[23] <= toShift[12]; in6[24] <= toShift[13]; in6[25] <= toShift[14]; in6[26] <= toShift[15]; in6[31:27] <= {5{direc}}; in7[0] <= toShift[6]; in7[1] <= toShift[5]; in7[2] <= toShift[4]; in7[3] <= toShift[3]; in7[4] <= toShift[2]; in7[5] <= toShift[1]; in7[6] <= toShift[0]; in7[15:7] <= 9'h0; in7[16] <= toShift[6]; in7[17] <= toShift[7]; in7[18] <= toShift[8]; in7[19] <= toShift[9]; in7[20] <= toShift[10]; in7[21] <= toShift[11]; in7[22] <= toShift[12]; in7[23] <= toShift[13]; in7[24] <= toShift[14]; in7[25] <= toShift[15]; in7[31:26] <= {6{direc}}; in8[0] <= toShift[7]; in8[1] <= toShift[6]; in8[2] <= toShift[5]; in8[3] <= toShift[4]; in8[4] <= toShift[3]; in8[5] <= toShift[2]; in8[6] <= toShift[1]; in8[7] <= toShift[0]; in8[15:8] <= 8'h0; in8[16] <= toShift[7]; in8[17] <= toShift[8]; in8[18] <= toShift[9]; in8[19] <= toShift[10]; in8[20] <= toShift[11]; 37 [Gizli] in8[21] <= toShift[12]; in8[22] <= toShift[13]; in8[23] <= toShift[14]; in8[24] <= toShift[15]; in8[31:25] <= {7{direc}}; in9[0] <= toShift[8]; in9[1] <= toShift[7]; in9[2] <= toShift[6]; in9[3] <= toShift[5]; in9[4] <= toShift[4]; in9[5] <= toShift[3]; in9[6] <= toShift[2]; in9[7] <= toShift[1]; in9[8] <= toShift[0]; in9[15:9] <= 7'h0; in9[16] <= toShift[8]; in9[17] <= toShift[9]; in9[18] <= toShift[10]; in9[19] <= toShift[11]; in9[20] <= toShift[12]; in9[21] <= toShift[13]; in9[22] <= toShift[14]; in9[23] <= toShift[15]; in9[31:24] <= {8{direc}}; in10[0] <= toShift[9]; in10[1] <= toShift[8]; in10[2] <= toShift[7]; in10[3] <= toShift[6]; in10[4] <= toShift[5]; in10[5] <= toShift[4]; in10[6] <= toShift[3]; in10[7] <= toShift[2]; in10[8] <= toShift[1]; in10[9] <= toShift[0]; in10[15:10] <= 6'h0; in10[16] <= toShift[9]; in10[17] <= toShift[10]; in10[18] <= toShift[11]; 38 [Gizli] in10[19] <= toShift[12]; in10[20] <= toShift[13]; in10[21] <= toShift[14]; in10[22] <= toShift[15]; in10[31:23] <= {9{direc}}; in11[0] <= toShift[10]; in11[1] <= toShift[9]; in11[2] <= toShift[8]; in11[3] <= toShift[7]; in11[4] <= toShift[6]; in11[5] <= toShift[5]; in11[6] <= toShift[4]; in11[7] <= toShift[3]; in11[8] <= toShift[2]; in11[9] <= toShift[1]; in11[10] <= toShift[0]; in11[15:11] <= 5'h0; in11[16] <= toShift[10]; in11[17] <= toShift[11]; in11[18] <= toShift[12]; in11[19] <= toShift[13]; in11[20] <= toShift[14]; in11[21] <= toShift[15]; in11[31:22] <= {10{direc}}; in12[0] <= toShift[11]; in12[1] <= toShift[10]; in12[2] <= toShift[9]; in12[3] <= toShift[8]; in12[4] <= toShift[7]; in12[5] <= toShift[6]; in12[6] <= toShift[5]; in12[7] <= toShift[4]; in12[8] <= toShift[3]; in12[9] <= toShift[2]; in12[10] <= toShift[1]; in12[11] <= toShift[0]; in12[15:12] <= 4'h0; in12[16] <= toShift[11]; 39 [Gizli] in12[17] <= toShift[12]; in12[18] <= toShift[13]; in12[19] <= toShift[14]; in12[20] <= toShift[15]; in12[31:21] <= {11{direc}}; in13[0] <= toShift[12]; in13[1] <= toShift[11]; in13[2] <= toShift[10]; in13[3] <= toShift[9]; in13[4] <= toShift[8]; in13[5] <= toShift[7]; in13[6] <= toShift[6]; in13[7] <= toShift[5]; in13[8] <= toShift[4]; in13[9] <= toShift[3]; in13[10] <= toShift[2]; in13[11] <= toShift[1]; in13[12] <= toShift[0]; in13[15:13] <= 3'h0; in13[16] <= toShift[12]; in13[17] <= toShift[13]; in13[18] <= toShift[14]; in13[19] <= toShift[15]; in13[31:20] <= {12{direc}}; in14[0] <= toShift[13]; in14[1] <= toShift[12]; in14[2] <= toShift[11]; in14[3] <= toShift[10]; in14[4] <= toShift[9]; in14[5] <= toShift[8]; in14[6] <= toShift[7]; in14[7] <= toShift[6]; in14[8] <= toShift[5]; in14[9] <= toShift[4]; in14[10] <= toShift[3]; in14[11] <= toShift[2]; in14[12] <= toShift[1]; in14[13] <= toShift[0]; 40 [Gizli] in14[15:14] <= 2'h0; in14[16] <= toShift[13]; in14[17] <= toShift[14]; in14[18] <= toShift[15]; in14[31:19] <= {13{direc}}; in15[0] <= toShift[14]; in15[1] <= toShift[13]; in15[2] <= toShift[12]; in15[3] <= toShift[11]; in15[4] <= toShift[10]; in15[5] <= toShift[9]; in15[6] <= toShift[8]; in15[7] <= toShift[7]; in15[8] <= toShift[6]; in15[9] <= toShift[5]; in15[10] <= toShift[4]; in15[11] <= toShift[3]; in15[12] <= toShift[2]; in15[13] <= toShift[1]; in15[14] <= toShift[0]; in15[15] <= 1'b0; in15[16] <= toShift[14]; in15[17] <= toShift[15]; in15[31:18] <= {14{direc}}; in16[0] <= toShift[15]; in16[1] <= toShift[14]; in16[2] <= toShift[13]; in16[3] <= toShift[12]; in16[4] <= toShift[11]; in16[5] <= toShift[10]; in16[6] <= toShift[9]; in16[7] <= toShift[8]; in16[8] <= toShift[7]; in16[9] <= toShift[6]; in16[10] <= toShift[5]; in16[11] <= toShift[4]; in16[12] <= toShift[3]; in16[13] <= toShift[2]; 41 [Gizli] in16[14] <= toShift[1]; in16[15] <= toShift[0]; in16[16] <= toShift[15]; in16[31:17] <= {15{direc}}; end end mux_32 mxx1(in1,out1,cntrl); mux_32 mxx2(in2,out2,cntrl); mux_32 mxx3(in3,out3,cntrl); mux_32 mxx4(in4,out4,cntrl); mux_32 mxx5(in5,out5,cntrl); mux_32 mxx6(in6,out6,cntrl); mux_32 mxx7(in7,out7,cntrl); mux_32 mxx8(in8,out8,cntrl); mux_32 mxx9(in9,out9,cntrl); mux_32 mxx10(in10,out10,cntrl); mux_32 mxx11(in11,out11,cntrl); mux_32 mxx12(in12,out12,cntrl); mux_32 mxx13(in13,out13,cntrl); mux_32 mxx14(in14,out14,cntrl); mux_32 mxx15(in15,out15,cntrl); mux_32 mxx16(in16,out16,cntrl); mux_2 mxx(ind,direc,temp_cAl2); assign shifted[0] = out1; assign shifted[1] = out2; assign shifted[2] = out3; assign shifted[3] = out4; assign shifted[4] = out5; assign shifted[5] = out6; assign shifted[6] = out7; assign shifted[7] = out8; assign shifted[8] = out9; assign shifted[9] = out10; assign shifted[10] = out11; 42 [Gizli] assign shifted[11] = out12; assign shifted[12] = out13; assign shifted[13] = out14; assign shifted[14] = out15; assign shifted[15] = out16; assign zf = !(|shifted); assign sf = out16; //assign zf = zf_r; //assign sf = sf_r; //assign shifted = shifted_r; endmodule Mux32.v module mux_32(in,out,sel); input [31:0] in; input [4:0] sel; output out; assign out=in[sel]; endmodule Mux2.v module mux_2(in,out,sel); input [1:0] in; input sel; output out; reg out_r; always @ (in or sel) begin 43 [Gizli] out_r <= in[sel]; end assign out=out_r; endmodule DENETĠM BĠRĠMĠ Denetim birimi iĢlemcinin çoklayıcıları ve diğer birimleri için denetim değerleri üreten bir birimdir. ĠĢlem bitleri ve bayraklar denetim biriminin giriĢleri, denetim değerleri ise denetim biriminin çıktılarıdır. YAZMAÇ ÖBEĞĠ Yazmaç öbeği sekiz satırlık onaltıĢar SRAM hücresinin birleĢiminden oluĢmaktadır. Birinci ve Ġkinci yoldan AMB, Çarpma ve Kaydırma birimlerine gelen değerlerle iĢlemler gerçekleĢtirilmektedir. Her birim iĢlemini bitirdikten sonra sonucunu veriyolunun sonunda bulunan çoklayıcıya gönderir. ĠĢlenen buyruğa göre sonuç değeri seçilerek yazmaçlara gönderilir. ĠĢlemler yapıldığı sırada bayrak bitleri de güncellenir. Ayrıca bayrak bitleri denetim birimine de gönderilerek Dallanma iĢlemlerinin yapılması sağlanır. Dallanma buyruklarının gerçekleĢtirilmesi için “sıfır” bayrak bitinden yararlanılır. Eğer bayrak bitinin değeri 1 ise ve BEQ buyruğu iĢletiliyorsa program sayacı önündeki çoklayıcıdan program sayacının iĢaretle geniĢletilmiĢ anlık değerle toplanmıĢ hali seçilir. Bu Ģekilde program sayacına anlık değerle gelen atlama miktarı eklenmiĢ olur. Anlık değer eksi ya da artı olarak seçilebilir. Artı seçilen anlık değer programın ileriye doğru, eksi seçilen ise geriye doğru atlamasını sağlar. Eğer BNE buyruğu iĢletiliyorsa ve sıfır bayrağı 0 ise PS için iĢaretle geniĢletilmiĢ anlık değerin PS ile toplanmıĢ hali seçilir. BA buyruğunda ise program sayacının değeri olarak anlık değerin iĢaretle geniĢletilmiĢ hali seçilir. Dallanma buyrukları haricinde PS değeri 1 artırılır. Bunun nedeni bellekte verilerin 16 bitlik kelimeler halinde durmasıdır. Yukarda verilen kodların hepsi çalĢır halde bulunan, kart üzerinde denenmiĢ kodlardır. Tüm birimler saat darbesi ile çalıĢmaktadır. 44 [Gizli] BELLEK GerçekleĢtirilecek iĢlemcinin belleği iki giriĢ ve iki çıkıĢtan oluĢmaktadır. Program sayacından gelecek buyruk adresleri için bir giriĢ, load ve store iĢlemlerindeki verilerin adresleri için bir giriĢ bulunmaktadır. Belleğin tek giriĢe değil de iki giriĢe sahip olmasının nedeni load ve store iĢlemlerinde veriyolunda buyruk iĢlenirken program sayacının artmasında sorun olmaması içindir. Ayrıca belleğin veri adresi ve buyruk adresleri için iki ayrı çıkıĢı bulunmaktadır. YAZMA Program sayacından gelen değerle bellekten alınan buyruk yazmaç öbeğine getirilir. Yazmaç öbeğine gelindiğinde Ra sonucun yazılacağı yazmacı gösterir, bu yazmaç herhangi bir yazmaç ya da birikeç olabilir. Birikeç ve diğer yazmaç arasında seçim yapabilmek için sonuç yazmacının adresinin verildiği giriĢe bir çoklayıcı bağlanmıĢtır. Bu çoklayıcının giriĢleri Ra’yı bildiren <5:7> arasındaki 3 bit ve birikecin adresini bildiren 000 bitleridir. Yazmaç öbeğinde bulunan “yaz” denetimi sonuç yazmacına gelen değerin yazılıp yazılmayacağını denetler. Eğer yaz denetimi etkinse sonuç yazmacı olarak seçilmiĢ olan birikeç ya da genel amaçlı yazmaca yazmaç öbeğinin Veri GiriĢinden giren değer yazılır. BUYRUK KÜMESİ ĠġLEMLER 00000 HLT 10000 SLL (D Tipi) 00001 SYSCALL 10001 SRL (D Tipi) 100: Kaydırma 00010 - Idle 10010 SLA (D Tipi) ĠĢlemleri 00011 - Idle 10011 SRA (D Tipi) 00100 ADD (Y Tipi) 10100 LW (D Tipi) 00101 SUB (Y Tipi) 00110 MUL (D Tipi) 001: Aritmetik ĠĢlemler 10101 SW (A Tipi) 10110 MOV (D Tipi) 00111 MULU (D Tipi) 10111 CMP (D Tipi) 01000 AND (Y Tipi) 11000 MOVI (A Tipi) 01001 OR (Y Tipi) 01010 NOT (D Tipi) 010: Mantık ĠĢlemleri 11001 ANDI (A Tipi) 11010 ORI (A Tipi) 01011 XOR (Y Tipi) 11011 XORI (A Tipi) 01100 BEQ (A Tipi) 11100 ADDI (A Tipi) 01101 BNE (A Tipi) 01110 BA (A Tipi) 01111 BL 011: Dallanma 11101 SUBI (A Tipi) ĠĢlemleri 11110 MULI (A Tipi) 11111 NOP (A Tipi) 101: Load, Store, Move ve Compare 110: Anlık Değer ile Mantık ve MOV 111: Anlık Değerle Aritmetik ĠĢlemler ve NOP 45 [Gizli] BUYRUK TÜRLERĠ A-TİPİ: 5 bit iĢlem için, diğer 11 bit ise anlık değer için ayrılmıĢtır. Anlık değer ile yapılan tüm iĢlemlerde bu buyruk türü kullanılmaktadır. Y-TİPİ: 5 bit iĢlem için, 3 adet 3’er bit ise Ra, Rb ve Rc yazmaçları için ayrılmıĢtır. Ra’ya Rb ve Rc yazmaçlarındaki veriler ile yapılan iĢlemin sonucu yazılır. Aritmetik iĢlemler iin kullanılmaktadır. D-TİPİ: 5 bit iĢlem için, 2 adet 3’er bit ise Ra ve Rb yazmaçları için ayrılmıĢtır. Load, store, compare ve shift gibi iĢlemler için kullanılmaktadır. BAYRAKLAR Sıfır AMB veya çarpma biriminden çıkan sonucun sıfır olup olmadığına dair bilgi verir. Elde AMB de yapılan toplama iĢlemi sonucunda son basamağın toplanmasında ortaya çıkan bir elde değerinin olup olmadığını bildirir. Taşma AMB de yapılacak iĢlemlerin sonucunun 16 bite sığmaması durumunda etkinleĢtirilir. Çarpma biriminde bulunmaz. İşaret Çarpma birimi ya da AMB de yapılan iĢlemlerin sonucunun iĢaretinin negatif ya da pozitif olmasını gösterir. YAZMAÇLAR 000 Birikeç 001 Üst 010 Alt 011 Genel Amaçlı Yazmaç 100 Genel Amaçlı Yazmaç 101 Genel Amaçlı Yazmaç 110 Genel Amaçlı Yazmaç 111 Genel Amaçlı Yazmaç 46 [Gizli] BENZETİM Benzetim için tek tek tüm birimlerin benzetimin bitirilmesinden sonra tüm parçaların birleĢtirilmesiyle tüm iĢlemci elde edilecektir. Tüm benzetimin tamamlanması için birleĢtirilmenin bitmesi gerekmektedir. Bu nedenle bu kısma dair verilerin daha sonraki raporlarda eklenmesi planlanmaktadır. 47