Dijital Simulasyon ve İşlemci Tasarımı



Benzer belgeler
KASIRGA 4. GELİŞME RAPORU

EEM122SAYISAL MANTIK SAYICILAR. Elektrik Elektronik Mühendisliği Yrd. Doç. Dr. Hüseyin Sağkol

(Random-Access Memory)

BM-311 Bilgisayar Mimarisi. Hazırlayan: M.Ali Akcayol Gazi Üniversitesi Bilgisayar Mühendisliği Bölümü

BM-311 Bilgisayar Mimarisi

MİKROİŞLEMCİ MİMARİLERİ

William Stallings Computer Organization and Architecture 9 th Edition

Uzaktan Eğitim Uygulama ve Araştırma Merkezi

BM-311 Bilgisayar Mimarisi

BİLGİSAYAR MİMARİSİ. Komut Seti Mimarisi. Özer Çelik Matematik-Bilgisayar Bölümü

Bilgi ve İletişim Teknolojileri (JFM 102) Ders 10. LINUX OS (Programlama) BİLGİ & İLETİŞİM TEKNOLOJİLERİ GENEL BAKIŞ

Bilgisayar Mimarisi Nedir?

Merkezi İşlem Birimi MİKROİŞLEMCİ SİSTEMLERİ. MİB Yapısı. MİB in İç Yapısı. MİB Altbirimleri. MİB in İç Yapısı

DOĞU AKDENİZ ÜNİVERSİTESİ BAHAR BİLGİSAYAR MÜHENDİSLİĞİ BÖLÜMÜ BLGM-324 BİLGİSAYAR MİMARİSİ DENEY #6

Bölüm Bazı Temel Konseptler

Mimari Esaslar. Mikroişlemcinin mimari esasları; Kaydediciler Veriyolları İş hatları dır.

Mikrobilgisayar Sistemleri ve Assembler

Ders Adı Kodu Yarıyılı T+U Saati Ulusal Kredisi AKTS. Bilgisayar Organizasyonu BIL

BM-311 Bilgisayar Mimarisi

BM 375 Bilgisayar Organizasyonu Dersi Vize Sınavı Cevapları 10 Nisan 2009

T.C. İstanbul Medeniyet Üniversitesi Mühendislik ve Doğa Bilimleri Fakültesi Elektrik-Elektronik Mühendisliği Bölümü

BİLGİSAYAR MİMARİSİ. Bilgisayar Bileşenleri Ve Programların Yürütülmesi. Özer Çelik Matematik-Bilgisayar Bölümü

İşletim Sistemlerine Giriş

BM-311 Bilgisayar Mimarisi

Nesne Yönelimli Programlama

Bitirme Ödevi Sunumu PLATFORM BAĞIMSIZ BENZETİM PROGRAMI. Danışman : Yrd.Doç.Dr. D Feza BUZLUCA Gökhan Akın ŞEKER

Bilgisayar Mimarisi ve Organizasyonu Giriş

PROGRAMLAMAYA GİRİŞ. Öğr. Gör. Ayhan KOÇ. Kaynak: Algoritma Geliştirme ve Programlamaya Giriş, Dr. Fahri VATANSEVER, Seçkin Yay.

Hem lw hem de sw komutlarının ofseti 16-bitlik işaretli tamsayıdır.

Bilgisayarların Gelişimi

Android Ders Notları

BÖLÜM FORMÜLLER ve OTOMATİK TOPLAM Formüller

KONTROL VE OTOMASYON KULÜBÜ

DERS 3 MİKROİŞLEMCİ SİSTEM MİMARİSİ. İçerik

Bilgi ve İletişim Teknolojileri (JFM 102) Ders 7. LINUX OS (Sistem Yapısı) BİLGİ & İLETİŞİM TEKNOLOJİLERİ. LINUX Yapısı

PHP, nesne-yönelimli (object-oriented) bir dil olduğu için, nesne oluşturma imkânına ve bunların kullanılmasını sağlayan metodlara da sahiptir.

Bilgisayar Mühendisliğine Giriş. Yrd.Doç.Dr.Hacer KARACAN

Merkezi İşlem Birimi MİKROİŞLEMCİ SİSTEMLERİ. MİB Yapısı. MİB Altbirimleri. Durum Kütüğü. Yardımcı Kütükler

Dr. Feza BUZLUCA İstanbul Teknik Üniversitesi Bilgisayar Mühendisliği Bölümü

İşletim Sistemleri (Operating Systems)

C# Programlama Dili. İlk programımız Tür dönüşümü Yorum ekleme Operatörler

DOKUZ EYLÜL ÜNİVERSİTESİ MÜHENDİSLİK FAKÜLTESİ DEKANLIĞI DERS/MODÜL/BLOK TANITIM FORMU. Dersin Kodu: CME 2006

Mikroçita. Mikroçita Rapor 2:

SPARC v8 İŞLEMCİ SİMÜLASYONU

Tarih Saat Modül Adı Öğretim Üyesi. 01/05/2018 Salı 3 Bilgisayar Bilimlerine Giriş Doç. Dr. Hacer Karacan

Ders Notlarının Creative Commons lisansı Feza BUZLUCA ya aittir. Lisans:

T.C. KOCAELİ ÜNİVERSİTESİ TEKNOLOJİ FAKÜLTESİ BİLİŞİM SİSTEMLERİ MÜHENDİSLİĞİ

Çoktan Seçmeli Değerlendirme Soruları Akış Şemaları İle Algoritma Geliştirme Örnekleri Giriş 39 1.Gündelik Hayattan Algoritma Örnekleri 39 2.Say

DOĞU AKDENİZ ÜNİVERSİTESİ BAHAR BİLGİSAYAR MÜHENDİSLİĞİ BÖLÜMÜ BLGM-324 BİLGİSAYAR MİMARİSİ

Deney 2: Flip-Floplar

İŞLETİM SİSTEMİ KATMANLARI (Çekirdek, kabuk ve diğer temel kavramlar) Bir işletim sisteminin yazılım tasarımında ele alınması gereken iki önemli konu

x86 Ailesi Mikroişlemciler ve Mikrobilgisayarlar

MAT213 BİLGİSAYAR PROGRAMLAMA I DERSİ Ders 1: Programlamaya Giriş

Data Structures Lab Güz

Bit, Byte ve Integer. BIL-304: Bilgisayar Mimarisi. Dersi veren öğretim üyesi: Yrd. Doç. Dr. Fatih Gökçe

