7 Ocak 2017 Cumartesi

RTOS (REAL TIME OPERATING SYSTEM)


RTOS (REAL TIME OPERATING SYSTEM)

Mikrodenetleyiciler, aynı anda bir komut satırını işletebilen entegrelerdir.

 Yukarıda sonuz döngü içine giren mikrodenetleyici ilk olarak birinci komut satırını işler sonra ikinci komutu daha sonra üçüncü komutu işler. Yani işleri sırayla yapar.


Örneğin; ardiuno’da loop fonksiyonun içine iki adet sonsuz döngü yerleştirelim. Mikrodenetleyici ilk sonuz döngüye girdiğinde oranın içindeki komutlaru sırayala işler fakat ikinci sonuz döngüye birinci döngüden çıkamadığı için oradaki görevleri işletemez.  

RTOS, mikrodenetleyicilerin içine gömülen bir işletim sistemidir aynı windows, linux gibi. RTOS’un en önemli özelliği görevleri parelelmiş gibi yapma yeteneği olmasıdır, bu özelliğiyle FPGA benzetebiliriz. Örneğin, Bilgisayarda müzik dinliyorsunuz spotify’de bir yandada internette gazete okuyorsunuz. Bilgisayarda bu işler parlelmiş gibi yapılıyor. İnternette gezereken internet sayfanız donsa bile veya internet sayfanız geç açılsa bile arka tarafta siz şarkınızı gayet akıcı bir şekilde dinliyor olacaksınız. Bu iki görevi yani yazılımda sanki iki farklı while sonsuz döngüsünde olduğunu düşünün. Yani bilgisayar iki farklı sonuz döngüyü aynı anda çalıştırıyor. Aynı bu yapıyı mikrodenetleyicilerdede RTOS sayesinde yaptırabilirz.

RTOS, sayesinde iki veya daha fazla sonsuz döngüyü aynı anda çalıştırabiliriz.




Yukarıdaki resimde RTOS ile çalışan iki farklı sonsuz döngü içersinden alınan iki sinyal görülmektedir.

Birinci sinyal sdkart’a data yazma zamanını, ikinci sinyalde her 6 ms’da ekg devremizden örnekleme aldığımızı düşünelim. Burada yapılan iş 6 ms örnekleme alıp onu sd kart’a yazmak fakat bunu RTOS’suz yaparsak 1.sinyalde A1’den A2’ye kadar lojik bir seviye olmuştur. Yani, sd karta yazma işi uzun sürmüş yaklaşık  60 ms. RTOS’suz yaptığımız düşünürsek 60 ms’de biz 6 adet ekg verisini kaybetmiş oluruz çünkü tek bir sonuz döngü içinde olacak önce ekg datasını okucayacak sonra onu sd kart’a kaydedecek. Kaydetme işi uzun olduğundan okuma yapıyacak ve bu durumda datalar eksik yazılacaktır.

Fakat bunu RTOS kullanarak yaparsak bu başımıza gelmeyecek. İkinci sinyalde de bu görülmektedir. A1 ve A2 süresi uzun sürse bile biz örnekleme alacağız yani datalarımız kaybolamayacak.  Burada iki farklı sonsuz döngü olacak. Birinci döngüde sd karta yazacak, ikinci döngüde örnekleme alacağız kesintisiz.     

6 Ocak 2017 Cuma

Köprü Tipi Doğrultucu Tasarımı

Köprü Tipi Doğrultucu Tasarımı


Merhabalar, bu yazımda sizlere köprü tipi doğrultucu devre tasarımı yapacağım PSPICE programını kullanarak. 
 


 Bu devre tasarımındaki amacım ilk olarak verilen devre şemasını Pspice programında simüle etmek ve daha sonra çıkış gerilimini 10V'a zener diyot kullanarak sabitlemek.


1.adım
İlk olarak devremiz için Pspice kodunu yazalım;

VS    1 0  SIN 0 20 50
Rzout 1 2  50
DR1   2 4  D1N4002
DR2   0 4  D1N4002
DR3   3 0  D1N4002
DR4   3 2  D1N4002
RL    4 3  4k
CL    4 3  10u
.model D1N4002 D (IS=14.11E-9 N=1.984 RS=33.89E-3 IKF=94.81 XTI=3 EG=1.110
+ CJO=51.17E-12 M=0.2762 VJ=0.3905 FC=0.5 ISR= 100.0E-12 NR=2 BV=100.1 IBV=10 TT=4.761E-6)
.tran 1u 80ms 0 0.1ms
.PROBE

.END

2.Adım
Simülasyon sonuçlarımızı gösterelim;


