Dijital Devre Tasarlayalım

Doğaçlama bir yazı, bu yazıyı lojik dersinden hemen sonra kendim için yazmıştım, belki size de bir faydası olur:

Giriş

Bugün elektronik dünyasına baktığımızda hemen hemen bütün cihazların dijital olduğunu görüyoruz; bilgisayarlar, cep telefonları, mp3 çalarlar, fotoğraf makineleri, kameralar…


Analog devrelere kıyasen dijital devrelerin bu yaygınlığının altında dijital devrelerin avantajları yatmaktadır. Bu avantajlardan önde gelenleri: Dijital devrelerde gürültü(noise) sorununun hemen hemen olmaması buna paralel olarak uygulanan bir işaretin orjinal halinin geri elde edilebilmesi(gürültünün etkisinin giderilebilmesi) ve devrenin istenildiği kadar genişletilebilmesi(katlar arasında gürültü ve işaretin kaybolması gibi bir problem olmaması sayesinde). Yine buna paralel olarak dijital devrelerin daha güvenilir olması. Tabi bu saydığımız avantajlar bir yere kadar doğru; dijital devreler de gürültüden etkileniyor, işaretimiz gürültü etkisiyle kaybolabilir de. Ancak bu etkilenme analog devrelerin gürültüden etkilenmesiye kıyaslanamayacak kadar etkisiz ve belirli bir ölçüyü aşmadığı sürece giderilebilmesi mümkün bir etkilenmedir.

Gürültü konusunun yanı sıra dijital devrelerin diğer avantajları; verilerin saklanabilmesi dijital hafıza elemanlarıyla mümkündür, analog devrelere kıyasen baskı devre olarak üretilmesi daha kolaydır. Tüm bu avantajların genel bir sonucu olarak dijital devrelerle analog devrelere kıyasla çok daha gelişmiş(akıllıca) uygulamalar geliştirilebilir.

Bugün dijital devre teknolojisi almış başını gitmiş; süper hızlı, küçük ve bir o kadar da karmaşık ve akıllı devreler mikro hatta nano boyutlarda üretilebilir olmuştur. Bahsettiğimiz teknoloji transistor teknolojisidir. Buna ilaveten CMOS teknolojisiyle çok az güç tüketerek güç tüketim problemini büyük ölçüde aşan dijital devreler taşınabilir olmuş ve günlük hayatımıza iyice yerleşmişlerdir.

Tüm bunlara rağmen analog devreler hayatımızdan çıkmıyor, çıkamaz da! Çünkü hayatın içindeki büyüklükler analog; ses, ışık, sıcaklık, basınç gibi büyüklükler analog büyüklüklerdir. Dijital devreler her ne kadar işlemlerini dijital olarak gerçekleştirseler de dış dünyadan analog giriş(input) alırlar ve yine dış dünyaya analog çıkış verirler(bu her cihaz için geçerli değil ama genelde böyledir). Örnek: mp3 çalarımızda havadan gelen AM veya FM işaretleri antende bir gerilim indükler, bu gerilim analog bir gerilimdir ve mp3 çalarımız bu işareti alıp değerlendirebilmek için işareti bir takım analog işlemlere tabi tutmak zorundadır. Demodülasyon işlemi dijital devrelerle gerçeklenir ve dijital işaret analoga çevirilip hoparlöre analog işaret olarak gönderilir ki duyup anlayabilelim.

Bu girişten sonra gelelim asıl konumuz dijital devre tasarımına; dijital devre tasarımına girmeden önce bir sınıflandırma yapmalıyız. Bu sınıflandırmayı sizin yapmanıza olanak sağlayacak birkaç örnek seçelim.

Bir dijital devre düşünün; A, B ve C anahtarları olmak üzere üç girişi olsun. Bu girişler herhangi bir sistemi kontrol ediyor olsun. Bizden istenen bu girişlerden iki veya daha fazlasının lojik 1 olduğu durumda sistemin kapatılması olsun. Diğer durumlarda(sadece bir anahtar lojik 1 konumunda veya hepsi lojik 0 olduğu sürece) sistem çalışmaya devam etsin.

Bir de diğer bir dijital devre düşünün ki turnikeden geçen kişi sayısını sayıyor ve her geçişte yeşil bir ışık yakıyor olsun. Bu iki devre tipi arasında nasıl bir fark vardır? İlk bahsettiğimiz devrenin çıkışı(sonucu) tamamen şu andaki girişlere bağlıdır. Devremiz bakar hangi anahtarlar lojik 1 veya lojik 0… ona göre bir cevap verir, her şey o anda olup biter. Bu tip devreler Kombinasyonel lojik(sayısal) devre olarak adlandırılır.

İkinci tip devremizde ise iş bu kadar basit değildir, devremiz şu anda gelen girişe ve şu andaki durumuna göre bir cevap verir. Düşününüz; sayının bir artması olayı dedik, sayının bir artması için önceki sayının biliniyor olması gerekir ki bu da bir hafıza gerektirir. Veya bir yürüyen ışık uygulaması, ledlerin sırayla yanabilmesi için bir önceki adımdaki durumun biliniyor olması gerekir. Bu tip devrelere de hafızalı veya sequential lojik devre denir. Dikkat ederseniz verdiğim 2 hafızalı devre örneğinde de bir önceki durum dedim! Sayacın bir artması için sadece bir önceki değeri tutuyor olması yeterlidir, yürüyen ışık örneğinde de durum aynı. Burda durum kavramı işin içine giriyor, verdiğimiz ilk hafızalı devre örneğinde durum şu andaki sayı değeridir (turnikeden bu zamana kadar kaç kişi geçmiş), bir giriş(input) geldiğinde-yani birisi turnikeden geçtiğinde- dijital devremiz inputu alır, durumuna bakar bir arttırır ve yeşil ışığı yakar. Bu durumda devremiz değerlendirme yaparken hem inputu hem de durumunu göz önünde bulundurmuş olur, aynı şekilde devremizin o değerlendirmeden sonraki çıkışı(sonucu) yeni durumu belirlerken(bir sonraki girişler için) bir de yeşil ışıkla çıkış vermiş olur. Anlaşıldığı üzere ikinci tip devremizde bir hafıza söz konusu, bu devrelerimizde hafıza görevini flip-floplar görür(flip-flopları tanıyacağız). Hafızalı devremiz flip-floplardan mı ibaret? Devresine göre değişir, örneğin sadece flip-flop ları kullanarak bir sayaç yapabiliriz ama çoğu zaman hafızalı bir lojik devrede(sekansiyel dijital devre) bir de kombinasyonel kısım bulunur. Yani hafızalı lojik devreler kombinasyonel lojik devre içerebilir ve çoğunlukla içerir.