Java Temel Özellikleri

Algoritma Geliştirme ve Veri Yapıları 9 Ağaç Veri Modeli ve Uygulaması. Mustafa Kemal Üniversitesi

SAYISAL MANTIK LAB. PROJELERİ

BM-311 Bilgisayar Mimarisi

Şekil. 64 Kelimelik Yığıtın Blok Şeması

Excel de çalışma alanı satır ve sütunlardan oluşur. Satırları rakamlar, sütunları ise harfler temsil eder. Excel çalışma sayfası üzerinde toplam

Bölüm 4 Ardışıl Lojik Devre Deneyleri

HAFTA 1 KALICI OLMAYAN HAFIZA RAM SRAM DRAM DDRAM KALICI HAFIZA ROM PROM EPROM EEPROM FLASH HARDDISK

Yrd.Doç.Dr. Celal Murat KANDEMİR. Kodlama (Coding) : Bir nesneler kümesinin bir dizgi (bit dizisi) kümesi ile temsil edilmesidir.

Günümüz bilgi toplumunda bilgisayar, her alanda kendine yer edinmiş ve insana, bir çok işlemde yardımcı olarak büyük kolaylık sağlamaktadır.

İŞLETİM SİSTEMİ İşletim sistemi kullanıcıyla bilgisayar donanımı arasında iletişim sağlayan programdır.

Komutların Yürütülmesi

HESAP MAKİNASI YAPIMI

18. FLİP FLOP LAR (FLIP FLOPS)

Dr. Fatih AY Tel: fatihay@fatihay.net

Üst Düzey Programlama

SAYI SİSTEMLERİ ve BOOLE CEBİRİ 1+1=1 ÖĞR.GÖR. GÜNAY TEMÜR - TEKNOLOJİ F. / BİLGİSAYAR MÜH.

Yarım toplayıcının fonksiyonelliği ile 4 x 2 bit ROM hafıza(çok küçük bir hafıza) programlandığının bir örneğini düşünelim:

BÖLÜM Mikrodenetleyicisine Giriş

BSE 207 Mantık Devreleri Lojik Kapılar ve Lojik Devreler (Logic Gates And Logic Circuits)

NB Macro Kullanımı Hakkında Genel Bilgiler

BMÜ-111 Algoritma ve Programlama. Bölüm 5. Tek Boyutlu Diziler

MPLAB IDE v7.60 PROGRAMI KULLANIMI

Yazılım Mühendisliği Bölüm - 3 Planlama

BBM 231 Yazmaçların Aktarımı Seviyesinde Tasarım! Hacettepe Üniversitesi Bilgisayar Müh. Bölümü

Mikroişlemcilerde Aritmetik

Hacettepe Robot Topluluğu

Geçtiğimiz hafta# Dizisel devrelerin tasarımı# Bu hafta# Örnek: Sekans algılayıcı# Örnek: Sekans algılayıcı# 12/11/12

1.1. Yazılım Geliştirme Süreci

Quiz:8086 Mikroişlemcisi Mimarisi ve Emirleri

BM-311 Bilgisayar Mimarisi

DOĞU AKDENİZ ÜNİVERSİTESİ BAHAR BİLGİSAYAR MÜHENDİSLİĞİ BÖLÜMÜ BLGM-324 BİLGİSAYAR MİMARİSİ. PC-SPIMGirişi(MIPS R2000 Simulatörü)

SIMAN KULLANIM KILAVUZU

William Stallings Computer Organization and Architecture 9 th Edition

Diziler İndisli Değişkenler

Bu derste! BBM 231 Yazmaçların Aktarımı Seviyesinde Tasarım! Yazmaç Aktarımı Düzeyi! Büyük Sayısal Sistemler! 12/25/12

ÇOK ÇEKİRDEKLİ İŞLEMCİLER VE PARALEL YAZILIM GELİŞTİRME OLANAKLARI HAKKINDA BİR İNCELEME

TEMEL BİLGİSAYAR BİLİMLERİ. Programcılık, problem çözme ve algoritma oluşturma

PLC (Programlanabilir Kontrol Cihazı) TABANLI SİSTEMLERİN İNTERNET ÜZERİNDEN İZLENMESİ

NESNEYE YÖNELİK PROGRAMLAMA

MİKROBİLGİSAYAR SİSTEMLERİ. Teknik Bilimler Meslek Yüksekokulu

BÖLÜM 2 SAYI SİSTEMLERİ

BILGISAYAR ARITMETIGI

MPLAB IDE ve ISIS ile ASSEMBLY DİLİNDE UYGULAMA GELİŞTİRMEK

3.3. İki Tabanlı Sayı Sisteminde Dört İşlem

Transkript:

Dijital Simulasyon ve İşlemci Tasarımı David Currie, ST John's Collage Mühendislik ve Bilgisayar Bilimleri, Bölüm 2, 1998 Supervisor - Dr J Sanders 1

İçerik 1 Giriş... 3 2 Programlama Dilleri... 5 3 Simulasyon... 5 4 Düzenleyici ve Simulator... 8 5 Temel Bileşenler... 10 6 Sadeleştirilmiş MIPS Komut Seti... 18 7 Tek Döngülü İşlemci... 19 8 Çift Döngülü İşlemci... 27 9 İş Hatlı (Pipelined) İşlemci... 33 10 Sonuç... 37 11 Referanslar... 38 Ek-A - İlerleme Raporu... 38 2