Yukarıdaki resimde kahve rengi ile çizilen sinyal giriş sinyalimiz, yeşil sinyalimiz ise çıkışımızdır. Görüldüğü gibi sinüzoidal giriş sinyalimizi ortalama gerilimi 0V'dan yukarı çıkardık.

3.Adım
Devre çıkışını 10V'a çekmek için zener diyotlu devremizi kuralım daha sonra simüle edelim.





















Yukarıdaki kahve rengi sinyalimizde görüldüğü gibi çıkışı 10V'a zener diyotlu devremiz sayesinde sabitledik.


5 Ocak 2017 Perşembe

FPGA ile Yapay Sinir Ağı Tasarımı


FPGA İLE  BASİT NÖRON TASARIMI




Bu yazımda,  bu dönem Yıldız Teknik Üniversitesi Elektronik ABD Doç. Dr. Burcu ERKMEN hocamın vermiş olduğu programlanabilir lojik devre tasarımda dersinde Mehmet Özgen Özdoğan arkadaşımla beraber almış olduğumuz FPGA'de basit bir nöron tasarımı projemizi anlatacağım. 

Öncelikle bu projemizde emeği geçen değerli hocamız Doç. Dr. Burcu ERKMEN ve Arş. Gör. Ali Rıza YILMAZ hocamıza ve aynı zamanda proje arkadaşım Mehmet'e emeğinden verdiği emekten dolayı teşekkür ederim. 

Bu proje sayesinde yapay sinir ağı hakkında daha önce bilmediğim bilgileri bu proje sayesinde hem öğrenmiş hemde fpga gibi zor bir platformda nasıl uygulanacağı hakkında bilgilere sahip oldum. 

Bu projemizde ISE Design Suite 14.7 programını ve Xilinx Spartan 3E eğitim kitini kullandık ve sonuçları kit üzerindeki LCD ekran üstünde hexadecimal sayı olarak görüntüledik.

Yapay Sinir Ağı Nedir ?

Kısaca, yapay sinir ağı insanın beynini taklit eder. Burada hücreyi modeleyerek tasarım yapılıyor. 






Yandaki resimde hücre yapısı görülmektedir. İşte bu hücre yapısı modellenerek YSA oluşturulmuştur.  Burada dendritlere gelen bilgiler hücre gövdesi içersinde değerlendirilerek bir çıkış elde edilir ve o çıkış akson boyunca akson çıkış uçlarına yönlendirilir ve oradan diğer hücrelerin dendritlerine gider. 




Yapay sinir hücreleri biyolojik sinir hücrelerine benzer yapıdadır. Yapay nöronlar aralarında bağ kurarak yapay sinir ağlarını oluştururlar. Aynı biyolojik nöronlarda olduğu gibi yapay nöronların da giriş sinyallerini aldıkları, bu sinyalleri toplayıp işledikleri ve çıktıları ilettikleri bölümleri bulunmaktadır.

Bir yapay sinir hücresi beş bölümden oluşmaktadır;
  • ·         Girdiler
  • ·         Ağırlıklar
  • ·         Toplama Fonksiyonu (Birleştirme Fonksiyonu)
  • ·         Aktivasyon fonksiyonu
  •             Çıktılar 




Giriş ve ağırlık değerleri ondalıklı sayılarda işlem yapacağımız için IEEE 754 standardına göre 32 Bit FloatingNumber yapılarak işlemler bu şekilde ilerledi. FPGA donanımı üzerinde ondalıklı sayılarla işlem yapamadığımız için bu yönteme başvurduk. IPCORE ile fl_carpma ve fl_toplama blokları oluşturduk. Bu blokları 32 Bit tasarladık. Bu sayede giriş değerleri ile ondalıklı olabilecek ağırlıkları ile çarpıp sonunda toplama işlemini yaptırmış olduk. Ağırlıklarını ise W1,W2,W3,W4 sırasıyla 0.5, -0.7, -0.5, 0.32 ayarladık.






Bu ağırlıklar ile çarpım ve toplamlardan sonra elde edilen değeri ise transfer fonksiyonundan geçirmek gerekmekteydi. Burada Sigmoid Fonksiyonu kullandık. Bu sigmoid fonksiyonu 16 bit olduğundan ve 32 bit elde ettiğimiz sonucu kafamıza göre bölemezdik. Çünkü bu kodlama mantığında ilk bit işaret biti sonrasındaki eksponansiyel ağırlıkları ve sonrasında sayı bulunan bir sistemdi. Bu yüzden yine Xilinx ISE Design Studio içerisindeki IPCORE yardımıyla 32 Bit’ten 16 Bit’e düşüren floatingpoint – floatingpoint çevirici ve ardından çıkan sonucu tekrar 32 bit görebilmek için 16 Bit’ten 32 Bit’e çeviren modül tasarladık. Toplama çarpma işlemlerinin 32 Bit sonucu 16 bit sonuca düşürüldü ve ardından sigmoid fonksiyonundan geçirildi. Ardından 16 bit çıkış tekrar 32 Bit’e dönüştüren blok sayesinde 32 Bit yapılarak çıkışa atandı.





