Mikroişlemci Mimarisi -4- Mikroişlemcinin İç Yapısı

Mikroişlemci ve iç yapısı hakkında temel bilgileri öğrendikten sonra bütün mikroişlemcilerin birbirine benzediğini fark edeceksiniz. Bu benzerlik sayesinde çalışmak istediğiniz mimariyi ve platformu rahatça değiştirebilir ve temelleri öğrendikten sonra kendi mikroişlemcinizi programlanabilir mantıksal yapılar vasıtasıyla ve donanım tanımlama dilleriyle yapabilirsiniz. Mikroişlemci anlaşılmayacak yapıda ve sır gibi saklanan bir ürün değildir. Yalnız bir seviyede ürün ortaya koymak için daha alt seviyede ve temel bilgilerin olması şarttır. Örneğin Assembly dilinde bir uygulama yazmak istiyorsanız donanımı ve komut setini bilmeniz gereklidir. Donanım ve komut seti daha alt seviye olmasına rağmen sizin bir üst seviyede ürün ortaya koyabilmeniz için bunları bilmeniz şarttır. Yazılımda yüksek seviye diller ve kütüphaneler ile bu temelleri bilmeden yazılım ortaya koyabilseniz de bir yüksek seviye programlama dili, platformu ve bunların kütüphanelerini ortaya koyabilmeniz için daha alt seviyede bilgiyi elde etmeniz şarttır. Aşağıdaki infografik bu seviyeleri çok güzel ortaya koymaktadır.

Biz mikrodenetleyici mimarisini anlatırken micro-architecture yani mikro mimari seviyesinde meseleyi anlatıyoruz. Bunun sebebi daha üst seviyede çalışanların işin temelini iyi anlaması ve yüzeysellikten kurtulması içindir. Yüzeysellik sadece üst seviye yazılım yapan ve donanımdan haberi olmayan yazılımcılar için geçerli değildir. Örneğin dijital devreler üzerinde çalışıp da bunun temelini bilmeyen biri için de geçerli olabilir.

Mikroişlemcinin içine baktığımızda çok daha karmaşık bir yapı ile karşı karşıya kalmayız. Yazmaç dosyası, kontrol ünitesi, ALU gibi temel bileşenlerden ibaret olan işlemcinin çekirdek ünitesi ise ALU (Aritmetik Mantıksal Ünite) birimidir. Aşağıda Z80 işlemcisinin blok diyagramını görmekteyiz.

Ayrıca günümüzde kullandığımız AVR mikrodenetleyicilerin CPU diyagramını vermezsek yazımız eksik kalacaktır.

Şimdi aritmetik mantıksal ünite olan ALU’yu açıklayarak yazımıza devam edelim.

ALU, Bütün mikroişlemcilerin çekirdek birimidir. Mikroişlemcinin komut kümesine dair bütün işlemler ALU vasıtasıyla yapılmaktadır. ALU aritmetik ve mantıksal ünite olarak çeşitli dijital devrelerin bir araya gelmesinden oluşmuştur. Örneğin Adder (Toplayıcı) devresi burada toplama işlemini yapmakta görev almaktadır. Komutlara göre belli devreler çalıştırılır ve işlem yürütülür. ALU biriminin iki girişi ve tek çıkışı bulunmaktadır. Aynı zamanda ALU’ya ait bayrak bitlerinin yer aldığı kontrol çıkışı da mevcuttur. Bu bayrak bitleriyle ALU’daki yapılan işlemler hakkında harici bir bilgi kanalımız olur. Örneğin sıfır elde edildiğinde, eldeli bir toplama olduğunda bu bitler vasıtasıyla haberdar oluruz. İlkel işlemcilerin ALU birimlerinde az miktarda aritmetik ve mantıksal işlem yürütülür. Örneğin sadece toplama ve çıkarma işlemi yapabiliriz. Daha gelişmiş mikroişlemcilerde sonrasında çarpma  ve bölme işlemleri için ayrı komutlar da eklenmiştir. Çarpma veya bölme işleminin olmayışı onu yapamayacağımız anlamına gelmez. Toplama işlemi üzerinden yaptığımız algoritma ile çarpma işlemini yazılımsal olarak elde ederiz. Yazılımsal olarak uzun sürede yaptığımız bir işlem için donanımsal bir desteğin olmaması performanstan kayıp yaşatır. Ayrıca ALU’ya iki giriş olduğuna göre mantıksal işlemleri de yapabileceğimiz anlamına gelir. AND, OR, NOT ve XOR mantık işlemlerini yapabiliriz. Bunlar için ayrı makine komutları mevcuttur. Ayrıca bit kaydırma, artırma, yazma ve çeşitli işlemci komutları da ALU üzerinden yürütülür. Bir işlemcinin gelişmiş olduğunu gösteren etkenlerden biri de komut kümesinin zenginliğidir.

