Size dijital devrelerin dijital işleme sorunlarını çözmek için nasıl tasarlandıklarını, ortaya çıkardığınız sorunları kullanarak nasıl bir fikir vermeye çalışacağım: CPU'lar toplama ve çarpma işlemlerini nasıl uygularlar.
Birincisi, doğrudan soruyu önümüze çıkaralım: bir programlama dili çarpma ve toplama işlemlerini etkin bir şekilde nasıl değerlendirir? Cevap basit, onları çarparak derliyor ve talimat ekliyorlar. Örneğin, aşağıdaki kod:
a = 1 + 1;
b = a * 20;
sadece şöyle bir şey için derlenmiştir:
ADD 1 1 a
MUL a 20 b
(Not: Yukarıdaki derlemenin, basitlik uğruna varolmayan hayali bir CPU içindir).
Bu noktada yukarıdaki cevabın basitçe sorunu değiştirdiğini ve onu donanım sihiriyle çözdüğünü fark edersiniz. Takip eden soru açıkça bu donanım büyüsü nasıl çalışır?
İlk önce daha basit soruna bakalım: toplama.
İlk önce tanıdık bir problem çıkarıyor, 10 bazda düzenli olarak ekliyoruz:
17
+28
İlk adım 7 ve 8 eklemek olacaktır. Fakat bu 15 ile sonuçlanır ve bu rakam tek bir rakamdan daha fazladır. Yani biz 1 taşıyan:
(1)
17
+28
= 5
Şimdi birlikte 1, 1 ve 2 ekliyoruz:
17
+28
=45
Bundan dolayı aşağıdaki kuralları alırız:
ekleme sonucu birden fazla basamak olduğunda, en az anlamlı basamağı tutarız ve en önemli basamağı ileriye taşırız
sütunumuza ilerletilen bir rakam varsa, onu eklediğimiz sayılarla birlikte ekleriz
Şimdi, yukarıdaki 2 - boolean cebirindeki yukarıdaki kuralları yorumlamanın zamanı geldi.
Böylece boolean cebirinde 0 ve 1'i bir arada = 1 eklemek. 0 ve 0 = 0 eklemek. Ve birden fazla rakam olan 1 ve 1 = 10 ekleyerek 1'i ileriye taşıyoruz.
Bundan bir doğruluk tablosu oluşturabiliriz:
a b | sum carry
-------------------
0 0 | 0 0
0 1 | 1 0
1 0 | 1 0
1 1 | 0 1
Bundan iki devir / boole denklemi kurabiliriz - biri toplamın çıktısı, diğeri taşınan çıktısı için. En saf yol, tüm girdileri basitçe listelemektir. Herhangi bir gerçek tablo, ne kadar büyük ve karmaşık olursa olsun bu formda yeniden düzenlenebilir:
(AND inputs in first row) OR (AND of inputs in second row) OR ...
Bu temelde ürün formunun toplamıdır. Yalnızca 1 ile sonuçlanan ve 0'ları yok sayan çıktılara bakarız:
sum = (NOT a AND b) OR (a AND NOT b)
Bunu VEYA yazmayı kolaylaştıracak şekilde programlama dili sembolleriyle değiştirelim:
sum = (!a & b) | (a & !b)
Temel olarak, masayı şöyle dönüştürdük:
a b | sum equation
-------------------
0 0 | 0
0 1 | 1 (!a & b)
1 0 | 1 (a & !b)
1 1 | 0
Bu doğrudan bir devre olarak uygulanabilir:
_____
a ------------| |
\ | AND |-. ____
\ ,-NOT--|_____| \ | |
\/ `--| OR |----- sum
/\ _____ ,--|____|
/ `-NOT--| | /
/ | AND |-`
b ------------|_____|
Gözlemci okuyucular bu noktada yukarıdaki mantığın aslında tek bir geçit olarak uygulanabileceğini fark edeceklerdir - uygun bir şekilde gerçek tablomuzun gerektirdiği davranışa sahip bir XOR geçidi:
_____
a ------------| |
| XOR |---- sum
b ------------|_____|
Ancak, donanımınız size bir XOR kapısı sağlamazsa, yukarıdaki adımlar, onu AND, OR ve NOT geçitleri açısından nasıl tanımlayıp uyguladığınızla ilgilidir.
Lojik kapıları gerçek donanıma nasıl dönüştüreceğiniz, sahip olduğunuz donanıma bağlıdır. Mekanizma bir çeşit anahtarlama davranışı sağladığı sürece çeşitli fiziksel mekanizmalar kullanılarak uygulanabilirler. Mantık kapıları, su jetleri veya hava kabarcığından (akışkanlar) transistorlara (elektronik) düşen mermere kadar her şeyle gerçekleştirildi. Bu başlı başına büyük bir konudur, bu yüzden sadece onu anlatacağım ve mantık kapılarını fiziksel cihazlar olarak kullanmanın mümkün olduğunu söyleyeceğim.
Şimdi aynı şeyi taşıma sinyali için yapıyoruz. Taşıma sinyalinin doğru olduğu tek bir koşul olduğundan, denklem basitçe:
carry = a & b
Yani taşıma basittir:
_____
a ------------| |
| AND |---- carry
b ------------|_____|
Onları bir araya getirerek yarı toplayıcı olarak bilinen şeyi elde ederiz:
_____
a ------;-----| |
| | XOR |---- sum
b --;---|-----|_____|
| | _____
| '-----| |
| | AND |---- carry
'---------|_____|
Bu arada yukarıdaki devrenin denklemleri şöyle görünür:
sum = a ^ b
carry = a & b
Yarım toplayıcı bir şey eksik. İlk kuralı uyguladık - sonuç ileri sürmek yerine birden fazla basamaktaysa, ancak ikinci kuralı uygulayamadık - bir taşıma varsa, sayıları ile birlikte ekleyin.
Bu yüzden, tam bir toplayıcı, birden fazla basamaktan sayı ekleyebilen bir ekleme devresi uygulamak için bir doğruluk tablosu tanımlamamız gerekir:
a b c | sum carry
---------------------
0 0 0 | 0 0
0 0 1 | 1 0
0 1 0 | 1 0
0 1 1 | 0 1
1 0 0 | 1 0
1 0 1 | 0 1
1 1 0 | 0 1
1 1 1 | 1 1
Toplam için denklem şimdi:
sum = (!a & !b & c) | (!a & b & !c) | (a & !b & !c) | (a & b & c)
Denklemi hesaba katmak ve basitleştirmek ve bunu bir devre olarak yorumlamak için aynı işlemi uygulayabiliriz, ancak yukarıda yaptığımız gibi bu cevabın aşırı uzun sürdüğünü düşünüyorum.
Artık dijital mantığın nasıl tasarlandığı hakkında bir fikir edinmelisiniz. Karnaugh haritaları (doğruluk tablolarını basitleştirmek için kullanılır) ve espresso gibi mantık derleyicileri (böylelikle el ile boole denklemlerini hesaba katmak zorunda kalmazsınız) gibi bahsetmediğim başka püf noktaları da var, fakat temel olan benim yukarıda özetlenen:
Tek bit (rakam) düzeyinde çalışana kadar sorunu çözün.
Bir doğruluk tablosu kullanarak istediğiniz çıktıları tanımlayın.
Masayı bir boole denklemine dönüştürün ve denklemi basitleştirin.
Denklemi mantık kapıları olarak yorumlar.
Mantık geçitlerini uygulayarak mantık devrenizi gerçek donanım devrelerine dönüştürün.
Temel (veya daha doğrusu, düşük seviyeli) problemlerin gerçekte çözülmesi - işte bu kadar çok doğruluk tablosu. Asıl yaratıcı çalışma, MP3 kod çözme gibi karmaşık bir görevin bit seviyesine parçalanmasıdır, böylece üzerinde gerçeği tablolarıyla çalışabilirsiniz.
Üzgünüm, çarpmanın nasıl uygulanacağını açıklayacak vaktim yok. Çarpma işleminin ne kadar süreceği, ikilik olarak yorumlanması ve gerçeği tablolarına ayırmaya çalışarak kuralları çözerek bir çatlak çekmeyi deneyebilirsiniz. Ya da Wikipedia’yı okuyabilirsiniz: http://en.wikipedia.org/wiki/Binary_multiplier