Dijital devrelerin temel elemanları: lojik kapılar, flip-floplar, “decoder”ler(kod çözücüler), “multiplexer(mux)”(çoklayıcı) ve “demuliplexer(demux)”ler dir. Kombinasyonel devreden hafızalı devreye geçişte karşımıza çıkan ilk farklı eleman flip-flop oluyor, diğer elemanlar iki tip devrede de vardır. Bahsettiğimiz bu elemanların yapısına baktığımızda da transistörleri görüyoruz.

Tasarım kısmına geçmeden son bir hatırlatma olarak: Bugün dijital devre sentezi(tasarımı) bilgisayar destekli yapılmaktadır, en basit devrelerden en karmaşığına kadar “en az eleman kullanılarak bu devreyi nasıl gerçeklerim” sorusunun cevabı bilgisayar algoritmaları tarafından bulunmaktadır. Nitekim bu soru temel mühendislik problemidir. Bugün geçmişte karmaşık lojik devrelerle gerçeklenebilen sistemler mikrodenetleyicilerle kolayca gerçeklenebilmekte veya çok gelişmiş sentez kabiliyeti ve çok fazla sayıda eleman gerektiren sistemler FPGA ler üzerinden gerçeklenebilmektedir(parallel processing sayesinde uzun süren işlemler paralel işlemlere ayrılarak FPGA üzerinden daha kısa sürede gerçekleştirilebilmektedir). Bu durumda bizim burda anlatmaya çalışacağımız dijital devre tasarımı ne oluyor? Bu bahsettiğimiz sistemler her ne kadar hünerli olsalar da temellerinde çok basit lojik elemanlar vardır ve devrelerin yapıları çok basit mantıklara dayanır. Bu sistemleri ve etrafımızdaki diğer tüm dijital cihazları anlamanın yolu bu sistemlerin temelini irdelemekten geçer. Bir defa öğrendikten sonra zaman kaybetmemek ve hata riskini azaltmak için tabii ki bilgisayar algoritmalarına başvurmak yerinde bir hareket olup gelişmiş sistemler tasarlamak için mikrodenetleyici ve FPGA gibi sistemleri kullanmak zamanımızın bir gereğidir.

Dijital devre tasarlanmadan önce devremizin sözlü bir ifadesini yapmalıyız, biz ne istiyoruz? Eğer tarifiniz yukarıda verdiğimiz ilk örneğe benziyor ise siz bir kombinasyonel lojik devre tasarlamak istiyorsunuz demektir. Eğer tarifiniz ikinci örneğe benziyor ise siz bir hafızalı lojik devre tasarlamak istiyorsunuz demektir. Bu iki devrenin tasarım adımlarında ortak yanlar da var farklılılar da var, göreceğiz. Kullanacağımız temel elemanları tanıyalım:

Çoğumuz lojik kapıları biliyorduruz ve doğruluk tabloları zihnimizde vardır. Doğruluk tablosu(truth table)! Bizim için yeni bir ifade, doğruluk tablosu dijital bir devre elemanını veya dijital bir devrenin davranışını hangi girişlerde(ve durumlarda) hangi çıkış(ve yeni durumların) olacağının gösterildiği tablodur. Bu elemanları tek tek burda inceleyip yer ve zaman kaybetmeyeceğiz, arama motoruna “lojik kapılar” yazdığınızda bir çok sitede bu elemanların doğruluk tablolarını bulabilirsiniz,

Örn: http://www.silisyum.net/htm/dijital/lojik_kapilar.htm

Bu kapıların görevlerini zihinlerimize birer cümleyle yerleştirmek faydalı olabilir. Örnek olması açısından “ve-and”, “veya-or” ve “değil-not” kapılarını kısaca görelim(tablo ve resim silisyum.net den alınmıştır).

“Ve” Kapısı (entegre kodu: 74-08)

Görüldüğü üzere “ve” kapısı sadece tüm girişleri lojik 1 olduğu zaman çıkışta lojik bir veriyor. Tüm girişleri diyorum çünkü ve kapısı iki girişli olmak zorunda değildir. Piyasada iki ve üç girişli “ve” kapılarının satıldığını biliyorum, dört veya daha üzeri girişe sahip “ve” kapılarını bu kapıları kullanarak elde edebiliriz.

“Veya” Kapısı (entegre kodu: 74-32)

Görüldüğü üzere “veya” kapısı sadece tüm girişleri lojik 0 olduğu zaman 0 çıkışı veriyor. Giriş sayısı konusu yukarıda “ve” kapısı için söylediklerimizle aynı.

“Değil” Kapısı (entegre kodu: 74-04 )

Tasarıma Başlayalım

1) Kombinasyonel lojik devre tasarımı

Kombinasyonel lojik devre tasarımında yukarıda da söylediğimiz gibi her şeyden önce istediğimiz devreyi sözlü olarak ifade ederiz, sonra bunları doğruluk tablosuna geçiririz. İlk verdiğimiz örnek üzerinden gidelim, sözlü ifadesini olduğu gibi alıyorum:

Bir dijital devre düşünün; A, B ve C anahtarları olmak üzere üç girişi olsun. Bu girişler herhangi bir sistemi kontrol ediyor olsun. Bizden istenen bu girişlerden iki veya daha fazlasının lojik 1 olduğu durumda sistemin kapatılması olsun. Diğer durumlarda(sadece bir anahtar lojik 1 konumunda olduğu sürece) sistem çalışmaya devam etsin.

Evet, sözlü ifademiz bu şekildeydi. Bir sistemden bahsettik, çalışmaya devam etsin veya kapatılsın gibi ifadeler kullandık. Çalışması veya kapatılması şimdilik bizi ilgilendirmiyor, biz şu anda sadece işin lojik kısmıyla ilgileniyoruz. Sistemi kapatalım dememizden kastımız çıkışın lojik 1 olması, sistemin çalışmaya devam etmesinden kastımız ise çıkışın lojik 0 olmasıdır.
Kombinasyonel devre tasarımının 2. aşaması olarak bu sözlü ifadenin doğruluk tablosunu oluşturalım. Kaç girişimiz var? Üç. Dolayısıyla toplam 2^3=8 tane giriş olasılığımız bulunur. Kaç çıkışımız var? Bir. Buna göre doğruluk tablomuz 4 sütunlu 8 satırlı bir tablo olacaktır:

