Mikroişlemci Mimarisi -1- Mikroişlemcilere Giriş

Mikrodenetleyici eğitiminde genellikle mikrodenetleyiciyi anlamak yönünde değil onu programlayabilmek yönünde bir çaba sarf edilir. Mikrodenetleyiciyi anlamadan bunu programlamak ise sadece o mikrodenetleyiciyi programlamakla sonuçlanır. Örneğin PIC öğrenen birisi temel bilgiyi ve mantığını öğrenmeyince AVR ya da STM8 tarzı bir mikrodenetleyiciye geçişte sıkıntı yaşar. Fakat mikroişlemci ve mikrodenetleyici mimarisini öğrenen birisi bir mikrodenetleyiciyi programlamayı değil bütün mikrodenetleyicilerin ve mikroişlemcilerin yapısını ve mekanizmasını öğrendiği için konuya çok daha geniş bir açıdan bakacaktır. Biz de bu yönde bir eğitim olması için mikroişlemci mimarisini anlatma kararı aldık.

Bundan daha önce AVR ve PIC mimarisini anlatsak da şimdi meseleyi biraz daha genel ve kapsamlı bir yönden ele alacağız. Burada herhangi bir marka veya mikrodenetleyici ailesine bağlı kalmayacağız.

Mikroişlemci (Microprocessor) bir bilgisayar sisteminin kalbi gibi görev yapmaktadır. Bu kullandığımız kişisel bilgisayar, cep telefonu ve tablet bilgisayarlarda olduğu gibi PIC, AVR, STM32 gibi mikrodenetleyicilerde de böyledir. Bazen mikrodenetleyicilere “işlemci” dendiğini duymaktayız. Bu bazen her işlem yapan çipe yüzeysel bir bakış açısıyla işlemci denmesinden kaynaklanabilir. Oysa ki işlemciler bile kendi içerisinde birbirinden oldukça farklı niteliklere sahip olabilir. Bazen mikrodenetleyici gibi çip üzeri sistem (SoC) yapılarıyla karşılaşabiliriz. Bazen de oldukça saf bir CPU gördüğümüz olur. Bunların hepsine birden işlemci demektense işlemcinin ne olduğunu anlayıp işlemcinin niteliklerini anlamamız daha iyi olur.

Mikroişlemci fiziksel bir ünite olup program hafızasında bulunan makine kodunu çalıştırır. Bu kodun çalıştırılması fiziksel yolla çizilen devre şeması ile olmaktadır. Mikroişlemci tasarımcıları kullandıkları mimari ve belirledikleri komut kümesine göre her komut için özel bir devre çizer. Örneğin iki değerini toplamak için ayrı bir devre, iki değeri birbirinden çıkarmak için ayrı bir devre kullanılır. Bu devreler ise mantık kapılarından meydana gelmiştir. Mantık kapıları ise transistörlerden oluşmaktadır. Mikroişlemci tasarımcıları bu transistörleri önce mantık kapısı devreleri haline getirip bloklar halinde gerekli işlemler için kullanır. Flip-flop adı verilen devreler ise hafıza birimleri olup yine transistörlerden oluşmaktadır. Bu birimler transistörlerden oluşsa da transistörler tek tek birbirine bağlanarak bir mikroişlemci ortaya çıkarılmaz. Transistörler çizilen devreler ile bloklar ve birimler olarak kümelenmektedir. Mikroişlemciye kabaca baktığımızda yaptığı belli başlı işlerin olduğunu görürüz. Bu işleri ise tamamen programcının komutlarına göre yapmaktadır. Tamamen aptal bir makine olarak bizim aklımıza ihtiyacı vardır. Bu komutlar ise veri okuma, veri işleme ve veri yazma olarak özetlenebilir. Mikroişlemci belli bir yerden bir veya iki veriyi alır ve bu verileri ya karşılaştırır ya toplar ya da çıkarır ve sonuç verisini tekrar bir hafıza birimine yazar. Bir birimdeki veriyi okuyup başka bir birime yazma, bir veri üzerinde matematik işlemi yapıp çıkış olarak verme, klavyeden girilen bir değeri kaydetme gibi angarya diyebileceğimiz işleri mikroişlemciye yaptırırız.

Mikroişlemcinin her yaptığı işi insan aklı ve zekası vasıtasıyla yapabilir. Fakat hesap makinesi olayında olduğu gibi işlem hızı oldukça düşük olup gereksiz yere iş gücü kaybı olmaktadır. Bir insanın yapacağı bir işi tek bir çipin yapması insanın çip kadar kıymetsiz olduğunu değil işin çip tarafından yapılacak kadar basit olduğunu gösterir. Kısacası mikroişlemciler tasarımcı ve programlayıcının aklı ve zekası olmaksızın hiçbir işe yaramazlar.

