Proje Özeti #
Ben Eater’ın SAP-1 mimarisinden ilham alarak, temel lojik kapılar ve entegreler kullanarak sıfırdan 8-bitlik bir CPU (Merkezi İşlem Birimi) tasarladım. Ekim 2025’te tamamladığım bu proje, modern bilgisayarların temelini oluşturan işlemci mimarisi, bellek adresleme ve düşük seviye makine kodu işleyişini donanım seviyesinde uygulamalı olarak göstermektedir.

Sistem Mimarisi #
- CLK (clock / saat): Devrenin kalbidir. İşlemcinin tüm birimlerinin senkronize, yani aynı anda ve düzenli bir ritimle çalışmasını sağlar.
- Program Counter (Program Sayacı): Çalıştırılacak bir sonraki komutun RAM’deki adresini tutar. Sayıcımız katı bir şekilde 0-255 arasında yani 8 bit değer alacak şekilde tasarlanmıştır. Her komut işlendiğinde bir artarak sıradaki komuta geçer.
- MAR (Memory Address Register): RAM’deki işlem yapılacak (okunacak veya yazılacak) noktanın adresini geçici olarak tutar.
- RAM (Random Access Memory): Yazılan programın komutlarını ve işlenecek verileri saklayan bellektir.
- Instruction Register (IR - Komut Kaydedici): RAM’den çekilen sıradaki komutu içine alır ve tutar. Bu komut daha sonra ne yapılacağının anlaşılması için kontrol birimine gönderilir.
- Control Logic (OPCODE ROM, Step Counter, Decoder): İşlemcinin beynidir. IR’deki komutu alır, çözer ve o komutu gerçekleştirmek için hangi birimlerin çalışması gerektiğine karar verir. Yeşil kontrol hatlarına (örneğin RAM_OUT, A_IN) sinyal göndererek veri trafiğini yönetir.
- Register A & Register B: Aritmetik işlemler için sayıların geçici olarak tutulduğu hafıza hücreleridir. ALU işlemleri genellikle A register üzerinden döner.
- ALU (Aritmetik Logic Unit/Aritmetik Mantık Birimi): Toplama ve çıkarma gibi matematiksel işlemleri gerçekleştiren donanımdır. A ve B Register’larındaki sayıları alır, işler ve sonucu tekrar Veri yoluna verir.
- Flags (Bayraklar COUT & ZERO): ALU’da yapılan işlemin sonucuna göre durumu bildirir. Sonuç 0 ise Zero Flag kalkar (1 olur). Taşıntı yani hesaplamanın 8 bite sığmaması varsa Carry Flag değeri 1 olur. Bu durum işlemcinin karar verme mekanizmalarında kullanılır.
- Output Register & BCD: İşlem sonucunu alıp insanların okuyabileceği formatta yani 7 segment display ekranlarında gösteren çıkış birimidir.
Çalışma Mantığı (Fetch, Decode, Execute) #
- Fetch (Getir): Program sayıcısındaki adres RAM’e gönderilir ve ilgili veri Instruction Register’a (IR) çekilir.
- Decode (Çöz): IR’deki 8-bitlik verinin ilk 4 biti (Opcode) kontrol birimine iletilir, sistemin hangi işlemi yapacağı belirlenir.
- Execute (Çalıştır): Kontrol birimi, Veri Yolu üzerindeki ilgili modüllerin (ALU, Register A/B) kapılarını açarak işlemi fiziksel olarak gerçekleştirir.
Komut seti (Instruction Set) Ne işe yarar? #
İşlemciler sadece 1’ler ve 0’lardan anlar. 8 bitlik bir işlemcide her komut 8 bitten oluşur. Ben Eater mimarisinde bu 8 bitin ilk 4 biti opcode (opcode) “Ne yapılacağını”, son 4 bit (operand) ise “Kiminle/Hangi adreste yapılacağını” söyler.
- 0000 (NOP): Hiçbir şey yapma, bir sonraki adıma geç.
- 0001 (LDA): Verilen adresteki veriyi RAM’den al, A Register’ına yükle.
- 0010 (ADD): Verilen adresteki veriyi RAM’den al, A Register’ındaki mevcut sayıyla topla.
- 0100 (STA): A Register’ındaki sonucu al, RAM’deki belirtilen adrese kaydet.
- 0101 (LDI): Bu komut RAM’e gitmez. Direkt olarak son 4 bitte yazan sayıyı (Immediate value) alıp A Register’ına yükler.
- 0110 / 0111 / 1000 (JMP, JC, JZ): Programın normal akışını bozup başka bir adrese atlamasını sağlar. JC (Carry varsa atla) ve JZ (Sonuç sıfırsa atla) döngüler (loop) oluşturmak için kritiktir.
- 1110 (OUT): A Register’ındaki sayıyı ekrana (Output Register) gönder.
- 1111 (HLT): Saat sinyalini durdur, programı bitir.
Ardışık Sayıların Toplamı Makine Kodu Örneği #
RAM’in 16 satırlık (0’dan 15’e kadar) hafızasına yüklenecek kodlar:
1D 2E 4D E0 1E 2F 4E 79 60 F0 00 00 00 00 01 01Kodların Çalışması: #
Öncelikle programın çalışması için RAM’in en sonundaki adresleri (13, 14 ve 15. adresler) “veri deposu” olarak kullanıyoruz:
- Adres 13 (D):
00(Toplamı burada tutacağız, başlangıçta 0) - Adres 14 (E):
01(Sayacımız, her adımda artacak sayı. Başlangıçta 1) - Adres 15 (F):
01(Sabit 1 sayımız. Sayacı artırmak için kullanacağız)
Çalıştırılacak Komutlar (Adres 0’dan itibaren):
- Adres 0 - 1D (LDA 13): RAM’in 13. adresindeki değeri (Toplamı) A Register’ına yükle.
- Adres 1 - 2E (ADD 14): RAM’in 14. adresindeki değeri (Sayacı) A Register’ındaki sayıyla topla. (Örn: İlk turda 0 + 1 = 1)
- Adres 2 - 4D (STA 13): A Register’ında oluşan yeni toplamı tekrar RAM’in 13. adresine kaydet. (Yeni toplam güncellendi).
- Adres 3 - E0 (OUT): A Register’ındaki güncel toplamı ekrana (Output) yansıt.
- Adres 4 - 1E (LDA 14): Şimdi RAM’in 14. adresindeki değeri (Sayacı) A Register’ına al.
- Adres 5 - 2F (ADD 15): A Register’ındaki sayaca, RAM’in 15. adresindeki “sabit 1” değerini ekle. (Sayaç 2 oldu).
- Adres 6 - 4E (STA 14): Bu yeni sayacı (2 değerini) tekrar RAM’in 14. adresine kaydet.
- Adres 7 - 79 (JC 9): Carry Flag kontrolü. Eğer toplam 8-bit sınırını (255) aştıysa, programı bitirmek için 9. adrese git.
- Adres 8 - 60 (JMP 0): Programın başına (0. adrese) zıpla ve yeni sayaçla döngüyü tekrarla.
- Adres 9 - F0 (HLT): İşlemciyi durdur.