Görüldüğü gibi 2 veya daha fazla anahtar lojik 1 durumunda olduğunda çıkışı 1 oluyor, 0 da seçebilirdik tamamen bize kalmış. Senaryomuz çok iyi seçilmemiş olabilir ama önemli olan doğruluk tablosu bu olan bir devreyi nasıl gerçekleriz? sorusudur.

İşte burda kapıların görevlerinin sözlü ifadelerini düşünmek olayın mantığını anlamamızı kolaylaştırıyor. “Ve” kapısı için girişlerinin hepsi lojik 1 olduğunda çıkış lojik 1 diğer durumlarda çıkış lojik 0 demiştik. Anahtarladan iki veya daha çoğu lojik 1 ise sistemi kapatalım demiştik. Eğer 3 anahtar da lojik 1 ise kapatalım diğer durumlarda sistem çalışsın deseydik(bu durumda F sadece A, B ve C nin lojik 1 olduğu yerde lojik 1 olacaktı) çözüm olarak aklınıza ne gelirdi? Bu girişleri bir “ve” kapısına vermek. Çünkü problemimiz “ve” kapısının tanımıyla bire bir aynı oldu, hatırlarsanız “ve” kapısı 1 1 1 durumunda lojik 1 çıkışı verecek ve diğer tüm durumlarda lojik 0 çıkışı vererek doğruluk tablomuzu aynen gerçekleyecektir. Bizim problemimizde iki veya daha çok anahtar lojik 1 ise sistemi kapatmamız isteniyor dolayısıyla 0 1 1, 1 1 0, 1 0 1 durumlarında da sistemimizin lojik 1 çıkışı vermesi isteniyor. Peki 1 0 1 durumunda lojik 1 çıkışı veren diğer tüm durumlarda 0 çıkışı veren devre için ne dersiniz? A B’(B nin değili) ve C yi bir “ve” kapısına verirsek devremiz sadece 1 0 1 durumunda lojik 1 çıkışı verecek diğer durumlara lojik 0 çıkışı verecektir. Sadece 0 1 1 durumu için lojik 1 veren ve sadece 1 0 1 durumu için lojik bir veren devreler? Bunları ayrı ayrı gerçekleyip hepsini bir “veya” kapısına verdiğimizde devremiz sadece 0 1 1, 1 0 1, 1 1 0 ve 1 1 1 durumlarına lojik 1 çıkışı veren bir devre olacaktır.

Doğruluk tablosunu F=1 lere veya F=0 lara göre gerçekleyebiliriz. Hangisinin sayısı daha azsa ona göre gerçekelemek devremizdeki eleman sayısını buna paralel olarak devremizin karmaşıklığını ve maliyetini düşürecektir. Bizim örneğimizde F=1 lerin sayısı F=0 ların sayısına eşit dolayısıyla elimizdeki eleman durumuna göre istediğimizi seçebiliriz. F=1 lere göre gerçeklediğimizde bize daha çok “ve” kapısı gerekirken F=0 lara göre gerçeklediğimizde daha çok “veya” kapısı gerekir.

F=1 lere göre gerçeklemek istersek(F=0 lara göre gerçeklemek anlatmaya çalışacağımız mantığa çok yakın bir mantıkla çalışır, düşününüz) önce F fonksiyonumuzu yazarız(tüm lojik işlemler ve indirgemeler Bool Cebri adında cebrik bir sisteme dayanır):

F=1 olan satırlarda; A B C nin 1 olan değerleri için bu literallerin kendilerini, 0 olan değeleri için bu literallerin değillerini çarpıp oluşan üçlü literalleri kendi aralarında toplarız(çarpma boole cebrinde “ve” işlemine, toplama “veya” işlemine tekabül eder) şöyle ki:

4. satır için F= A’BC

6. satır için F=AB’C

7. satır için F=ABC’

8. satır için F=ABC

ve tüm tablomuz için bool fonksiyonumuz

F= A’BC + AB’C + ABC’ + ABC olur. Devresini gerçeklemek istersek(kullanılan programın-digital works– bağlantısı yazının sonunda verilecektir):

Olduğunu görürüz, evet arkaşlar bu devreyle 2 veya daha fazla anahtar lojik bir olduğu durumda F=1 çıkışı veren devremizi gerçeklemiş olduk. Bu tasarım böyle çalışır ancak bu devreyi daha az kapı kullanarak da gerçekleyebilirdik. Doğruluk tablomuzdan elde ettiğimiz F fonksiyonu sadeleştirilebilir olabilir. Örnek:

ABC’ + ABC ifadesi her zaman AB ifadesine eşittir. Düşünün ABC ile ABC’ yi “veya” işlemine tabi tutuyoruz. Eğer C 0 ise ABC’ sonucu AB yi verecek, ABC nin sonucu ise 0 verecek, nihai işlem olarak “AB veya 0” işlemi AB yi vercektir. Eğer C 0 değil de 1 ise bu durumda ABC’ nin sonucu 0, ABC sonucu ise AB yi verecek ve nihai işlem olarak “0 veya AB” işlemi yine AB yi verecektir. Dolayısyla ABC’+ABC ifadesi yerine AB yazabiliriz. Bu durumda indirgenmiş F ifadesi:

F= A’BC + AB’C + AB olur, sadeleştirmemiz bununla da bitmiyor.

F= A’BC + AB’C + ABC’ + ABC aynı zamanda

F= A’BC + AB’C + ABC’ + ABC + ABC +ABC olarak da yazılabilir. Terimlerden birinin veya birkaçının tekrar tekrar işleme tabi tutulması sonucu değiştirmez çünkü

ABC + ABC +ABC=ABC dir.

Bu durumda fonksiyonumuzu:

F= A’BC + ABC + AB’C + ABC + ABC’ + ABC şeklinde yazarsak sadeleşmiş fonksiyonumuzun:

F=BC + AC + AB olduğunu görürüz. Sadeleşmiş haliyle devremiz:

Bu şekilde devremiz çok daha basitleşmiş olur. Bazı devrelerde doğruluk tablosundan sonra pek çok sadeleştirme(veya indirgeme) yapılarak devre çok çok daha basit şekilde gerçeklenebilir. (Yaptığımız sadeleştirme işlemi yine Boole Cebrinde tanımlı bir işlemdir.)