1. Giriş 1.1 Arka Plan 1960'ların ortalarında entegre devrelerin keşfi ve 3. nesil bilgisayarların üretilmesiyle üreticiler daha küçük silikon parçaları üstüne daha çok transistor sığdırmak için yollar arıyorlardı. Tasarımcılar bu artan bilgisayar gücünü, COBOL ve Pascal gibi yüksek seviye dillerle düşük seviye assembly dili arasındaki anlamsal boşluğu doldurma amacıyla daha da karmaşık komut setleri oluşturmak için kullandılar. Bu sözde karmaşık komut setli bilgisayarlar (CISC Complex Instruction Set Computers), işlemciye oranla çok yavaş olan ana bellekle kıyaslandığında heyecan vericiydi. Bu yapıda, örneğin ikilik sistemden onluk sisteme çeviri gibi genel bir fonksiyonun, yavaş kütüphane rutinlerinden çağrılması yerine basitçe yeni bir komut ekleniyordu. 1970'lerde işler değişmeye başladı. Öncelikle yarı-iletken RAM bellekleri artık ROM'lardan 10 kat daha yavaş değildi. Ayrıca bu karmaşık mikrokodları yazmak, debug etmek ve bakım yapmak giderek zorlaşan bir iş oluyordu - mikrokodda bir bug bütün yüklenmiş ROM'ların değişmesi anlamını taşıyor. Üçüncü olarak Tanenbaum gibi akademisyenler programların genel yapısını incelediler ve kullanılan komutların ortalama %80'inden fazlasının basit işlemlerden oluştuğunu keşfettiler, if koşulları, prosedür çağırmaları gibi. Görevlerde %95 oranında sağ tarafta ya sadece tek bir operatör bulunuyor ya da hiç bulunmuyordu. Bütün çağırmaların %90'ından fazlasında 5 değişkenden daha azı kullanılıyor ve prosedürlerin %80'inde 4 yerel değişkenden azı bulunuyordu. Bu sonuçların özeti insanların karmaşık kodları yazmıyor olmasıydı. Daha çok komut daha fazla adresleme noktası demektir ki bu da daha büyük ve yavaş bir yorumlayıcı anlamına gelir. Mikroprogramlama artık bilgisayarların verimliliğini düşüren bir hal almıştı. Bu durum yeni nesil RISC (Reduced Instruction Set Computers İndirgenmiş Komut Setli Bilgisayar) işlemcilerin, IBM 801 (1975), the Berkley RISC1 (Patterson ve Sequin 1980) ve Stanford MIPS (Hennessy, 1984) habercisi oldu. Hepsinin ortak amacı veriyolundaki işlem süresini azaltmaktı. Tablo 1'de RISC işlemcilerin karakteristik özellikleri sunulmaktadır. Tek döngü süren basit komutlar Sadece referans belleğe yukleme/kaydetme Yüksek seviye iş hattı (pipeline) Komutların donanım tarafından işlenmesi Sabit komut formatı Az sayıda komut ve mod Karmaşık yapının derleyici üzerine kaydırılması Çoklu yazmaç setleri Tablo 1 RISC işlemcilerin karakteristik özellikleri 3

1.2 Projeye Genel Bakış Bu projenin amacı, işlemci ünitesini tasarlamak, oluşturmak ve dijital simulasyon ortamında test etmektir. Bu RISC ve CISC mimarileri arasındaki temel farkları karşılaştırmak ve ortaya koymak için kullanılacaktır. Devreler Şekil 1'de görülen en düşük 3 seviyeyi, yani dijital mantıktan geleneksel makine seviyesine test için hazırlandı. Bu yaklaşımın amacı kritik parçaların farklı tasarımlardaki ayrıntılı analizi ile her elemanda meydana gelen gecikmeleri görebilmektir. 1.3 Hedefler Projenin hedefleri aşağıda verilmiştir: Şekil 1 Modern Bilgisayarın Katmanları 1. Dijital simulator ve grafiksel arayüzü tasarımı ve yapımı 2. CISC işlemci tasarımı ve simulasyonu 3. RISC işlemci tasarımı ve simulasyonu 4. Simulator kullanarak bu iki işlemcinin performanslarını kıyaslanması Daha ileri arkaplan çalışmaları RISC ve CISC işlemcileri arasındaki farkların o kadar da kesin ve belirgin olmadığını gösterdi. Pipelining örneğin sadece RISC'lere özgü bir yapı değildir. Aynı şekilde RISC işlemcilerde kontrol birimi karmaşıklığının gerekli kıldığı durumlarda mikroprogramlama kullanılabilir. Aynı şekilde, her ne kadar RISC komutları sabit uzunlukta olsada genellikle üç ya da daha fazla farklı format kullanılır. Hedefleri değiştirmemdeki son nedenimse, devreyi, özellike karmaşık komut setini kullanırken olabildiğince basit tutmak istememdi. Bu sebeplerle MIPS işlemcilerde kullanilan tek bir komut setinin baz alınmasına karar verildi. Bu RISC işlemciler için ana hedef olan veriyolu işlem süresini kısaltmak da dahil birçok şekilde kullanılabilir. 4

2. Programlama Dili İlk ve önemli kararlardan biri programın hangi platform için yazılacağına ve hangi dille yazılacağına karar vermek. Her ne kadar PC/Windows tercih edilen geliştirme ortamı olsa da Sun / Solaris de bilgisayar labaratuarında kullanım için uygun bir seçenekti. Giriş değerlerinin verilmesi ve simulasyonun izlenmesi için, seçilecek dilin karmaşık grafiksel kullanıcı arayüzünü (GUI Graphical User Interface) desteklemesi gerekiyor. TCL / TK, Xlib, Xview ve Motif gibi paket programlar, X Windows altında çalışırken bu işi kolaylaştırabilir. Bu ne yazik ki Sun / Solaris platformunu kullanımımızı kısıtlar. Benzer şekilde Visual C++ ya da benzer bir geliştirme platformu kullanımı da programın sadece Windows'ta çalışabilmesini sağlar. Nesne yönelimli bir programlama dili mantıklı bir seçim. Projenin temeli olan mantık kapıları nesne uygulamasıyla kolayca uyum sağlayacak yapıda. Nesne metotları (fonksiyonları), giriş, çıkış sinyalleri ve devrenin olabileceği state durumlarına karşılık gelir. Projeyi Java ile hazırlama kararı verildi. Java'nın platform bağımsızlığı sayesinde Solaris ve Windows da dahil olmak üzre desteklenen herhangi bir platformda proje geliştirilebilir ve kullanılabilir. Java nesne yönelimli bir dil ve her ne kadar bana yeni olsada cok iyi olduğum C++'a yakınlığı işi kolaylaştırıyor. Java AWT sınıfı pencere, menü vb grafiksel kullanıcı arayüzü (GUI) elemanlarını kolayca yapmamıza olanak sağlıyor. Version 1.1 çok kullanışlı olan yeni 'event' tabanlı modellemeyi sağlıyor. Takma adı Swing olan Java Foundation Class (JFC) (her ne kadar tam sürümü projenin sonuna doğru geliştirilmesine rağmen) da projede kullanıldı. Bu sınıf toolbar, popup menüleri ve çok yardımcı olan çift tamponlu scroll panelleri kullanmamıza olanak sağlıyor. Swing sınıfı 1.2 sürümünden itibaren Java'da standart olarak eklenmiş durumda. 3. Simulasyon 3.1 Uygulanabilecek Stratejiler Simulatör tasarlamadan önce kullanılacak stratejinin belirlenmesi gerekiyor. Üç olası seçenek mevcut ve bunlar aşağıda ele alınıyor. 3.1.1 Asenkron Simulasyon İlk akla gelen bu strateji en kolay olan seçenek. Mantık kapısının giriş değerini değiştirdiğimizde çıkış değeri de değişir. Ne yazık ki bu fazla basitleştirmiş bir anlatım. Her ne kadar proje sequential (ardışık) devre simulasyonu için olsada sinyaller yine de paralel ilerliyor. Şekil 2'deki çkış değerleri hep 0 olan basit devreye göz atalım. Başlangıç değerinin 0 olduğunu varsayalım. Şimdi de girişi 1 yapalım. Önce üstteki girişi mi 1 yaptık yoksa alttakini mi? Eğer önce alttakini 1 yaparsak çıkış 0 olarak kalmaya devam eder, ama eğer önce üsttekini 1 yaparsak çıkış, alttakini 1 yapana kadar geçici olarak 1 olacaktır. Şekil 2 Paralel Sinyaller Peki ya Şekil3'teki devre? Geri besleme bağlanmadan önce üstteki giriş 1 ve alttaki 0 olsaydı 5

