Bu sayfadaki yazılar
Sayfanın metni
Sayfa 47
Oysa flip floplarda durum tam tersidir. Örneğin bir flip flop türü olan toggle-flip floplar şöyle çalışır. Bu flip flopun bir girişi vardır. Bu girişe toggle adı verilir. Çıkış ise flip flopun o an sakladığı bilgidir (bir bitlik bilgi yukarıdan hatırlayın). Toggle değeri 0 iken değer değişmez. Toggle 1 yapılırsa çıkış değişir. 0 ise 1, 1 ise 0 olur. Şimdi dikkat ederseniz bu devrenin giriş değerini bilmemiz çıkışı tahmin etmemize yetmiyor. Devre aynı girişe farklı durumlarda farklı çıkış veriyor. Yani devrenin bir durumu başka bir deyişle bir hafızası var.
Şimdi bu temel kavramı toparlayalım. En basitten en karmaşığa kadar bütün dijital devreler bu iki tip alt devrelerin birleşiminden oluşur. Bu iki tür devre tipine sık sık değineceğim.
ALU (Arithmetic Logic Unit)
Şimdi ALU konusuna dönelim. ALU'nun kombinasyonel (yani hafızası olmayan) bir devre olduğunu söylemiştim. ALU giriş olarak iki tane 8 bitlik hat ve yapılacak işlemi seçen bazı kontrol hatları alır. Çıkışı da 8 bitlik bir hattır. CPU içinde genelde registerlar ALU'nun girişlerine dijital anahtarlarla (ki bunlara bus transceiver da denir) bağlanır. Bu anahtarlar kapatılırsa o registerda saklanan değer ALU'ya giriş parametresi olarak verilmiş olur. Ayrıca bellekten okunan bir değer de ALU girişine bağlanabilir. Bu bağlantı yapılıp kontrol girişlerine de yapılması istenen operasyon belirtildiği anda ALU'nun çıkışında sonuç belirir. Bu çıkış yine dijital anahtarlarla bir registera bağlanabilir. Böylece 2 registerla veya bellekle yapılan bir işlemin sonucu tekrar bir registera saklanmış olur.
Bu bölümü sağ salim atlatabildiyseniz ciddi bir tebriği hak ettiniz. Şu anda CPU mimarisi ile ilgili çok temel bazı kavramları anlamış bulunuyorsunuz. Eğer anlamadıysanız çok önemli değil ama ara sıra tekrar okuyarak ya da bize yazarak bu problemi çözmeye çalışın.
Özet olarak CPU'muzda registerlar ve ALU sayesinde artık registerlara bir takım değerler yüklüyor, bunlar arasında işlemler yapıp sonuçları tekrar registerlara saklayabiliyoruz. Bu CPU ile şu halde pek çok faydalı iş yapılabilir. Fakat biz bilgisayar dediğimiz alete doğru basitten karmaşığa gelişen bir yolculuğa devam edeceğiz. Önümüzdeki konu bellek
Bellek
Bellek her biri registerlara benzeyen 8'er bitlik saklama hücrelerinin bir araya getirilmesiyle oluşturulan hafıza bloğudur. Registerlardan daha ucuz ve daha yavaştır. Bu yüzden daha bol miktarda konulabilir.
Bellekteki her bayta erişebilmemizi sağlayan şey adresleme kavramıdır. Örneğin 64 kilobaytlık bir bellekte adresleri 0'dan başlayıp yaklaşık 64000 civarlarına kadar uzanan yaklaşık 64000 kutucuk vardır. Bu kutucukların her biri bir baytlık (0-255 arası) bir değer alabilir.
Bellek çipleri üzerinde adres ve data bus adı verilen pinler olur. Bir pin ile de okuma veya yazma seçeneği seçilir. Mesela okuma/yazma pinine okuma seçeneğini koyup adres bus'a 15 yazarsak, 15. adresteki baytın değeri data bus'da gözükür.
Bus nedir? Dijital elektronikte çipleri veya çiplerin içindeki alt bölümlerin birbirleriyle data alışverişi yapmalarını sağlayan çoğu zaman 8, 16, 32 bitlik hatlara bus denir. Mesela CPU'dan bahsederken ALU'nun çıkışının A registerine bağlı olduğunu söylemiştim. İşte bu bağlantı ALU devresinin çıkışındaki 8 bağlantı noktasından A registerinin girişindeki 8 giriş bağlantı noktasına giden yan yana 8 kablodan ibarettir.
İşte CPU ve belleği bir araya koyarsak daha çok iş yapabilen bir CPU elde edebiliriz. CPU genelde Bellek Adres Tamponu ve Bellek Data Tamponu denilen registerlar içerir. Bu registerlar bellek çipinin adres ve data buslarına bağlıdır. Böylece CPU Adres Tamponuna bir değer yazıp, bellekte o adreste bulunan data değerini Bellek Data Tamponuna yükleyebilir. Böylece o registerdaki değer herhangi bir diğer registera kopyalanabilir. Bu register da ALU'ya bağlıdır. Böylece bellekten okunan bir değer o an registerlarda bulunan değerlerle aritmetik/mantıksal bir işleme sokulabilir. Son olarak registerlardan birindeki değer Bellek Data Tamponuna kopyalanıp ardından Bellek Adres Tamponuna istenen bir adres yazılır ve okuma/yazma pini de yazma durumuna getirilirse, CPU bellekteki istediği bir adrese herhangi bir registerin değerini yazmış olur.
Şekil 2.
Şu an önemli bir noktaya geldik. Artık elimizde bayağı yetenekli bir cihaz var. Elimizdeki bellekte duran bilgileri okuyup registerlara yüklüyor ardından üzerlerinde bazı işlemler yapıyor ve sonuçları tekrar bellekte saklayabiliyoruz. Bir örnek inceleyelim... Diyelim ki bellekteki 10 adresindeki sayı ile 15 adresindeki sayılar toplanıp sonuç 100 adresine yazılacak. Olaylar şu sırayla olur.
1. Adres Tamponuna 10 yazılır. Okuma modu seçilir. Data tamponuna 10 adresindeki data gelir. 2. Data tamponundaki değer A registerine kopyalanır. 3. Adres Tamponuna 15 yazılır. Okuma modu seçilir. Data tamponuna 15 adresindeki data gelir. 4. ALU'da toplama işlemi seçilir. ALU'nun bir inputunda A diğer inputunda Data tamponu bağlantıları açılır. Toplamanın sonucu A registerine geri yüklenir.
Klavyeyle gezinmek için ← ve → tuşları.
Sayfa 46
Bu yazıda her programcının bilmesi gerektiğine inandığım bazı temel kavramlardan bahsedeceğim. Bu kavramlar programcılık üzerine çalışmak isteyen ve yeni başlayan kişilerin daha hızlı öğrenmelerini sağlarken, uzun süredir programcılık yapan fakat elektronik tabanı fazla olmayan kişilerin de bilgi dağarcıklarında kalan olası boşlukları doldurmakta yardımcı olabilir. Kısa kısa değineceğim konu başlıkları şunlar:
1. Register (yazmaç) nedir? 2. CPU nelerden oluşur? 3. Bellek nedir? 4. Bir CPU bellekteki programı nasıl çalıştırır? 5. Komutlar (instruction) neye benzer?
6. Makine kodu komutlardan Assembler'a geçiş
Register Nedir
Bilgisayar mimarisinden bahsederken önce registerları incelemek lazım. Dijital elektronikte en küçük bilgi saklayabilen birim flip flop adı verilen devredir. Bu devreye 1 veya 0 değerlerinden birini verirseniz, siz başka bir şey yapana kadar bu değeri saklamayı becerir. Böylece bir bitlik bir bilgiyi saklamış olursunuz. Eğer 2 flip flopunuz varsa bu ikisine 1'ler ve 0'lar saklayarak toplam 4 farklı değeri taşıyabilen bir hafıza devresi elde edebilirsiniz. İşte registerlar bu şekilde 4 veya 8 veya başka sayıda flip flopların yan yana getirilmesiyle oluşturulur. Biz genelde 8 bitlik (yani 8 flip flopluk) registerlarla uğraşacağız.
8 bitlik bir registerdaki her bit'e 1 veya 0 yazarak toplam 256 değişik değer yazabiliyoruz. Bu değerler genelde ikilik sayı düzeninde 8 basamaklı bir sayı olarak ifade edilir. 10010111 veya 01101111 gibi... Bunları genelde onluk düzendeki 0'dan 255'e kadar olan sayılar olarak yorumluyoruz. Bazen de -128'den 127'ye kadar ki sayılar olarak yorumlayabiliriz. Programdaki amacımıza göre bu bit dizilerine farklı anlamlar yükleyebiliriz. Ama her koşulda toplam 256 değişik değerden fazlasını yazamıyoruz, bunu unutmayalım. Böyle 256 değişik değer alabilen bir bilgi kutucuğuna bayt (byte) adı verilir. Yani 64 kilo byte'lık bir dosya yaklaşık 64000 tane 0 ile 255 arası sayının oluşturduğu bir bilgi grubudur.
Yeniden bir toparlayalım. Register nedir? Register içine 255'e kadar bir sayı yazılabilen ve bu değeri unutmayan kutucuklardır. Şimdi CPU yaparken registerların oynadığı rolü inceleyelim. (Not: registerların tek görevi bilgi saklamak değildir aslında ama şimdilik konuyu karıştırmayalım.)
CPUlişlemci)
Bu noktada bir CPU tasarımı yaptığımızı farz edelim. İşleri basit tutmak için ilk etapta 8-bitlik (bunun tam olarak ne demek olduğunu sonra anlayacaksınız) bir CPU tasarlayacağız. Bu basit CPU'muza 3 tane 8 bitlik register koyalım ve bunlara A, X, Y adlarını verelim. Bu CPU herhangi bir anda içinde 3 tane 8-bitlik değer (yani 3 bayt) saklayabiliyor. Gerçekte bir CPU'da bundan fazlası var ama şimdilik devam edelim.
Şekil 1.
Dikkat ederseniz şu ana kadar registerlarla yapabildiğimiz tek işlem içlerine bilgi saklamak. Fakat bir CPU yapmaya kalkıştığınızda CPU'nuzun bir takım bilgi işleme özellikleri de olmalıdır. Mesela toplama, çıkarma gibi aritmetik işlemler ya da VE / VEYA gibi mantıksal işlemler yapabilmemiz için registerlardan fazlasına ihtiyaç var. İşte bu noktada yardımımıza ALU koşuyor. ALU birtakım aritmetik işlemleri yapabilen kombinasyonel bir devredir.
Kombinasyonel devre nedir?
Dijital elektronikte bütün devreler iki gruptan birisine mensuptur. Kombinasyonel devreler ve durumlu (state) devreler. Kombinasyonel devreler, içlerinde herhangi bir durum bilgisi taşımayan devrelerdir. Bu devrelerin girişleri ve çıkışları arasında bir bağıntı olur. Giriş değerlerinin herhangi bir andaki değerini bilirseniz çıkış değerini de bilirsiniz. Mesela mantık kapıları bu sınıfa girer.
Örneğin 2 girişli bir VE kapısını ele alalım. Girişlerden her ikisi de 1 olursa çıkış 1'dir. En az bir giriş 0 ise çıkış 0'dır. Dolayısıyla biz iki girişe 1 veya 0 yazdığımızda sonucun ne olacağını biliriz. Girişlerin değerlerinin daha önce ne olduğunun önemi yoktur. Başka bir deyişle, devrenin bir durumu ya da hafızası yoktur.