Mikroişlemci programlanabilir bir aygıt olup makine dili adı verilen ikilik sistemde yazılmış belirli sayısal kodları işleten aygıta denir. Bu komutlar bellek adını verilen yapılarda tutulmaktadır. Bellekler kendi başına bir işlem yapmaz ve sadece kullanılan aygıtlardır. Yani istediğimiz zaman istenilen adresteki veriyi bize verirler veya istediğimiz adrese verinin yazılmasına yardımcı olurlar. Bir belleği defter gibi düşünebilirsiniz. Bu defterden okuyup yazan ise mikroişlemcidir. Mikroişlemcinin en temel özelliği veriyi okumak, işlemek ve kaydetmektir. Tüm mikroişlemcilere baktığımızda temelin bu olduğunu ve bunun üzerinde işlem gücünü artırma adına yeni özelliklerin eklendiğini görebiliriz.

Örneğin günümüzde x86-64 tabanlı kişisel bilgisayar işlemcilerinde (Intel ve AMD) grafik sürücüsü de bulunmaktadır. Bu işlemcinin bir özelliği olmayıp çipe zamanla eklenen özelliklerden biri olarak karşımıza çıkar. Günümüzde mikroişlemcilerin eskiden olduğu gibi gariban bir CPU olmaktan çok SoC yani çip üzeri sistemlere kaydığını ve gün geçtikçe pek çok özelliğin tek bir çipte toplandığını bilmemiz gerekir. Yine tek kart bilgisayar olan Raspberry PI’de ses, hdmi, usb, ethernet sürücüleri gibi pek çok ayrı çip gerektiren özellik tek bir çip içerisine toplanmıştır. Karta baktığımızda tek bir işlemci ve ram entegresini görebiliriz. Hatta SD kart sürücüsü de hazır olduğundan SD kart yuvasına işletim sistemi yüklü kartı taktığımızda hemen çalışmaktadır. Pek çok telefon ve tablet işlemcisinde de gelişen teknolojiyle beraber işlemcilerin çip üzeri sistemlere (SoC) kaydığını görmekteyiz.

Resim: Üzerinde sadece 3 adet entegre bulunan tek kart bilgisayar, Raspberry PI

Biz burada günümüzde kullanılan ve üzerine eklenen öğelerle kalabalıklaşmış ve karmaşık yapıya bürünmüş işlemcileri ele almayacağız. Çünkü bunların meydana gelmesi için temelin üzerine bir ilave yapmak şarttır. Biz ise temeli öğrendikten sonra üzerindekileri anlamak için çok çaba sarf etmeyeceğiz. Temeli bilmeden işin ayrıntısıyla meşgul olmak anlamamızı sağlamayacaktır.

Temel bir mikroişlemcinin okuma, işleme ve yazma işini yaptığını söylemiştik. Bu mikroişlemci aynı zamanda dış dünyaya I/O yani giriş ve çıkış portları ile açılır. Bu dış dünyada ise yaptığı iş yine çok farklı değildir. Biz bir bilgisayar sistemine her zaman giriş ve çıkış birimlerini ekleyerek kullanırız. Örneğin bu yazıyı yazdığım klavye giriş birimi iken yazdığımı gördüğüm ekran bir çıkış birimidir. Klavyedeki bir tuşa basmamla bunun ekranda görünmesini sağlayan aracı parça da mikroişlemci olmaktadır. Mikroişlemci giriş biriminden aldığı ASCII ya da Unicode formatındaki değeri yazılım vasıtasıyla yorumlar (burada yazılım işletim sistemi olmakta) ve bunu işleyerek görüntü birimine komut olarak gönderir. Görüntü birimi ise ekrana göre hizalanmış bir veriyi ekrana göndererek görüntüyü oluşturur. Burada merkezi işlem biriminin görevi bütün parçalardan üstündür. Çünkü merkezi işlem birimi olmadan bunları denetleyecek ve veriyi işleyecek bir yer yoktur.

Resim: Bir bilgisayar sisteminin basit bir şeması

Bir mikroişlemci sistemi yukarıda gördüldüğü gibi işlemci, bellek ve giriş/çıkış aygıtları olarak üç ana parçaya ayrılmaktadır. Bu giriş ve çıkış aygıtları kişisel bilgisayarlarda Ethernet sürücüsü, modem, grafik kartı, klavye, mouse, yazıcı, tarayıcı, harddisk, cd sürücü gibi pek çok aygıt olabilir. Bu aygıtların kullanıcıya yönelik olduğunu kullanıcı etkileşimli olmasından dolayı anlayabilirsiniz. Bu giriş ve çıkış aygıtları bütün bilgisayar sistemlerinde aynı olmak zorunda değildir. Bazı bilgisayar sistemlerinde zamanlayıcı, frekans üretici, analog sinyal okuyucu gibi aygıtlara yerini bırakabilir.