Sigmoid fonksiyonu  yaklaşımındaki 16 bit değerlerinin ayrıca sigmoid_rom.vhd bloğunda tutularak ilgili durumlarda adreslere göre değerlerin çekilmesi üzerine oluşturulmuştur.




Bu projenin Spartan 3E 1600E kartına atılıp ve kartın üzerindeki LCD 16x2 ekranında görünmesi için elde ettiğimiz bu 32 Bit sayıyı dörderli gruplara ayırrdık. LCD ekranda HEX değeri okumak için böyle bir işlem uyguladık. 0000 1111 0000 1000 0001 … 32 Bit uzunluktaki sayıyı ekranda okuması zor olacağından HEX değeri yapılarak sonuca gittik. 0x0F081… ekranda yazması daha kolaylık sağlayacaktır. Burada karttaki programın çıkışını LCD’de görmemiz için gerekli komutları ana_modul.ucf dosyası içine tanımladık. Girişleri 4 switch üzerine atadık. Reset için buton kullandık. Ayrıca saat girişi olarak 50 MHz kart üzerindeki clock aktif edildi.




Bu projemizde 4 adet giriş butonu ile giriş değerleri değiştirilmiştir. Bu giriş değerleri kendi katsayıları ile çarpılarak daha sonra aktivasyon fonksiyonunda geçirilmiş ve sonuç LCD'de gösterilmiştir.  





Bu projede sayede ileri yayılım algoritmasını kullandık, geri yayılım algoritmasını fpga üzrinde deneyemedik proje zamanımızın 2 hafta olmasından dolayı. 

Geri yayılım algoritmasının amacı; biz önce sisteme rastgele  W1,W2,W3 ve W4 katsayılarını veriyoruz sonra ileri yayılım algoritması ile çarpma daha sonra toplama ve sonra aktivasyon fonksiyonundan geçirdikten sonra bir çıkış elde ediyoruz. Bu çıkış değeri beklenen değerden farklıdır yani çıkışta hata vardır. Bu hata değeri geri yayılım algoritmasını kullanarak W1,W2,W3 ve W4 otomatik olarak tekrar güncellenir. Bu güncellemeyi sistem kendi kendine yapar. Yani sistem öğrenme durumuna gelir. Bu işlem sistem öğrenene kadar devam eder.  İşte insan beynine benzetilmesinin nedeni de budur. Yani sistem kendi kendini eğite biliyor olmasıdır. 


Sonuçlar



Tüm girişlere lojik 1  değeri verdiğimizde simülasyon sonucu ;



Uygulama sonucu;




   

Kaynaklar 

1.  http://www.ibrahimbayraktar.net/2013/11/sinir-sisteminin-yaps-ve-islevleri.html 
2.  http://mehmetozgenozdogan.blogspot.com.tr/
3. https://www.quora.com/What-is-the-sigmoid-function-and-what-is-its-use-in-machine-learnings-neural-networks
4.http://www.aliosmangokcan.com/index.php/makaleler/46-ysa-ile-xor-uygulamasi
5.http://bilgisayarkavramlari.sadievrenseker.com/2008/10/05/ozel-veya-problemi-xor-problem-exclusive-or/
6.http://www.idt.mdh.se/utbildning/exjobb/files/TR0825.pdf
7.http://www.ijser.org/paper/A-Survey-on-FPGA-based-MLP-Realization-for-On-chip-Learning.html
8.http://www.emo.org.tr/ekler/b8a21b630fcd49a_ek.pdf
9.http://ethesis.nitrkl.ac.in/4217/1/FPGA_implementation_of_artificial_neural_networks.pdf
10.http://www.alicavuslu.gen.tr/wp-content/uploads/2014/02/tez.pdf
11.http://blog.aliekberyacin.net/?p=305#prettyPhoto
12.http://trace.tennessee.edu/cgi/viewcontent.cgi?article=3725&context=utk_gradthes
13.http://web.itu.edu.tr/ayhant/dersler/ysa/dn/ozden.pdf