çıkış 1 olacaktı. Geri beslemenin bağlanması, üstteki girişi 1 yapacak. Bu durum çıkışı 1 yapacak ki bu da üst girişi 1 yapacak. Bu sonsuz döngü sadece girişler değiştiğinde çıkışı değiştirerek önlenebilirdi, ancak bu programı daha karmaşıklaştıracaktır. Şekil 3 - Salınım Şimdi Şekil 3'ü başlangıç değerleri olarak girişleri 1 çıkışı 0 olarak ele alalım. Geri besleme bağlandığında üst girişi 0 yapacak. Bu çıkışı 1 yapacak, üst giriş 1 olacak. Bu sefer sonsuz salınımı simule ederken devrenin geri kalanının işlemini bozmamak için daha da çok dikkat etmemiz gerekecektir. 3.1.2 Senkronize Simulasyon Senkronize simulasyon stratejisi devrede var olabilecek herhangi birşeyden son derece ayrı olarak var olan bir clock sinyaline dayanır. Clock üç fazlıdır. İlk fazda bütün mantık kapıları girişlerindeki değerleri okurlar, ikinci fazda yeni çıkış değerlerini hesaplarlar ve üçüncü fazda da çıkışlarına hesaplanan değeri yansıtırlar. Bu ayırma sayesinde bir sonraki clock sinyaline kadar giriş değerleri etkilenmeyeceği için sinyaller çıkış fazı sırasında istendilen şekilde paralel olarak sorunsuzca gönderilebilirler. Şekil 3'teki salınım clock oranına bağlı olarak oluşacak. Şema kapılarda oluşacak gecikmeleri gösteriyor. Örneğin, Şekil 4'te giriş 0'dan 1'e dönüştüğüde sadece bir clock döngüsü sonra sonuç çıkışta görülecektir. 3.1.3 Yarı Senkron Şekil 4 Mantık kapısında oluşan gecikme Bu strateji farklı uzunluklarda clock sinyallerinin mümkün olduğu bir senkronize strateji üstüne kuruluyor. Eğer tek bir clock sinyalinin süresi bütün kapıların yeniden değerlendirilmesi için gereken süreden azsa bu durum devreye giriyor. Bu kapıların bazılarının çıkış değerlerini yazmadan önce diğerlerinin giriş değerlerini okuması durumunu engelleyebiliyor. 6

3.2 Gerçekleme / Uygulama Yarı senkron strateji kullanımına karar verildi. Elektronik paketleri temsilen soyut (abstrakt) bir Java sınıf paketi oluşturuldu. Paketin construct metodunda sırasıyla giriş ve çıkışları değerlendirmesi üzre addinput() ve addoutput() metotları kullanıldı. Initialize() ve simulate() metodları paket genişletilirken tanımlanmalı. Resetlenme durumunda cağrılan former initialise state olarak kullanılabilir. Latter girişlerin okunup çıkışların oluşturulduğu her clock sinyali arasında cağrılır. Bu iki metot isimlerinde de anlaşılacağı üzre giriş değerlerini almak ve çıkış değerini atamak üzre getinput() ve setoutput() metotlarını kullanabilir. Aşağıdaki örnek bir nand kapısının tasarımında bu yaklaşımın ne kadar kolay olduğunu gösteriyor. Construct() metodunda a ve b girişleri ile c çıkışı pakete ekleniyor. Ayni şekilde bit genişliğini belirten bir sayı da isimlerle birlikte kullanılıyor. Nand kapısının state'i olmadığı için initialise metodu boş. Simulate() metodu iki giriş değerini alıyor ve çıkış değerini üretiyor. Burada getinput() ve setoutput() metodları boolean değerleri gereken bit dizinini belirtiyor. Eğer gerekirse bu metodlar dizin olmaksızın, bütün girişlerin geri döndürülmesi (return) ya da çıkışın binary bir nesne kullanarak belirlenmesi şeklinde kullanılabilir. Binary sınıfı simulasyon sınıfını daha kolay yazmak için toplama, çıkarma, tersini alma gibi binary işlemleri yapan metotlara sahiptir. class NANDGate extends Package { public void construct () { addinput("a", 1); addinput("b", 1); addoutput("c", 1); } public void initialise() { } public void simulate() { setoutput("c", 0,!(getInput("a", 0) && getinput("b", 0))); } } Paket sınıfı kullanıcıyı simulasyon stratejisinin karmaşasından korur. Simulasyon başlatıldığında clock sinyali üreten bağımsız bir thread de başlamış olur. Her clock sinyalinin başında simulasyonda bulunan bütün paketlerin readinputs() metotlari cağrılır. Bu metot paket içinde bulunan bütün giriş verilerini mevcut clock döngüsü sırasında oluşabilecek değişimlerden korumak üzre kaydeder. Getinput() çağrıları kaydedilen verileri geri döndürür. Clock sonrasında bütün bileşenlerdeki simulate metotlarını cağırır. Setoutput() metodunun çağrılması basitçe paketteki yeni çıkışların kaydedilmesidir. Sadece writeoutputs() metodu çağrıldığında değerler çıkış bağlantılarına gönderilir. Bu şekilde yapılmasının nedeni ileride daha iyi anlaşılacak. Bir çıkışın değeri 1 yapıldığında bu çıkışa bağlı bütün bağlantıların hepsi 1 yapılır. Sonrasında bu bağlantıların diğer uçlarında herhangi bir bileşenin girişi olup olmadığı kontrol edilir ve eğer varsa o değerlerde 1 yapılır. Her ne kadar bir çıkış bağlantısından birden fazla bağlantı (wire) çıkabiliyorsa da boolean değerlerindeki karmaşayı önlemek için girişlerde bir bit için sadece tek bir bağlantı olabilir. Java'da kullanılan mantık anahtar ifadeleri 'true' ve 'false' ikilik sistemdeki 1 ve 0'i temsil eder. Simulasyonda floating düşük/yüksek seviyeler tanımlanmayarak, sadelik tercih edilmistir. Bütün giriş ve çıkışlar aksi bir durum olmadıkça 0'dır. 7