İndirgeme(sadeleştirme) işlemi büyük devrelerde ve seri üretim olacak devrelerde çok önemlidir, düşünün ki 10.000 adet üretilecek bir devreden her birinden 2 kapı eksiltseniz ne kadar kâr edersiniz? Bu yüzden doğruluk tablosundan sonra devremizi olabildiğince indirgemeye çalışırız. Farkındaysanız sadeleştirmeye tabi tuttuğumuz iki terimde tüm literaller aynı, sadece biri diğerinin değili şeklindedir, ABC ve ABC’ gibi. İki terimin sadeleşebilmesi için tüm literalleri aynı sadece bir literali farklı olmalıdır. ABCDE ve A’BCDE, X’Y’Z’ ve XY’Z’, a’bc’d ve a’bc’d’ gibi. Sadeleştirme sonucu oluşan terim diğer bir sadeleştirme sonucu olaşan terimle de sadeleşip çok daha basit hale gelebilir.

Örn: ABCD’ + ABCD + AB’CD’ + AB’CD = ABC + AB’C = AC

Görüldüğü gibi bir bool fonksiyonunu sadeleştirirken tüm literalleri(bool ifadesindeki herhangi bir harfi, sembol X1, X1′ gibi) aynı, sadece bir literali diğerinin değili olan ikililer arıyoruz. Sadeleşen terimler arasında yine bir sadeleştirme yapabilirmiyiz diye onlar arasında da bu şarta bakıyoruz… Bu arayış 4, 5 veya daha çok girişli devrelerde insan için içinden çıkılmaz hale gelebilir.

Karnaugh(“karno” okuyunuz) adında bir bilim adamı zamanında bakmış bu terimleri öyle bir dizeyim ki sadece bir literali değişen terimleri hemen göreyim demiş ve bool fonksiyonun her terimini kendi adını verdiği Karnaugh map adlı bir tabloya dizmiş. Tablonun özelliği her iki(veya 4, 8…) komşu hücrenin sadece bir literalinin değişiyor olması. Böylece komşu 2 hücrede terim varsa bunları direkt alıp yukarıdaki gibi sadeleştiriyoruz. Eğer 4 komşu hücrede terim varsa bunları da 4 lü sadeleştirme ile sadeleştirebiliyoruz. 8 liyse 8li… Bizim burdaki örneğimizde 3 giriş var, 3 girişi olan bir devrenin oluşabilecek terimlerinden sadeleştirme olanları rahatça görmek için karnaugh map e dizeriz, örneğimizdeki fonksiyonu “k-map” e geçirmeden önce “k-map” i tanımak adına bu hücrelerin temsil ettiği terimleri hücrelere yazalım:

3 lü “Karnaugh map”:

 


Bizim örneğimizde F=1 olan terimler A’BC , AB’C, ABC’, ABC idi. Dolayısıyla bizim “k-map” imiz:

Komuşu hücreleri renki elipsler içine aldım. Bu k-map de sadece 2 li komuşular var, 4 lü komşular da olabilidir. Bu örnekte komşuluklar açık şekilde görünüyor, sağ üst hücrede ve sol üst hücrede birer terim olsaydı bu terimleri de sadeleştirebilirdik çünkü bunlar da komşu. Kağıt üzerinde çizilmiş dünya haritasına baktığımızda en sağdaki ülke ile en soldaki ülkenin komşuluğu gibi. Yine aynı şekilde en üstteki ve en alttaki hücreler de komuşudur ama bu örnekte içlerinde terim yok. K-map özel bir yöntem değildir, sadece basitleşecek terim gruplarını rahatça görmemiz için fonksiyonumuzun farklı bir ifadesidir, dikkat edecek olursanız kırmızı elipsin içindeki terimler A’BC ve ABC terimlerini temsil eder, bu terimlerin sadeleşebilir olduğuna dikkat ediniz. Mavi elipstekiler ABC ve ABC’ terimlerini ve yeşil elipstekiler AB’C ve ABC terimlerini temsil eder. Tüm bu ikililerin sadeleşebilir olduğuna dikkat ediniz. E! Biz yukarda bu sadeleştirmeleri yapmıştık diyeceksiniz ancak daha çok giriş sayısı olan devrelerde yukarıda gördüğümüz gibi tüm sadeleştirmeleri görmemiz çok zordur. K-map bu konuda bize yardımcı oluyor.

K-mapimize bakarak yeni, sadeleşmiş F fonksiyonumuzu terimleri direkt sadeleştirerek yazarız(bu, k-map üzerinde alıştırma yapılarak kazanılan bir pratikliktir):

F= BC + AB + AC

Dikkat ederseniz aynı F fonksiyonunu bulduk. Devre şemasını tekrar vermiyorum, devremiz çok büyük olmadığı için k-map e başvurmadan en sade halini yazabilmiş ve devremizi gerçeklemiştik.

Böylece k-map ile bir fonksiyon nasıl indirgenir konusunda fikir sahibi olmuş olduk, ders kitaplarından veya internetten daha ayrıntılı bilgi alabilirsiniz. Burda F=xy’z+x’y’z’+w’xy+wx’y+wxy fonksitonunun indirgenmesiyle ilgili bir k-map örneği var, bakabilirsiniz.

Aynı devreyi “multiplexer” ile hiç bir sentez işlemi yapmadan, k-map ile hiç uğraşmadan kolayca gerçekleyebilirdik. Multiplexer kendi başına kullanılabileceği gibi devre içinde bir eleman gibi de kullanılabilir. Multiplexer in yapısında da yine lojik kapılar vardır. Bize bu doğruluk tablosu için “3 to 8” mux gerekir. “3 to 8” mux üzerinde 3 tane “select” pini 8 tane giriş ve 1 tane çıkış bulunur.

A B C kontrol uçlarından girilen sayının onluk sistemdeki karşılığına göre girişlerden bir tanesi çıkışta kendisini gösterir. Örn: A(en düşük ağırlıklı bit)=0 B=1 C=1 ise 110 sayısı onluk sistemde 6 dır, bu durumda 6 nolu girişe ne uygulandıysa çıkışta o görülür. Bu entegreyi kendi devremizde kullanmak istersek: Bu arada giriş isimlerine biz de A, B, C vermişiz entegrenin A B C uçlarıyla bir eşleştirme yapmadık! A B C bu entegrelerin kataloglarında kontrol girişlerine verilen isimlerdir.