Mikrodenetleyicinin işleyişini anlatsak da bu işleyiş esnasında önemli bir görevi olan bellek birimini göz ardı etmemek gerekir. Bellek birimi olmadan mikroişlemcinin işleyeceği bir veri bulunamaz. Kısacası mikroişlemci belleği istediği gibi kullanma yetkisine sahipse de bellek olmadan hiç bir iş yapabilecek nitelikte değildir. O yüzden tek başına bir mikroişlemciyi çalıştırmanın bir anlamı olmayacaktır.  Bir mikroişlemciyi kullanmak istiyorsak muhakkak iki adet bellek birimine ihtiyacımız vardır. Bunlar ana bellek birimleri olan RAM ve ROM belleklerdir. İkincil bellek olarak disket, CD ya da Flash hafızalardan bahsedebiliriz. Bunlar işlem esnasında kullanılmayıp program verisini okuyup belleğe aktarmada kullanılır. Mikrodenetleyici doğrudan program hafızası ve veri hafızası ile ilgilenmektedir.

Program hafızası mikroişlemcinin işleteceği program verisinin tutulduğu yerdir. Mikroişlemci bu hafızadan sırayla verileri okur ve çözümler. Sonrasında ise bu verilere göre veri hafızasından çeşitli yerlere veri yazar veya oradan okuduğu verileri kullanır. Kısacası program hafızası mikroişlemciyi çalıştıran hafıza, veri hafızası ise mikroişlemcinin üzerinde çalıştığı hafıza birimidir.

Mikroişlemci, bellek ve giriş/çıkış aygıtları arasındaki bağlantı adres ve veri yolu ile yapılmaktadır. Bunu daha iyi anlamak için aşağıdaki diyagrama bakabilirsiniz.

Bu arada burada İngilizce yazı olması aslında çizmeye üşendiğimden hazır resim kullanmamdan dolayıdır. Herhangi bir yerden tercüme ettiğimden dolayı değil. 🙂

Mikroişlemci entegresinin üzerinde A ile belirtilen bir adres yolu ve D ile belirtilen bir veri yolu vardır. Bu adres ve veri yolunu belleğe de giriş ve çıkış aygıtlarına da bağlayabiliriz. Bir yoldan adresleme yapılırken öteki yoldan veri akışı iki yönlü olarak sağlanmaktadır. Yalnız burada pek dikkat çekmeyecek şekilde belirtilen bir kontrol yolunun da olduğunu  görebilirsiniz. “Memory Request” ya da “I/O Request” denen ayrı hatlar kontrol yoluna tabidir. Yani adres ve veri bilgisinin yanında okuma mı yazma mı işi yapılacak hangi çip etkinleştirilecek tarzında denetim işlemleri için bir de kontrol yolu bulunur. Bu yollara İngilizce “bus” adı verilmektedir. Yalnız bunlar “otobüs” anlamında değil terim anlamında “yol” manasında kullanılmaktadır. Bu yollar her zaman çok şeritli olup yolun genişliğine göre niteliği artmaktadır. Örneğin 8-bitlik bir veri yolunda 8 adet bağlantı noktası bulunur ve bu hat üzerinden bir defada en fazla bir baytlık veri aktarılabilir. Ayrıca adres yolunun genişliği sayesinde mikroişlemcinin ulaşabileceği alan da genişlemiş olur. Veri yolu mikroişlemcinin elinin parmakları ise adres yolu da kolunun uzunluğudur.

Size adres yolunun önemini anlamanız için bir örnek verelim; Bir dönem bilgisayarlarda 32-bit mikroişlemciler sıkça kullanılmaktaydı. Yalnız bu mikroişlemcilerin önemli bir eksikliği görülmeye başlandı. Kullanıcılar uygulamaların daha fazla RAM istemesi üzerine 4GB’lık bellek modülleri alıp bilgisayara takıyordu. Anakart desteklemesine rağmen işlemcinin adresleyememesinden dolayı belleğin 3GBlık bir kısmı kullanılabiliyordu. Bunun donanımsal olarak bir sınırlama olmasından dolayı yazılım çözümü getirmek de mümkün değildi. Şimdi hemen hemen bütün kişisel bilgisayarlarda kullanılan işlemciler 64-bit olsa da bir dönem için bu RAM bellek olayı büyük bir sorun olmuştu. 3GB bariyeri hakkında aşağıdaki bağlantıdan daha ayrıntılı bir bilgi alabilirsiniz.

https://en.wikipedia.org/wiki/3_GB_barrier

Bu yazıda mikroişlemcinin ne olduğunu, adres,veri ve kontrol yolunu, çalışma mantığını ve bellekleri kısaca anlattık. İşe ikilik sayılardan veya mantık devrelerinden başlayarak anlatmak istemedim çünkü onların seviyesi farklı olup tek bir donanım seviyesine ve konuya odaklanmanın daha doğru olacağını düşündüm. Bir sonraki yazımızda daha ayrıntılı bir şekilde mikroişlemcileri sizlere anlatacağız.

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.