4. Düzenleyici (Editor) ve Simulatör Bu bölüm düzenleme ve simulasyon paketlerinin kullanımı ve işleyişiyle ilgili özet bilgiler sunuyor. Baslangıç olarak kullanıcıya Şekil 5'te gösterilen siyah noktalı bir ekran sunulur. Buraya kullanıcı giriş, çıkış ya da paket ekleyebilir. Paketler derlenmiş ve diske kaydedilmiş Java sınıf dosyalarından seçilebilir. İlk olarak nand kapısı, clock, 1 düzey kaynağı ve 0 düzey kaynağı sınıf dosyaları yazılmıştır. Şekil 5 Başlangıçtaki ekran görüntüsü Daha sonra paket bağlantıları wire kullanarak yapılabilir. Bağlantılar tek bitten daha geniş olabileceği için kullanıcının wire ile hangi bitleri bağladığını belirtmesi gerekir. Bir giriş bağlantısı sırasında üstüste binmelerin engellenmesi için eş zamanlı olarak gerekli kontroller yapılır. Paketler ve bağlantılar sürüklenerek ya da bir pop up menü ile silinerek yeniden konumlandırılabilir. Fare imlecinin paket veya bağlantı üstünde bir süre tutulması, Şekil 6'da da görüldüğü üzre bileşen adını içeren bir yazı kutusunun getirilmesini sağlar. Açıklığa destek olmak için paketler üstüste binemez. Bağlantılar kesişme noktalarında karışıklığa sebebiyet verilmemesi için paketlerden başlayarak eklenebilirler. Bu yüzden bağlantılar, aynı sinyali taşıdıkları sürece birbirleriyle kesişebilirler. Eğer devrenin kendisi tekbir paketse kendine ait giriş ve çıkışlar eklenebilir ya da isimlendirilebilir. Devre sonuçları bir simulasyon dosyasına kaydedilip daha sonra başka bir devreye Add Package şeceneği ile eklenebilir. Bu yapı tasarıma modüler bir yaklaşım olanağı sunar. Şekil 6'da clock.class paketiyle notgate.sim paketinin nasıl birbirlerine bağlandıkları görülüyor. Bu devre kaydedildiğinde eklenmiş paketlerdeki tanimları kaydetmez. Bunun yerine sınıfın adı ya da simulasyon dosyasının adresi kaydedilir. Bunun anlamı paketlerin iç yapısında yapılabilecek değişikliklerle oluşturulacak yeni versiyonların, devre yüklendiğinde kendiliğinden değistirilmiş olarak geleceğidir. Tabiyki giriş ve çıkış bağlantıları değiştirilmemesi gerekiyor. 8

Şekil 6 NOT kapısına bağlanmış clock Pencerenin üstünde yer alan tuşlar simulasyon menüsündekilerin aynısıdır. Bunlar simulasyonun adımlanması, calışması, durması ya da resetlenmesini kontrol ederler. Simulasyonu icra eden threadin önceliği, bu tuşlarla kontrol edilip mevcut durumda kesmeye uğratılabilsin (interrupt) diye düşük tutulmuştur. Simulasyon sırasında bağlantı ve kablolar herhangi bir bitleri 1 olduğunda yeşil aksi takdirde kırmızı görünürler. Bu özellikle işlemci devrelerinin kontrol birimini izlerken cok fayda sağlayan bir özellik. Diğer üç metot kullanıcıya simulasyonu daha ayrıntılı izleme imkanı sunar. Bağlantı noktasına eklenecek probe sayesinde gerçek zamanlı olarak giriş-çıkış verilerini izleyebileceğimiz bir pencere açılır. Şekil 7, Şekil 6'daki NOT kapısının giriş ve çıkışına bağlanmış probe sinyallerini gösteriyor. Çizgilerin üstüne yaklaştırma yapılabilir. Burada da kapı gecikmesi net şekilde görülebiliyor (not: zaman sağdan sola doğru artıyor). Çoklu-bit bağlantılarda ikili değerleri gösteren monitörlü bağlantılar daha kullanışlıdır. Şekil 7 Şekil 6'daki devrenin probe göstergesi Üçüncü metot paketlerin statelerini incelemeye olanak sağlar. Yansıma (reflection) isimli bir Java tekniği kullanarak program, bir sınıfın herhangi bir niteliğinin public olarak tanımlanıp tanımlanmadığını kontrol eder. Eğer public ise niteliğin adı ve mevcut değeri gösterilir. Bu durum özellikle simule edilen hafıza biriminin içeriğini görüntülerken yarar sağlamıştır. 9