Bizim doğruluk tablosunda girişler 0 1 1, 1 0 1, 1 1 0 ve 1 1 1 olduğu zaman çıkış 1 oluyor. O zaman mux(multiplexer) umuzun 011=3, 101=5, 1 1 0=6 ve 1 1 1=7 nolu pinlerine 1 verip(+VCC ye bağlayarak) diğerlerine 0(toprak) veririz. Girişlerimizi de A B ve C girişlerine uyguladığımızda devremiz otomatik olarak gerçeklenmiş olur. Burda dikkat edilmesi gereken şudur: multiplexerin A girişi en az ağırlıklı bittir yani A=1 B=0 C=0 girişi onluk sistemde 1 e karşılık gelir ve 1. pini seçer, 4 ü değil. Bu durumda devremiz:

olacaktır. A=0, B=1 ve C=1 geldiğinde seçilecek olan giriş 3 olur ve dolayısıyla çıkış lojik 1 olur ; A=1, B=0 ve C=1 geldiğinde seçilecek olan giriş 5 olur ve dolayısıyla çıkış lojik 1 olur… Böylece basit kombinasyonel devreyi multiplexer kullanarak nasıl gerçekleyebileceğimizi gördük.

Tasarımını yapmış olduğumuz bu dijital devre örneğinde 3 giriş, bir çıkış var. Ya birden fazla çıkış sayısı olsaydı? Mesela bizden istenilen iki veya daha fazla anahtar lojik bir iken sistemin kapatılmasının yanında sadece bir anahtar lojik 1 ise başka bir sistemin açılması gibi bir şey istenseydi… Bu durumda iki çıkışımız olacaktı ve bu ikinci fonksiyonu sanki sadece o fonksiyon varmış gibi yukarıda yaptığımız işlermleri aynen uygulayıp gerçekleyecektik. Çok çok basit bir örnek vereyim: X ve Y girişleri olan bir devrede bir fonksiyon “X ve Y” olabilir bir diğer fonksiyon “X veya Y” olabilir. Bu durumda bir “ve” kapısını ilk fonksiyon bir “veya” kapısını da diğer fonksiyon için kullanıp istenilen devreyi kurabilirdik.

Çıkış sayımız iki olabileceği gibi daha fazla da olabilir. Bu durumda söylediğimiz gibi her fonksiyonu ayrı ayrı gerçekleyeceğiz. Tabi bu arada farklı fonksiyonlar arasında ortak terimler olabilir; mesela f1 fonksiyonunda AB’C terimi varken f2 fonksiyonunda da bu terim olabilir. Bu durumda AB’C terimini sadece bir defa gerçekleyip diğer fonksiyonda da kullanırız. Veya f1 fonksiyonunun terimlerinde 2 defa sadeleşme sonucu oluşmuş bir terim diğer fonksiyonlarda(f2, f3..) da kullanılabiliyor olabilir, bu tarz durumları yakalamak için fonksiyonları eş zamanlı indirgeyip benzer terimler aramalıyız. Tüm bunlar devremizi basitleştirir ama anlaşılacağı üzere bir çok varyasyon var ve en idealinin bulunması oldukça karmaşık bir işlemdir. İşte bu noktada bu iş için geliştirilmiş yazılımlar yardımımıza geliyor, bu yazılımlar için bu varyasyonlar hiç sorun değil, hepsini deneyip en idealini bulabilirler ancak bu işlem devrenin giriş-çıkış sayısına, algoritma performansı ve bilgisayarın performansına göre uzun veya kısa sürebilir. Bu konuda geliştirilmiş yazılımlar ilk bahsettiğimiz tip yazılımlardan biraz daha iddialıdır, bunların tek işi k-map çözümleme veya az sayıda giriş çıkış olan devrelerin minumum gerçeklenmesi değildir. En ideal algoritma ile en kısa zamanda çözüm bu yazılımların temel meseledir.

Bu kadar sözden sonra; biz gerçek hayatta kombinasyonel bir devre tasarlamak istediğimizde ne yapıyoruz? Kağıt kalemi elimize alıp bu işlemleri mi yapıyoruz veya bilgisayar başına mı geçiyoruz? Eğer çok küçük bir devre ise kağıt kalem ele alınıp bu işlemler yapılabilir ancak genelde doğruluk tablosunu bilgisayar algoritmalarına verip devrenin en sade halini bilgisayar yardımıyla buluyoruz. Bu işi Multisim gibi ünlü benzetim(simülasyon) programlarına yaptırabileceğimiz gibi çok daha basit, sırf bu iş için yazılmış küçük yazılımlara da yaptırabiliriz. Örnek olarak Prof.Dr.Ahmet Dervişoğlu ve Yük.Müh Orhan Uçar tarafından geliştirilmiş olan MORP programı(bağlantısı yazı sonunda verilecektir), sırf bu ve benzeri(daha gelişmiş) işler için geliştirilmiş, işlem süresinin kısalığıyla dünyada adından söz ettiren oldukça başarılı bir programdır. MORP a doğruluk tablomuzu anlatmak için F=1 olan satırların satır no larını vermemiz yeterli, bizim örneğimizde F=1 olan satırlar 3, 5, 6 ve 7 idi. MORP a girişimizi yaptıktan sonra aldığımız sonucun bizi ilgilendiren kısmı:

MORP programında X1 bizim A mıza, X3 C mize tekabül ediyor. Yani MORPUN çıkışı:

F=BC + AC + AB demek ki bulduğumuz sonuçlar doğruymuş(yukarıdaki sonuçlarla kıyaslayınız).

Buraya kadar yaptıklarımız bir kombinasyonel lojik devrenin tasarlanmasyıla ilgiliydi. Şimdi gelin hafızalı bir lojik devre tasarlayalım.

2) Hafızalı lojik devre tasarımı

Hafızalı lojik devre denince akla ilk gelen elemanların flip-flop olduğunu söylemiştik. Flip-flop bir bitlik veri saklar(yani hafızalı devremizin hafızası bu elemanlardır), çeşitine göre bir veya iki girişi(input) olabilir, Q ve Q’ olmak üzere iki çıkış bulundurur.

