Mikroçita Rapor 2: İşlemci projemizle ilgili olarak hazırlamış olduğumuz bu ikinci raporda öncelikli olarak vhdl kullanarak tasarladığımız işlemcimizin genel çalışmasını ilk rapora göre daha ayrıntılı bir şekilde anlatıp, yazmış oldugumuz kodları ele almayı amaçladık. Mikroişlemci temel yapısı hakkında birinci raporda genel bilgiler verilmişti. 1. Raporun yazımından sonrasında, pipeline büyük ölçüde bitti ancak test işlemleri gözümüzden kaçan herhangi bir durum olmamasını sağlamak maksadıyla kodlar eklendikçe sürmekte. Toplama çıkartma gibi aritmetik işlemler, lojik işlemler, shift işlemleri, Branch kodları ve immediate data kullanılarak gerçekleştirilen işlemler büyük ölçüde gerçekleştirilmiş olup toplamda işlemcinin yapabildiği kod sayısı 27 ya çıkarıldı. İşlemcinin daha hızlı çalışmasına yönelik çalışmalar yapıldı. Yapılanlar raporun ilerleyen kısımlarında, ayrı başlıklar altında daha ayrıntılı bir şekilde açıklandı. İşlemcinin Temel Yapısı: İşlemcimizin temel yapısı yukarıda görüldüğü üzere 4 temel birim ve bunların alt birimlerinden oluşmaktadır. Bu birimlerin her birisi vhdl dili kullanılarak kodlanmış olup, işlemcimiz toplamda şu an için 17 dosyadan oluşmaktadır. Bu vhdl dosyaları aşagıdaki şemada hiyerarşik olarak gösterildi.
Bu yapıyı ayrıntılı olarak incelememiz gerekirse en dışta microprocessor olarak tanıtılmış olan işlemcimiz, altında bulunan program memory, veri hafızası olarak kullanılan memory ve datapath ile controller olarak adlandırdıgmız iki bölüm bulunmakta. Bunların hepsi microprocessor altında alt birimler olarak tanıtılmış durumda bulunmaktadır. İşlemcinin belleği Harvard mimarisine göre yapılmış olup programın yazıldıgı ve uygulama sırasında kullanılan, çıkışların yazıldıgı, kaydedildiği bellekler ayrı bir şekilde tasarlanarak hafızada aynı anda yazma ve okuma işlemleri yapılmasına olanak sağlanmış oldu. Hafıza birimleri haricinde microprocessor.vhd dosyası içinde component olarak tanıtılmış, işlemcimizin 2 ana alt birimi daha bulunmakta. Bunlar control-unit.vhd ve datapath.vhd dir. control-unit.vhd 5 ayrı elemandan oluşan, işlemcinin çalışmasını yöneten alt birimlerden oluşmakta. Bunlardan en başta geleni controller.vhd dosyası. Bu dosyada işlemcinin işlemleri sırayla yapmasını sağlayan, işlemciyi yöneten birimin tasarlandıgı kodlar bulunmaktadır. Bu eleman aşagıdaki şekilde görülmektedir.
Controller elemanı işlemci altı adımlık bir pipeline sisteminde çalışacak şekilde tasarlanmıştır. Bu aşamalar, kodun memoryden okunarak ir_word e aktarıldıgı fetch, kodun algılanarak ne iş yaptıgının çözümlendiği decode, kodun çalıştırılması esnasında kullanılacak olan register degerlerinin okundugu fetch operand, işlemin yapıldıgı execute, Hafıza birimine kaydedilecek şeylerin yazıldıgı Memory ve son olarak da işlem sounucunda degişen register degerlerinin yazıldıgı write back aşamasıdır. Bu adımlar aşagıdaki şekilde gösterilmiştir. Bu aşamaları tamamlayarak programın ilk satırındaki işlemin yapılması 9 clock sürmekte. Daha sonraki her 2 satır kod ise 3 clock darbesi sonucunda gerçekleştirilmektedir. Clock frekansımız yaklaşık olarak 110 Mhz civarındadır. Bu konuda bir optimizasyona gitmearzumuz bulunmaktadır. Bu sayede frekansı yükseltebilecegimizi düşünüyoruz. Pipeline sırasında ortaya çıkan hazards durumlarını gidermek amacıyla hazards_controller.vhd dosyasında bir eleman tasarladık. Bu eleman, ard arda gelen kodlardaki registerların aynı olup olmamasına, yapılacak işlemlere göre hazards durumunu controllera yansıtmakta, controllerda ise bu duruma uygun çözüme göre programın akışı devam ettirilmektedir. PC.vhd dosyası yapılmakta olan program satırı bilgisini tutarak, branch kodları olmadıgı durumda, bir sonraki satırın okunmasını, oldugu durumlarda ise gerekli satıra gidilmesini sağlamaktadır. Instruction register, program memoryden PC dan gelen bilgi dogrultusunda gerekli kodları almaktadır. Microprocessor.vhd dosyası altında tanıtılmış olan elemanlardan bir digeri ise datapth dir. Datapath.vhd dosyasında tasarlanmış olan bu eleman, registerların bulundugu register file, işlemlerin yapıldıgı alu gibi işlemci için son derece önemli elemanları içinde bulundurmaktadır. Register_file.vhd dosyasında, işlemcimizin sahip oldugu 1 i flag register olmak üzere toplamda 8 registerın tutldugu, controllerdan gelen bilgilere göreistenilen registerın seçilerek değiştirildiği bir elemandır. Bu registerlar 16 bitlik bir program satırımızın ilk beş biti ouşturan opcode undan sonra gelen üç bit ile belirlenmektedir. Alu.vhd dosyasında işlemcimizin arithmetic logic unit(alu) su tasarlanmıştır. Alu elemanımız, 15 adet işlemi kendi içinde gerçeklemektedir. Bu işlemler 4 bitlik bir seçici giriş ile seçilmektedir. ALU nun girişlerinden gelen veriler seçici girişte belirtilen işlemin
yapılmasının akabinde, sonuç çıkışına verilmektedir. ALU dahilinde bu 15 işlemden hariç olarak branch kodlarının çalışmasıyla ilgili olarak durumların sağlanıp saglanmadıgı da kontrol edilmektedir. Shifter.vhd dosyası, işlemcimizin shift işlemlerini yapması için kullandıgımız, daha sonra çarpma işlemini gerçeklemek için de kullanacagımız, shiter elemanımızın tasarımını içermektedir. Yapılacaklar: - İşlemcimizin henüz gerçekleyemediği multiply, syscall gibi kodları eklemek. - IR_word ü 32 bite çıkartarak, immediate data uzunlugunu ve register sayısını artırmak. - Cache memory yapmak. - İşlemciyi Superscalar hale getirmek. Bunun için öncelikle 2. bir pipeline hattı ve alu ekleyecegiz. - Güç ve hız için optimizasyonu yapmak. Test: İşlemcinin yapabildiği komutların bir kısmını kullanarak fibonacci dizisini elde ettik. Bunun için internetten buldugumuz bir programı işlemcimize uygun şekilde düzenleyip koşturduk.bunun için kullanmış oldugumuz kodlar aşagıdaki gibidir; 1 => "0001100000000000", -- mov R0, 2 => "0001100100000001", -- mov R1, #1 3 => "0001101000110100", -- mov R2, #52 4 => "0001101100000001", -- mov R3, #1 5 => "0000100000110010", -- mov M[50], R0 6 => "0000100100110011", -- mov M[51], R1 7 => "0000100101100100", -- mov M[100], R1 8 => "0010000100000000", -- add R1, R0 9 => "0000000001100100", -- mov R0=M[100], R0 10 => "0001001000100000", -- mov M[R2], R1 11 => "0010001001100000", -- add R2, R3 12 => "0000010001110000", -- mov R4, M[59] 13 => "1011110000000110", --jz R4, #6 Bu programı koşturduktan sonra memorymizi gösteren tmp_ram in ekran görüntüsü aşagıdadır.
Daha ayrıntılı ve büyük testler yapıldıkça rapor haline dönüştürmeyi düşünmekteyiz. Ayrıca proje yönetimimizi kolaylaştırmak açısından yaklaşık bir ay önce bir proje yönetim sitesi oluşturduk. Bu sayede, takım olarak geliştirmelerimizi internet sitemize yükleyerek, online paylaşma ve arşivleme sistemi oluşturmuş olduk. En azından gelişmeleri inceleyebilmeniz için, internet sitemiz: http://www.linksfly.com kullanıcı adı: mikroçita şifre: pipeline