5. Temel Bileşenler Bu bölüm işlemci için gerekli olan kombinasyonal mantığın nasıl NAND gibi tamamen mantık kapılarından oluşturulduğunu inceliyor. 5.1 NAND Kapısı NAND kapısı bu projede temel devre olarak seçildi. Bu paketin Java kaynak kodu yukarda verilmişti. 5.2 Mantık Kapıları Diğer mantık kapıları NAND kapıları kullanılarak kolaylıkla oluşturulabilir. NOT kapısı Şekil 8'de gösterildiği üzre girişlerin birbirine bağlanması gibi kolay bir yolla elde edilebilir. Parantez içinde verilen sayı, giriş değerinin değişmesiyle çıkışta sonucun tam olarak gösterilmesi arasındaki en fazla gecikme zamanının, NAND kapısı referans alınarak (NAND kapısındaki gecikme 1 birim kabul edilerek) oluşturulmuş halidir. Şekil 8 NOT kapısı uygulaması (gecikme = 1) AND kapısı Şekil 9'da da gösterildiği üzre NAND kapısını NOT kapısına bağlayarak elde edilmiştir. Şekil 9 AND kapısı uygulaması (gecikme = 2) Bir kez daha OR kapısı yapmak için kullanılan kapı sayısını arttırmamız gerekiyor. Şekil 10 OR kapısı uygulaması (gecikme = 2) Şekil 11'de XOR kapısı yapmak için devrenin yapısının biraz daha geliştirilmesi ve karmaşıklaşması gerektiği görülüyor. Bu devrede dikkat edilmesi gereken bir 'tehlike' durumu vardır, bazı sinyaller 2 kapıdan geçerek üretilirken bazılari için 3 kapıdan geçilmesi gerekiyor. Bu yüzden girişteki bir değişiklik çıkışta 2 birim gecikme sonrasında görülebilir, ancak asıl değerine 3 birim gecikme sonra ulaşacaktır. 10

5.3 Çoklayıcılar (Multiplexor) Şekil 11 XOR kapısı uygulaması (gecikme = 3) Şekil 12'de iki tane bir bit giriş sinyali ile bunlar arasında karar vermek için bir seçme sinyali alan basit bir çoklayıcı görülüyor. Şekil 13'de uygun devre sembolü verilmiştir. Daha genel söylersek 2^n m-bit giriş için gereken bilgi dağıtıcı (dekoder) ve seçme devresi 5 birim gecikmeli ve (2^n(1+m)+n+1) kapılı devre gerekecektir. Şekil 12 Bir bitlik 2-1 mux uygulaması (gecikme = 3) Şekil 13 Bir bitlik 2-1 mux devre sembolü 5.4 Aritmetik Mantık Birimi (ALU Arithmetic Logic Unit) ALU birçok alt birimden oluşmuştur. Öncelikle iki tane tek bitlik sayıyı toplayan half adder (yarı toplayıcı) üniteyi inceleyelim. Tablo 2'de gerekli truth table (gerçeklik tablosu) verilmiştir. Elde ve toplam terimleri, girişlerin sırasıyla AND ve XOR karşılıklarıdır. Bu sayede yarı ekleyici basit bir şekilde Şekil 14'teki devre ile oluşturulabilir. 11

A B Elde Toplam 0 0 0 0 0 1 0 1 1 0 0 1 1 1 1 0 Tablo 2 Yarı Toplayıcı Gerçeklik Tablosu Şekil 14 Yarı toplayıcı uygulaması (gecikme = 3) Bir bitten daha fazla sayıyı toplarken Tablo 3' te de gösterildiği şekilde daha düşük bitlerden gelebilecek elde sayısını (carry in) da hesaba katmak gerekir. Elde-tasan (carry out) ve toplam (sum) ifadeleri karmaşık görünse de iki yarı toplayıcı ünitesiyle Şekil 15'teki gibi kolayca elde edilebilirler. A B Elde Giriş Elde Çıkış Toplam 0 0 0 0 0 0 0 1 0 1 0 1 0 0 1 0 1 1 1 0 1 0 0 0 1 1 0 1 1 0 1 1 0 1 0 1 1 1 1 1 Tablo 3 Tam toplayıcı gerçeklik tablosu Şekil 15 Tam toplayıcı (full adder) uygulaması (gecikme = 6) 12

Bizim yapacağımız ALU'nun sadece toplama işleminden daha fazlasını yapabilmesi gerekiyor. Çıkartma, AND, OR ve karşılaştırma işlerini de yerine getirebilmeli. Şekil 16'daki tek bitlik ALU bütün bu işlemleri yerine getirebilir, ki ALU birimi de zaten Şekil 17'de görüldüğü gibi bunların birbirlerine bağlanmasından oluşur. Artı ile işaretlenmiş kare Şekil 15'teki tam toplayıcı ünitesi. Ayrıca istenilen sonucun seçilmesi için çoklayıcı kullanıldığına da dikkat ediniz. Şekil 16 Tek bitlik ALU uygulaması (gecikme = 15) Şekil 17'de bir bitlik ALU'ların bağlanmasıyla nasıl 32 bitlik ripple carry ALU'nun elde edilebileceği gösteriliyor. Operasyon kontrol sinyali; çıkışın, AND kapısı, OR kapısı, toplayıcı ya da less girişi arasından seçilmesi için kullanılıyor. Çıkartma B girişinin negatifi alınarak yapılıyor. Negatifleme (tersini alma) ikinin tersi (two's complement) şeklinde, bütün bitlerin terslerinin (NOT) alınması ve sonrasında 1 eklenmesiyle yapılıyor. Bu ALU birimi içerisinde bütün tek bitlik ALU üniteleri için binvert hattını 1 yaparak ve ALU0'ın elde değerini 1 yaparak sağlanıyor. Tek-bit ALU'nun less girişi set-on-less-than (büyüktür / küçüktür) komutu için kullanılıyor. Son tek-bitlik ALU ünitesi bir önceki toplayıcının çıkışını alan, set adında, fazladan bir çıkışa sahip. Eğer B'nin A'dan çıkartılması (A-B) negatif bir sonuc verirse (A<B durumunda) son ünitedeki çıkış değeri 0 olacaktır. Bu yüzden eger A<B ise bütün birimin çıkışı 1, değilse 0 olacaktır. 13

Şekil 17 32 bitlik ALU uygulaması (gecikme = 173) Şekil 18 ALU sembolü Dikkat ederseniz ALU için böylesi bir tasarımda gecikme cok büyük. Bunun nedeni tam toplayıcıları kullanırken elde sayısının ALU0'dan ALU31'e kadar tek tek gelmesini beklemek zorunda olmamızdır. B0 sinyali ilk ekleyicinin girişine ulaşmak için en fazla 4 gecikmeye uğruyor. Elde girişten elde çıkışa gecen gecikme 5 birim, elde girişten toplam çıkışına 6 birim. Bu nedenle son toplam 4+(31x5)+6=165'lik bir gecikmeden sonra sonuca ulaşır. Çıkış çoklayıcıdaki gecikme 5 birim ve sıfırı hesaplamak için gereken ayrıca 3birimlik bir gecikme daha var. Bununla birlikte ALU içinde başlangıçtan bitişe toplam 173 birimlik bir gecikme söz konusu. Hız carry lookahead yöntemiyle yükseltilebilir ama bu konumuz dışında. Tek bitlik bir ALU ünitesi için 38 NAND kapısı gerekiyor. 32 bitlik bütün bir ALU birimi içinse 1200'ün üstünde. 14