Gelen saat(clock) darbesiyle sakladığı bir bitlik veri girişinde saat darbesini bekleyen veriye(1 veya 0) göre güncellenir; aynen kalabilir veya değişebilir. Saat darbesi dedik, hafızalı lojik devreler senkron(saat-clock- darbesiyle işleyen) ve asenkron(saatsiz işleyen) devreler olarak sınıflandırılır. Saat işareti, içerisinde bir çok flip-flop bulunduran bir devrede lojik işlemlerin doğru işaretler üzerine yapıldığını garantilemek için kullanılır! Bir kapıda işlem yapılıp sonucun verilmesi belirli bir zaman alır, iki flip-flop düşünün ve devremiz bu flip-flop ların tuttuğu değerleri karşılaştırıyor olsun. Eğer bir flip flopa gelen veri diğer flip flopa gidene göre daha önce gelmişse ki eş zamanlı gelmeleri çok düşük bir ihtimaldir bu durum devrede karışıklığa yol açacaktır. Bu yüzden flip-floplar eş zamanlı çalıştırılmak için bir saat(osilatör) tarafından kontrol edilirler. Saat işaretinin periyodu tüm flip-flop ların girişlerinin doğru bir şekilde yerleştiğini garantileyecek kadar uzun seçilir. Asenkron devreler hakkında bilgim yok, bahsettiğim problem için ne yapılıyor bilemiyorum sanırım o devrelerde de flip-flop girişlerinin doğru bir şekilde yerleşmesi için gereken zaman bir şekilde sağlanıyor.

Flip-Flop türleri için bakınız: http://www.akmtele.com/teknik/digiteln/digeln04.asp

D tipi Flip – Flop (entegre kodu: 74-74)

Sıkça kullanılan flip floplardan D(data) tipi flip flopun doğruluk tablosuna bakalım:

Bu tablonun yorumlayacak olursak: Çıkış, saat darbesinin gelmesiyle D girişine ne uygulanıyorsa o olur. D ye lojik 1 uygulanıyorsa çıkış lojik 1, 0 sa 0. Gördüğünüz gibi d tipi flip-flopun sıradaki çıkışı şu anki durumundan bağımsız. Verdiğim linkte bir de uyarım tablosu adında tablo verilmiş, uyarım tablosu da şu soruya cevap veriyor: flip flopumuzun Q(n) durumundan Q(n+1) durumuna geçmesi için D ye uygulanması gereken giriş nedir? Uyarım tablosu D tipi flip-flop için çok manidar değil çünkü sıradaki çıkışın şu anki durumla bir ilgisi yok, D ye ne uygulanırsa o.

J – K tipi Flip – Flop (entegre kodu: 74-76)


İlk satırdan başlayarak JK tipi flip-flopun doğruluk tablosunu yorumlamak istersek: İlk satırda ve ikinci satırda görüyoruz ki eğer J ve K girişlerine lojik 0 uygulanırsa eğer şu anki durum 0 ise 0 kalıyor, 1 ise 1 kalıyor. Üçüncü ve dördüncü satır: Eğer J ve K girişlerine lojik 0 ve lojik 1 uygulanırsa eğer şu anki durum 0 ise 0 kalıyor, 1 ise 0 a düşüyor. Diğer satıları yorumlayınız. Durum değişimlerinin saat işaretinin emriyle olduğunu hatırlatayım. Yani dördüncü satırı yorumlarken J ve K ya 0 ve 1 uygulanırsa dedik, uyguladık bekliyoruz ve flip-flopumuzun şu anki durumu 1 ne zaman 0 a düşecek? Saat darbesi geldiği zaman.

D tipi ff de çok manidar değil dediğimiz uyarım tablosu JK tipi ff için çok manidardır. Bakalım:


Bu tablonun yorumu şudur: Şu anki durumu 0 olan bir JK ff un durumunun 0 kalması için J ve K girişlerine sırasıyla 0 ve k uygulamalıyız. “k” demek keyfi demek, 0 veya 1 olabilir. Yani şu anki durumu 0 olan bir JK ff nin durumunu 0 olarak devam ettirmesi için J girişine muhakkak 0 uygulanmalı.
Şu anki durumu 0 olan bir JK ff nin gelecek durumunun 1 olması için J ye 1, K ya keyfi bir değer uygulanır.
Şu anki durumu 1 olan bir JK ff nin gelecek durumunun 1 olarak devam etmesi için J ye keyfi bir değer, K ya 0 uygulanır.
Şu anki durumu 1 olan bir JK ff nin gelecek durumunun 0 olması için J ye keyfi bir değer K ya 1 uygulanır.

T(toggle) tipi Flip – Flop

JK tipi ff nin J ve K uçlarını birbirine bağlayıp bu uca da T dersek T tipi bir ff miz olur. Yukarıda JK için verdiğimiz doğruluk tablosunda J ve K nın aynı olduğu satırlara bakınız, öyle ya J ve K yı birbirine bağladık, bu uçların değerleri aynı olmak zorunda, 0 veya 1. Eğer 0 ise gördüğünüz üzere ff nin durumu değişmiyor; eğer 1 ise ff nin durumu tam tersi oluyor, yani “toggle” oluyor.

Kombinasyonel devre tasarımında olduğu gibi burda da istediğimiz devrenin sözlü ifadesini yapmalıyız. Ardından durum diagramı çıkarıp seçeceğimiz ff tipine göre bu ff lerin giriş fonksiyonlarını ve varsa devremizin çıkış fonksiyonlarını indirgenmiş halde elde ettiğimizde devremiz gerçeklenemeye hazırdır demektir. Olayın daha iyi anlaşılması için kolay bir örnek seçelim. 4 tane ledimiz olsun sırayla yansınlar, yanan led sırası soldan başlayıp sağ uca kadar geldikten sonra tekrar sol uca doğru gitsin, yani kırmızı bir ışık bir sağa bir sola gitsin. Yani ledlerimizin sırasiyla almasi gereken durumlar:

olsun. Sözlü (ve şekilli J ) ifademizi yaptık. Şimdi sıra durum diagramını çıkarmaya geldi. Bu devrede kaç tane durumumuz var? Durum0= Hiçbiri yanmıyor 1.ye geçilmesi bekleniyor, Durum1:1. yanıyor 2.ye geçilmesi bekleniyor, Durum2: 2. yanıyor 3. ye geçilmesi bekleniyor, Durum3= 3. yanıyor 4.ye geçilmesi bekleniyor, Durum4= 4.yanıyor 3.ye geçilmesi bekleniyor. Durum5=3.yanıyor 2.ye geçilmesi bekleniyor, Durum6=2.yanıyor 1. ye geçilmesi bekleniyor. Toplam 7 durum, 7 farklı durumun devremizde temsil edilebilmesi için kaç flip flop gerekir? Her bir flip flop 1 veya 0 olmak üzere iki farklı değer tutabiliyor demiştik, 7 farklı durumun tutulması için bize en az 3 ff gerekir. 3 ff nin tutabileceği farklı durum sayısı 8(2^3) ancak biz 7 tanesini kullancağız.

