Atmel AVR Mimarisi -3- AVR Mikroişlemcisi (CPU)

AVR mimarisini anlattığımız yazı dizisinin üçüncü ve son yazısına AVR mikroişlemcisini anlatmakla başlıyoruz. Mikrodenetleyici ile mikroişlemci arasındaki farkı bu nokta geldiyseniz öğrenmiş olmanız gerekir. Yine de bunu kesinleştirmek için kısaca bahsedelim.

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.

Mikrodenetleyiciler ise önceki yazıda bahsettiğimiz üzere bu mikroişlemcinin sığ çalışma prensibini zenginleştirip işe yarar bir sistem haline getirmek üzere mikroişlemciye eklenen hafıza ve çevre birimleridir. Mikroişlemci tek başına pek bir iş yapar nitelikte değildir. Yazılım olsa dahi fiziksel olarak çevre birimlerine çoğu zaman muhtaç olmaktadır. En gelişmiş ve hızlı işlemcilerden olan bilgisayar işlemcileri bile koca bir anakarta muhtaçtır. Telefon ve tabletlerin küçük anakartları bizi yanıltsa da aslında o sistemlerde bir çeşit çip üzeri sistem yani SoC (System on a Chip) kullanılmaktadır.  Bizim burada işlemciden kastımız çıplak haliyle CPU’dur.

Mikroişlemciyi düzgün çalışır hale getirecek RAM, ROM, Saat, Giriş/Çıkış, Zamanlayıcı gibi birimleri içerisinde toplayan bir sistemi tek bir çip altında toplamak çok daha ucuza mal olacağı gibi kullanışlılık da aşırı derecede artacaktır. O yüzden günümüzde mikrodenetleyiciler  gömülü sistemlerde çok daha fazla kullanılmaktadır.

AVR mikroişlemciler RISC komut kümesi mimarisi ve Harvard mikroişlemci mimarisi üzerine kurulmuştur. Mikroişlemciler için komut kümesi olarak CISC ve RISC olarak iki seçeneğimiz vardır. CISC yani karmaşık komut kümesi genellikle Intel gibi gelişmiş işlemci üreten firmalar tarafından üretilen işlemcilerde kullanılmaktadır. Günümüzde kullanılan x86 ve x64 sistemler böyledir. Bu mimaride çok fazla mikroişlemci komutu yer alıp çoğu iş tek komutla yapılmaya çalışılır. Böylelikle daha fazla performans sağlansa da hem tasarımı hem de programlaması zor ve maliyetli bir iştir.

RISC ise azaltılmış komut kümesi olup aynı işi daha az komut sayısıyla yapmayı amaçlar. Fakat komut sayısı azaldığı için bir işi bir komut yerine birden fazla komutta yapmak durumunda kalırız. RISC işlemcilerin tasarımı ve programlaması daha kolay ve ucuzdur. Böylelikle daha basit iş gerektiren sistemlerde kullanılabilir. Bizim çalıştığımız alanda RISC mimarisinin kullanıldığını buradan anlayabilirsiniz.

Harvard mimarisi gibi mimariler ise mikroişlemcinin tasarımının şablonlarıdır. Bu şema ve kurallara göre bir mikroişlemcinin üretilmesi gereklidir. Tabi ki ticari alana geçmemiş mimariler olacağı gibi başarabilirseniz kendi mimarinizi de ortaya koyabilirsiniz.

AVR mikroişlemcilerin bir özelliği de yazmaç tabanlı mimariye sahip olmalarıdır. Bu mimarinin kendini diğerlerinden ayıran yanı üzerinde işlem yapılacak iki verinin de ayrı iki yazmaçta saklanmasıdır. Bunlardan başka akümülatör tabanlı, yığın tabanlı ve pipeline (iletişim hattı) tabanlı mimariler mevcuttur.

Yazmaç tabanlı mikroişlemci mimarisinde RISC komut kümesini kullanmak oldukça basit ve etkili işlemler yapmamızı sağlar. AVR mikrodenetleyicilerde sadece 131 adet işlemci komutu bulunmaktadır. Bu komutları incelediğimizde her komutun önemli ve basit bir işi yaptığını görürüz. Karmaşık bir iş yapmak istediğimizde ise RISC mimarisi gereği basit komutlardan karmaşık bir iş ortaya koymamız lazımdır. Bu komutlar ne kadar azaltılmış olsa da 8-bit PIC mikrodenetleyicilerde olduğu gibi 35 komuta sığdırılmış değildir. Komutların aşırı derecede az olması programcının kafasını aşırı derecede karıştırmaktadır ve programlamayı zor hale sokmaktadır. AVR bu konuda programcıların beğenisini kazanmıştır.

Yazmaçlardan bahsetmişken yazmaçların ne olduğunu bir dersimizde açıklamıştık. Okumayanlar şu bağlantıdan okuyabilir ve ardından derse devam edebilir.

http://www.lojikprob.com/avr/c-ile-avr-programlama-9-port-yazmaclari/

Şimdi AVR mikroişlemcisinin blok diyagramını verelim ve konumuza bu diyagram üzerinden devam edelim.

Bu diyagram dışarıdan bakıldığında oldukça basit gibi görülebilir. Koca işlemci bundan mı ibaretmiş?, diyebilirsiniz. 🙂 Bu şemada bile açıklanmayan siyah şekiller vardır. Üretici  ticari sırları koruma adına işlemci hakkında mümkün olduğu kadar az bilgi vermek zorundadır. O yüzden iç şemasını oldukça kaba bir şekilde görüyoruz. İleride dijital elektronik ve bilgisayar mimarisi derslerini anlattığımızda işin teorik bilgisini öğrenince arka planda az çok neyin döndüğünü anlayabileceksiniz. İşlemci komutlarını ise bu derste açıklayarak sizi sıkmak istemiyorum. Onu Assembly diline teorik olarak giriş yaptığımızda açıklayacağım.

Register File adı verilen yazmaç dosyası mikroişlemci içinde yer alan ve mikroişlemci tarafından kallanılmaya tahsis edilmiş genel maksatlı yazmaçlardan oluşmaktadır. Burada sadece 8-bit yazmaçlar yer almayıp 16-bit işlemler için üst ve alt yazmaç olmak üzere ikili yazmaçlar da yer almaktadır. R26-R31 arasındaki çiftli yazmaçlar böyledir. Mikrodenetleyicimiz ne kadar 8-bit olsa da bizim sadece 0-255 arasında değerlerle işlem yapmamız mümkün değildir. O yüzden üst ve alt yazmaçlar olmak üzere iki adet 8-bit yazmaç mikroişlemci 16-bit olmasa da biraz hile ile 16-bit olarak kullanılmaktadır.

Program counter adı verilen program sayacı işlemcinin hangi komut satırını okuyacağını belirler. Mikroişlemci kodları yukarıdan aşağıya doğru satır satır çalıştırmaktadır. Kodlar çalışırken çoğu zaman satır atlamak gereklidir. Program sayacını sabit olarak artıp sıfırlanan bir sayaç olarak anlamamak gerekir.

Flash memory (Flash hafıza) ise yazdığımız ve yüklediğimiz programın makine kodunu satır satır içinde barındırır. Bu hafızadan okuma yapılarak kodlar çalıştırılır.

Instruction register adı verilen yazmaç makine dilinin program hafızasından okunup yerleştirildiği yazmaçtır. Burada program bir ve sıfırlar olarak saklanır ve fiziksel olarak çalıştırılmak üzere çözümlenir. Görüldüğü üzere buraya kadar bütün işlem veri okumak ve veriyi saklamak üzeredir.

Bütün bu mantık ve matematik işlemlerini yapan ünitenin ne olduğunu merak etmiş olsanız gerek. ALU (Aritmetik Mantık Ünitesi) adı verilen bu ünite bütün bu işlemleri yapar. ALU’nun nasıl çalıştığına dair bilgiyi ancak ileri seviye teorik konularda tam anlamıyla kavrayabiliriz. Yukarıda özetlediğimiz gibi mantık kapılarından oluşan bir devre olduğunu söyleyelim.

Status Register adı verilen durum yazmacı aritmetik mantık ünitesinde yürütülen işlemlere göre çeşitli bayrak bitlerini içinde barındırır. Bu yazmaç yazılım tarafından okunup çeşitli işlemler bu durum bitlerine göre yapılabilir. Örneğin bir toplama işlemi yaptık ve eldeli bir değer elde ettik. Bu eldenin var olup olmadığını bu yazmacın bitlerini okuyarak bulabiliriz. Ya da sonuç sıfır olduysa yine bu bitleri okuyarak öğrenebiliriz. ALU’nun verdiği sonuçlar ile bizimle iletişime geçmesi yeterli olmadığı durumlarda alternatif bir yol olarak bu yazmaç kullanılmaktadır.

Stack pointer adı verilen yığın işaretçisi yerel değişkenleri , kesme dönüş  ve alt rutin adreslerini  içinde geçici olarak saklaması için kullanılır. Bilgisayarlarda olduğu gibi PUSH ve PULL mantığı ile çalışmaktadır.

Assembly dilinde programlama yapmayanlar için bu kadarını bilmeleri yeterlidir. Böylelikle AVR mimarisini anlattığımız son yazımız da bitmiş oldu. Daha ayrıntılı bilgi ancak Assembly programcılarını ilgilendirdiği için bu kadarı  yeterlidir.

Kaynaklar:
Kapak Resmi, https://i1.wp.com/makezine.com/wp-content/uploads/2016/09/HeroImage.jpg?resize=1200%2C670&strip=all&ssl=1

ATmega328P – Microchip Technology , http://ww1.microchip.com/downloads/en/DeviceDoc/Atmel-42735-8-bit-AVR-Microcontroller-ATmega328-328P_Datasheet.pdf, Erişim Tarihi: 25.08.2018

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.