5.5 Yazmaç (Register) Muhtemelen bir işlemci tasarımındaki en önemli bileşenlerden biri veri saklamada kullanılan yazmaçlardır. Yine modüler bir yaklaşım kullanacağız. Öncelikle D-tipi latchlerle başlayalım. Şekil19'daki devre D'den giriş bilgisini alıyor ve CK clock sinyali 1 iken Q çıkışına gönderiyor. Clock sinyali 0 iken çıkıştaki Q değeri, clock tekrar 1 olana kadar bir önceki değerini tutacak. Şekil 19 D-tipi latch uygulaması (gecikme = 3) Bu tam manasıyla tatmin edici bir yöntem değil, çünkü clock 1 iken çıkış değeri Q, girişteki D değerini alıyor. Bizim tam olarak ihtiyacımız olan, verinin clock'un positif ya da negatif ucunda girişten çıkışa iletilmesi. Bunu yapmanın bir yöntemi clock'a köşe-tetiklemeli devre eklemek. Örneğin clock sinyalinin ve tersinin AND'ini alındığında inverterda olusacak gecikmeyle clock'un positif kenarının tepe noktasında tetiklemeyi sağlayabiliriz. Yine de bu projede kullanılan tasarım Şekil 20'de gösterilen master slave flip-flop. Clock sinyali 1 olduğunda ilk latch'in çıkışı giriş değeriyle aynı olacak. Terslenmis clock sinyalinin anlamı ikinci latch'in bu sürede değişmeyeceğidir. Clock 0 olduğu zaman ilk latch'in değeri sabit kalacak ve ikinci latch'in değeri ilkinin çıkışı olacak, bu andaki giriş çıkışa yönlendirilecek. Şekil 20 Flip Flop uygulaması (gecikme = 4) Bundan sonra yapılması gereken n-bitlik yazmaç için n tane flip flop'u Şekil 21'deki gibi paralel şekilde yerleştirmek. Her ne kadar flip flop 11 kapı gerektirse de clock tersleyici ortak kullanılabilir, böylece 32 bitlik yazmaç için toplamda (32x10)+1 = 321 kapı gerektirecek. 15

5.6 Yazmac Dizisi (Register File) Şekil 21 Yazmaç uygulaması (gecikme = 4) Veri depolamak için genellikle bir dizi yazmaç gerekir. Şekil 22'de gösterilen yazmaç dizisi 32 yazaça sahip. Tek bir clock sinyalinde birine yazıp diğerinden okumak mümkün. Tabiyki yazılan bir yazmaç aynı anda okunuyorsa çıkış verisinin doğruluğu garanti edilemez. Sunulan gecikme clock değişimiyle verinin okumaya hazır olması arasında bir değer. Geleneksel olarak Yazmaç0, 0'a bağlanır. Bu yazmaçtan okuma yapıldığında 0 okunur, ve yazma işleminden etkilenmez. Şekil 22 Yazmaç dizisi (gecikme = 11) 16

5.7 Bellek (Memory) Her ne kadar bu proje işlemci tasarımıyla ilgili olsa da işlemcinin herhangi bir pratik kullanımı için veri ve komut belleğine bağlı olması gerekir. Yaygın olarak kullanılan 2 tip bellek mevcuttur, SRAM ve DRAM. Burada hafıza birimlerinin ayrıntılarına değinmeyecegiz ancak mimarimizde bulunan diğer birimlerle iletişim kurmaları yüzünden okuma/yazma gecikme süresine ihtiyacımız var. Bellek ve bağlantılı olarak bellekten veya belleğe veri aktarımı yavaştır ve bu yüzden bizde hafızaya ALU değeriyle aynı olan 180 birimlik bir gecikme atıyoruz. 5.8 Bileşen Soyutlama Bazı birimlerin hızları, tasarımlarındaki çok sayıda kapıdan dolayı yavaş. Bu nedenle simulasyon dosyalarıyla eşdeger java sınıf dosyalarını yaratırken daha yüksek seviyede bir soyutlama yapıldı, paketin çıkış bağlantısı için tampon kullanımı gibi. Addoutput() metodu bu bağlantıdan herhangi bir çıkış sinyaline eklenen gecikmeyi ifade eden fazladan bir değişken alabilir. Bu soyutlamayı kullanarak simulasyonlardan belli bir miktar ayrıntıyı kaybediyoruz. Örneğin her ne kadar gecikmeyi simule ediyor olsak da çıkışlarda yarış durumu oluşmamaktadır. Aşağıdaki kod bu yöntemle yazmaç dizisinin nasıl oluşturulduğunu gösteriyor. class RegisterFile extends Package { private boolean previousclock; public Binary registers[]; public void construct() { addinput("regwrite", 1); addinput("readregister1", 5); addinput("readregister2", 5); addinput("writeregister", 5); addinput("writedata", 32); addinput("clock", 1); // Note delay of 11 on outputs addoutput("readdata1", 32, 11); addoutput("readdata2", 32, 11); } // Initialise all registers to be empty public void initialise() { registers = new Binary[32]; for (int i = 0; i < 32; i++) { registers[i] = new Binary(32); } } public void simulate() { // Check for negative going edge if (previousclock &&!getinput("clock", 0)) { // Set outputs to values of requested registers setoutput("readdata1", registers[getinput("readregister1").intvalue()]); setoutput("readdata2", registers[getinput("readregister2").intvalue()]); // Check if RegWrite high and not writing to Register0 if (getinput("regwrite", 0) && 17

} (getinput("writeregister").intvalue()!=0)) { // Write input to register registers[getinput("writeregister").intvalue()] = getinput("writedata"); } } previousclock = getinput("clock", 0); } 6. Sadeleştirilmiş MIPS Komut Seti Takip eden işlemcinin komut seti MIPS mimarisinin bir alt seti olarak tasarlandı. İlk RISC MIPS longası John Hennessy tarafından 1981 yılında Standford'da tasarlandı ve üretildi. Bizim uygulamaya koyacağımız komutlar Tablo 4'de özetlenmiştir. Bu komutlar bir takım tasarım problemlerinin incelenmesi ve basit bir programın uygulanması için yeterlidir. Instruction Example Meaning add add $1, $2, $3 $1 = $2 + $3 subtract sub $1, $2, $3 $1 = $2 - $3 and and $1, $2, $3 $1 = $2 & $3 or or $1, $2, $3 $1 = $2 $3 load word lw $1, 100 ($2) $1 =Memory[$2+100] store word sw $1, 100 ($2) Memory[$2+100] = $1 branch on equal beq $1, $2, 100 if ($1==$2) go to PC+4+(4 100) set on less than slt $1, $2, $3 If ($2 < $3) $1 = 1 else $1 = 0 jump j 10000 go to 10000 Tablo 4 Basitleştirilmiş MIPS Komut Seti Dolar işaretiyle gösterilen sayılar yazmaç dizisindeki yazmaçları belirtiyor. Bu RISC mimarisinde anahtar bir özellik. Hafıza erişimi yavaş olduğu için, işleme hızı, sayılar işlemci içindeki yazmaçlarda tutarak arttırılmıştır. Load ve store hafızaya bağlanılan tek komutlar. Diğer bütün komutlar işlemleri yazmaçlar üzerinde yapıyor. Bu bizi basitleştirilmiş komut yapısına götürüyor. 32 bit MIPS formatlarının üçü de projedeki tasarım tarafından destekleniyor. 7 Tek-Döngülü İşlemci Tasarıma 3 komut setinin herbiri için gerekli veriyolu ile başlayabiliriz. Bu her komut için işlem tek bir clock sinyali sürecektir. 7.1 Komut Alımı (Instruction Fetch) Komut alımı bütün komut formatları için ortaktır. Basitleştirmek için komut ve veri belleklerini ayırıyoruz. 32-bitlik program sayacı (PC program counter) adındaki yazmaç, hafızadaki bir sonraki komutun adresini tutar. Yazmaç komutun hafızadan okunduğu sürece sabit kalmasını sağlar. Her komut 4 bytedan oluştuğu için bir sonraki komuta erişmek için program 18

sayacını her clock'da bu kadar arttırmamız gerekir. Şekil 23 bu işlemin yapılması için gereken basit bir devreyi içeriyor. 7.R-Format Komuları Şekil 23 Komut alma Döngünün bir sonraki aşaması komutun anlaşılması, çözülmesi ve gerekli veriyolunun ayarlanmasını gerektirir. R-format komutları aritmetik ve mantıksal işlemler için kullanılır. Tablo 5 komutları içeren alanları gösteriyor. Bütün R-format komutlar için opcodelar aynıdır. Alan Bits op Anlamı 6 opcode(000000) rs 5 İlk kaynak yazmacı rt rd shamt funct 5 İkinci kaynak yazmacı 5 Hedef yazmacı 5 Kaydırma miktarı 6 Aritmatik/mantık fonksiyonu Tablo 5 R-Format Komut Alanı Tablo 6'da örnek bir komut görülüyor, add $1,$2,$3. Her aritmetik/mantık işleminin onunla bağlantılı bir fonksiyon kodu bulunur. Komutların sabit format olması sayesinde gerekli alanların düzenlenmeleri çok kolaydır. op rs rt rd shamt funct 000000 00010 00011 00001 00000 100000 Tablo 6 add $1, $2, $3 işlemi için gereken komut 19

İki farklı kaynak yazmacından veri alıp bir ALU işlemi uygulayıp sonrasında elde edilen veriyi 3. bir yazmaca yazmak bütün R-format komutlarda aynı olan uygulamadır. Bu işlem için gereken veriyolu Şekil 24'de verilmiştir. 7.3 I-Format Komutları Şekil 24 R-Format veriyolu I-format komutları veri transferi ya da dallanma (branch) gibi hızlı adres gerektiren işlemlerde kullanılır. Tablo 7'de komutların formatı verilmiştir. Burada opcode tek başına belirli bir işlemi tanımlamak için kullanılmıştır. Alan Bitler Anlamı op 6 adres rs 5 İlk kaynak yazmacı rt 5 İkinci kaynak yazmacı adres/hızlı 16 Adres ya da hızlı değer Tablo 7 I-Format Komut Seti Son alan, yükleme ve kaydetme işlemlerinde ilk yazmaçta bulunan gerekli adres bilgisinin ofsetini içerir. Bu adres düzenlemeyi kolaylaştırır. Veri ikinci yazmaçtan hafızaya kaydedilir ya da ikinci yazmaca yüklenir. Örnek bir komut Tablo 8'de verilmiştir. op rs rt adres/hızlı değer 100011 00010 00001 0000000001100100 Tablo 8 - lw $1, 100($2) işlemi için komut seti Her iki komutta RS yazmacından adresi okumayı ve ofset eklemeyi gerektiriyor. Bu ekleme işlemi için ALU ofsetin işaretli 32 bit genişletilmesiyle kullanılabilir. Kaydetme işlemi için RT yazmacındaki veriyi okuyup belirtilen adrese yazmak isterken, yükleme işlemi için belirtilen adresten verinin okunup RT yazmacına yazılmasını istiyoruz. Bu işlem için gereken veriyolu Şekil25'te gösterilmiştir. Yazmaçlar ve veri hafızası için gereken okuma ve yazma sinyallerinin üretilmesi kontrol biriminin görevidir. 20

Şekil 25 Yükleme / Kaydetme veriyolu Tablo 9'da verildiği gibi ikinci bir tür I-format komutu için dallanma komutunu dikkate almamız gerekiyor. Burada iki yazmacın içindeki verinin karşılaştırılması ve aynı büyüklükte olmaları durumunda sayının ofsette belirtilen komuta dallanması istenmektedir. op rs rt adres/hızlı değer 100011 00010 00001 0000000001100100 Tablo 9 - beq $1, 100 işlemi için komut seti Bunun için gerekli olan veriyolu Şekil 26'da verilmiştir. Veri iki yazmaçtan da okunuyor ve ALU bir çıkarma işlemi gerçekleştiriyor. ALU'nun 0 çıkışı dallanma kontrol birimi tarafından dallanmanın olup olmayacağını kontrol etmek için kullanılabilir. Dallanma için olan hedef adresi adres/hızlı alanının işaret genişletilmesi hesaplanır, sonrasında sola doğru 2 kere kaydırılarak ofsetin byte değeri elde edilir. Bu daha sonra PC+4 değerine eklenir. Şekil 26 Dallanma veriyolu 21