Durum diyagramımızı çizersek:

Durum diyagramına geçişte her durum için durum kodlarını atıyoruz. Maviyle göstermeye çalıştıklarım her bir durum için durum kodudur, yani o durumda ff larımızın tuttuğu değerleri gösterir aslında. Durum0 da ff lerimiz 000 tutsun demişim, durum1 de 001… bu sırayı tamamen keyfi belirledim ancak devrenin en az elemanla gerçeklenmesi için durum kodlarının atanmasına özen gösterilmelidir, durum kodlarının en uygun şekilde atanması bu yazının konusu dışında olduğu için durum kodlarını keyfi atıyorum. Siz farklı atama yaparak devrenizdeki eleman sayısı değişikliklerini değerlendirebilirsiniz. Dikkat ederseniz ff sayısını verdik ancak henüz hangi tip ff kullanacağımızdan bahsetmedik. Hangi ff de devrenin daha uygun olacağını şimdiden kestirmek zor, bunun tek yolu deneyip görmek. Biz bu örnek için JK tipi kullanalım, siz bir T tipi ff bir de D tipi ff ile yapıp karmaşıklıkları kıyaslayabilirsiniz. Durum diagramından sonra ne istediğimizi bir de tablo şeklinde gösterirsek(Q(n) ff nin ilk durumunu Q(n+1) gelecek durumunu ifade eder, Z ler ledlere bağlanacak çıkışlar ):

Tabloda kesikli çizgilere aldığım bölümler hafızalı devremizin kombinasyonel kısmıdır, bu bölümleri belirleyip gerçeklediğimizde hafızalı devremiz hazır olacaktır.

Tabloyu yorumlayacak olursak: başlangıçta 000 olan durum, ledlerin hiçbirini yakmıyor ve bir sonraki durumun 001 olması için ff lere gerekli girişleri uyguluyor; durum 001 olduğunda ledlerden ilk baştaki yanıyor ve sıradaki durumun 010 olması için ff lere uygun girişler uygulanıyor. Dikkat ederseniz bu uygun girişlerin yine o anki durum tarafından belirlendiğini söyledim, FF lerin giriş fonksiyonlarını o anki durumlar belirleyecek, dolayısıyla bir sonraki durumu o anki durumlar belirleyecek. Yani devremiz kendi gidişatını kendisi belirliyor, hafızalı devrenin güzelliği! Bu konu üzerine düşünmenizi tavsiye ederim, ff lar bir durumdan diğer duruma nasıl geçiyor? Hangi duruma geçeceklerine kim karar veriyor?
Ben burda sadece birinci JK ff için uygulanması gereken giriş değerlerini yazacağım, diğerlerini verdiğimiz uyarım tablosuna göre siz yazabilirsiniz.

Bu şekilde diğer ff lerin girişlerini de belirlediğimizde durum tablomuz:


Z1, Z2, Z3, Z4 ve JK1, JK2, JK3 fonksiyonlarını kombinasyonel devre tasarımında öğrendiğimiz şekilde indirgemeliyiz. Biz yukarıdaki örnekte bu işlemi sadece bir F fonksiyonunu bulmak için yapmıştık, gördüğünüz üzere burda 10 tane fonksiyon var. Bunların tek tek bulunması oldukça uzun bir iş, 10 tane k-map çözümlenmesini gerektiriyor. Üstelik ilk kısımda bahsettiğimiz gibi fonksiyonları aynı anda indirgeyerek ortak terimlerin bulunmasıyla devremiz çok daha basitleşebilir ki bu basitleştirme işlemi bashettiğimiz yazılımlar tarafından kolayca yapılır. Biz de burda MORP u kullanacağız, MORP a inputu şöyle veriyoruz(metin dosyası vasıtasıyla):

Ve indirgenmiş fonksiyonlarımız:

Pek basitleşmişe benzemiyor, devrenin gerçeklenmesi bizi uğraştıracak. Üstelik kullanılan eleman sayısı da pek az olmayacak. Bu durumda farklı bir çözüm aramak daha iyi olabilir ancak burda örnek bir uygulama geliştirdiğimiz için devam ediyoruz:
Biz JK tipi ff seçtik ve durum kodlamasını bu şekilde yaptık; bu seçimler devrenin karmaşıklığıyla doğrudan ilgilidir. Bahtımıza biraz karışık bir çözüm çıktı. Olsun! Devremizi gerçekleyip çalışıp çalışmadığına bakalım:

12 lojik kapı ve 3 ff kullanıldı, bu da yaklaşık 5 entegre demek. Biraz pahallı bir çözüm, örneği ve çözümü yazı esnasında düşündüğüm için pek açık bir örnek olmamış olabilir ama hafızalı devre tasarımı hakkında bilgi verdiğine inanıyorum.

Devremiz çalışıyor, Morp ve Digitalworks programlarını ve yaptığımız örnekleri buradan indirebilirsiniz.
(Arkadaşlar verdiğim digital works versiyonu demo olduğu için dosyayı simüle etmiyor)

Yazıda anlatmak istediğim birçok yeri anlatamadım çünkü yazımız içinden çıkılmaz bir hal alıyordu, burda temel bir fikir vermeye çalıştım. Umarım faydalı olmuştur, iyi çalışmalar dilerim.

Tags :