Register File (Yazmaç Dosyası) ve Genel Maksatlı Yazmaçlar, Mikroişlemcinin ALU birimi için kullanacağı verilerin depolandığı küçük bir bellek birimidir. Yazmaçlar flip-floplardan oluşan bellek birimi olup RAM bellek gibi bir özellik taşımaktadır. Yalnız işlemciye çok yakın olduğu için ve adreslenmesi farklı olduğu için hızlı işlemler için bir tampon bellek görevi görmektedir. Eski mikroişlemcilerde yazmaç dosyası yerine ALU’ya bağlı 8-bitlik bir veri hücresi olan akümülatör vardı. Bu akümülatör PIC mikrodenetleyicilerde W yazmacı olarak adlandırılmaktadır. AVR mikrodenetleyicilerde ise R0-R31 arası adlandırılan toplamda 32 baytlık yazmaç dosyası mevcuttur. Özellikle RISC mikrodenetleyiciler doğrudan veri belleğinden işlem yapamadığı için önce RAM bellekten okunan veri bu yazmaca aktarılır ve sonrasında bu yazmaçlardan ALU birimine aktarılır. ALU tarafından işlenen veri tekrar yazmaca aktarılır. Yazmaç dosyasındaki verilere erişim her zaman daha hızlı olmaktadır. Genel maksatlı yazmaçları RAM bellek ve işlemci arasındaki bir tampon bellek olarak düşünebiliriz.

Program Counter, yani program sayacı mikroişlemcinin açılışından itibaren her komut işletiminde genellikle birer birer artırılır. Program sayacı bir sonraki işletilecek komutun adres verisini içinde barındırmaktadır. Böylelikle program verisi bellekten sırayla okunmakta (0, 1, 2, 3… numaralı adres olarak) ve program yukarıdan aşağıya doğru sırayla işletilmektedir. Bu program sayacının etkisini en yüksek seviye dillerde program yazarken bile görmemiz mümkündür. İlk defa çalıştırılacak komutu daima en başa yazarak programa başlarız. Sondan itibaren çalışan bir program sayacı oldukça gereksiz olacaktı. Haliyle tasarlanırken sıfırdan başlayıp programın en sonuna kadar devam eden bir program sayacı tasarlanmıştır.

Instruction Register (Komut Yazmacı), Bu oldukça basit bir görevi yerine getirmek için yer alan bir yazmaçtır. Bir işletilen komutun verisini üzerinde tutan bir yazmaçtır. Yani program hafızasından program sayacının adreslemesiyle okunan veri bu yazmaca aktarılmaktadır. Sonrasında çözümleyici birim bunu okuyup ALU birimine aktarmaktadır. Program sayacı 5 değerine geldiğinde program hafızasındaki 5 numaralı adresteki veriyi oku talimatı gönderilir. Sonrasında bu okunan veri (örneğin 0x25F2 olsun) komut yazmacına yüklenir. Yani program hafızası ile işlemci arasında tampon bellek gören bir yazmaç dememiz mümkündür.

Tampon Yazmacı (Buffer Register), Bu yazmaç mikroişlemci ve hafıza sistemi arasındaki etkileşimi sağlar. Bellek adres yazmacı ve bellek tampon yazmacı olarak iki tipte bulunmaktadır. Bellek adres yazmacı bellekteki erişilecek veri hücresinin adresini üzerinde bulundurur. Bellek veri yazmacı ise mikroişlemcinin veri ayaklarına bağlı olup okuduğu ya da yazdığı veriyi tampon olarak üzerinde bulundurur.

Yığın İşaretçisi (Stack Pointer),

Yığın işaretçisi yığındaki en son girilen veriyi üzerinde tutmakta ve POP (Çekme) ve PUSH (İtme) komutlarıyla erişilebilmektedir. Normal bellek okuma ve yazma komutlarından daha hızlı olan bu komutlar özel olarak bu yazmacı okumakta görev yapmaktadır. Yığında birbiri üzerine eklenen program sayacı verileri yer almaktadır. Böylelikle döngülere ve fonksiyonlara gidilebilir ve program akışı istenilen noktaya çekilebilir.

Kontrol Ünitesi, Bu ünite mikroişlemcideki bütün görevleri ve hareketleri kontrol eden ünitedir. Saat sinyaline göre hafızadan komutları almak, çalıştırmak, giriş ve çıkış aygıtlarını koordine etmek gibi pek çok görevi vardır. Kontrol birimi en karmaşık mantıksal devrelerden biri olup silikon çip üzerinde büyük bir yer kaplamaktadır. Örneğin bellekten veri okuması yapmak istediğimizde kontrol birimi belleğe “oku” sinyalini kontrol yolu üzerinden göndermektedir ve mikroişlemcinin ayakları üzerinde senkronizasyonu sağlayarak bu veriyi yazmaçlara aktarmaktadır. RISC ve CISC mimarisine göre kontrol ünitelerinin yapıları değişebilmektedir.

 

Buraya kadar mikroişlemcinin temel birimlerini öğrenmiş olduk. Sonraki başlıkta ise mikroişlemci komutlarından bahsedeceğiz.

Bizi Facebook grubumuzda takip etmeyi unutmayın. Bilgili ve öğrenmeye hevesli bir topluluk oluşturmak istiyoruz.

https://www.facebook.com/groups/1233336523490761/

UYARI!!

 

 

 

Gökhan Dökmetaş

"Arduino Eğitim Kitabı" ve "Arduino ve Raspberry PI ile Nesnelerin İnterneti" kitaplarının yazarı. Başkent Teknoloji ve Dedektör Merkezi'nde Ar-ge Sorumlusu. Araştırmacı-Yazar.

You may also like...

Bir cevap yazın

E-posta hesabınız yayımlanmayacak.