5 thoughts on “Dijital Devre Tasarlayalım”

  1. selam ben elektrık elektronık muhendisliği bölümünü okuyorum ve ikinci sınıfım ama benım digital devreler ile aram çok kötü bu bilgileriniz benim çok işme yaradı teşekkürler varsa daha fazla ve ayrıntılı olarak elinizde bulunan bilgileri alabilirmiyim şimdiden tşkler

  2. Merhabalar yazının tümünü okuyamadım ama gerçekten açıklayıcı olmuş. ben de bu dersi şu an alıyorum ve ödev olarak kombinasyonel lojik devre tasarımı ve gerçeklenmesi istendi. Tasarım hakkında şaşırıp kaldım çünkü elim elektronik içeriklerine çok yabancı. Daha karaköye gidip de çarşıdan ne satın alıp alacağımı bile anlayamıyorum. Protoboard, kapılar ve bunların birbirine entegresi ve ne kadara mal olur, çok yabancıyım bu işlere. kime sorsam doğru dürüst cevap alamadım. Bana mail ile dönebilirseniz sevinirim. (bir de trafik lamba hata kontrol gibi çok basit boole cebirli bir devre ödev kabul edilebilir mi, uygulaması nasıldır, nasıl board a kapılar yerleştirilir vb. sorularım için görüşebilir miyiz, sizden bir an önce cevap bekliyorum inş.) Şimdiden teşekkürler.
    Saygılar

  3. Size e-posta attım. Attığım e-postayı bir de buraya koyuyorum, diğer arkadaşlar için:
    Yazı biraz karışık oldu, bazı yerleri birkaç defa okumak durumunda kalabilirsiniz:
    Merhaba. Karaköy’den ne alacağınızı bilmemek çok normal. Ben de Karaköy’e ilk gittiğimde malzemenin adını acaba doğru mu söylüyorum, böyle bir malzeme var mı gibi tereddütler yaşıyordum, komik durumlara düşmekten korkuyordum ama bunlar hiç önemli değil. Bunlar böyle böyle aşılacak, zamanla öğrenilecek, hiç öğrenmeyip mezun olmak daha mı iyi! Ordaki elemanlar da bilmiyor zaten.

    Şimdi kombinasyonel devre tasarımını öncelikle bir simülasyon programında yapmanız gerekir. Yani gerçek devreye geçmeden önce, simülasyon yapılır. Şart değil, devrenizden eminseniz direkt de kurabilirsiniz ama önce simülasyon yapmak daha iyi olur. Herhangi bir simülasyon programı kullandınız mı bilmiyorum, kullanmadıysanız da başlamış olacaksınız, hiç zor değil. Ödevin kapsamı nedir bilmiyorum, ama 3-4 girişli 1 veya 2 çıkışlı bir devre uygundur bence. İlk aşama bir devreye karar vermek ve bu devreyi simülasyon programlarında( proteus: elektronik genel bir simulasyon programi, multisim: elektronik genel bir simulasyon programı, digitalworks: sadece lojik devreler simulasyon programı) kurup çalıştırmak, devremizin doğru çalıştığından emin olmak. Simülasyonda sadece lojik fonksiyonu kontrol etmek istiyoruz, simulasyon programlarında kapılar aynen gerçek bir entegre gibi de gösterilebilir veya sadece kapının simgesi de gösterilebilir, orda çok gerçeklik aramıyoruz, sadece lojik fonksiyonumuz doğru mu: 1 0 1 1 girişine çıkışlar 1 1 mi gibi kontrol ediyoruz… Sonra malzemeleri alıp gerçekleme aşamasına geçeceksiniz. Sizin malzemlerinizin fiyatları ucuz. Protoboard, zil teli kablo, 3-4 tane lojik entegre, 5 tane 220 ohm direnç, 5 tane kırmızı led, 7805 5V regülatör ve 9V pil ve pil başlığı sizin işinizi görecektir, bir de kabloları sıyırabileceğiniz basit bir yan keski almalısınız(el tezgahlarında 2 TL) hepsi 10TL civarı olur. Aslında bir de multimetre alırsanız iyi olur, çünkü multimetre şu uygulamanız için elzem olmasa da bu işlerle uğraşan biri olarak muhakkak lazım olacaktır, multimetre fiyatları(7 TL den başlıyor, 20 TL ye güzel modeller var) Breadboardu tanımanız için şu adrese bakabilirsiniz:
    http://320volt.com/en-basitinden-temel-elektronik-baslangic/

    Bir de şu yazıya bakabilirsiniz, yazının içinde fikir verebilecek bir malzeme listesi var, yazının aşağılarında kurulmuş devre resimleri var:
    https://www.fazfarki.net/pic-programlamaya-nasil-baslamali/

    Mesela devrenizi simülasyonda çalıştırdınız, atıyorum devrede 3 tane and kapısı, 2 tane or kapısı 1 tane de exor kapısı var. Hangi entegrelerden kaç tane alacaksınız? Lojik entegrelerin içinde birden fazla kapı oluyor mesela and kapısı entegresi içinde 4 tane and kapısı oluyor. Karaköy de and kapısı diyince 74HC08 verebilen adamlar var ama siz ismiyle isteyin. http://ee.yeditepe.edu.tr/labs/datasheets/index.html adresinde en çok kullanılan lojik entegrelerin isim listesi var(bu gibi listeler her yerde var), entegrenin kataloğuna(datasheet) bakarak entegrenin hangi pini nerde öğrenebilirsiniz. Entegre isminde ortadaki harfler entegrenin fonksiyonuyla ilgili değil. 74LS08 de bir and kapısı, ortadaki harfler bazı elektriksel karakteristiklerle ilgili, dolayısıyla sadece 7408 demek and kapısı demektir. Mesela 74HC08 bir and kapısıdır, bunun kataloguna bakalım http://ee.yeditepe.edu.tr/files/labs/datasheets/ic/74-08.pdf ilk sayfada connection diagram var, eğer VCC ye 5V verir GND ye de 0 verirsek elimizde kullanıma hazır 4 tane and kapısı var demektir, giriş çıkışarın hangi pinler olduğu kapı sembollerinden belli. Size yukarıda bahsettiğim devremiz için başka 2 or kapısı lazım yani bir tane 7432 entegresi lazım ve son olarak exor için 7486 lazım, kataloglara google dan da ulaşabilirsiniz.

    İlk devre kurmak biraz zor olabilir, zamanla alışacaksınız, şu yapacağınız uygulama size çok şey katacak. İyi çalışmalar.

  4. mrb arkadaşlar bi proje ödevim var ama nasıl yapacağıma karar veremedim türkiye haritasının 81 ilinde buton olcak butona bastığında pcde o ilin sitesi acılacak program yazmada sorun yok fakat elektroniği nasıl yapacam klavyenin içine ekleyerek yapsam olurmu bi fikriniz varmı

  5. hocam Güzel özet geçmişsiniz ancak flip floplarla ilgili bi kaç örnek koyarsanız güzel olur. Birde eksik konular var onlarıda eklerseniz güzel bir ders kitabı olabilir 🙂

seda için bir yanıt yazın Yanıtı iptal et

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir