For english version http://dincaysroom.blogspot.com (Not complete yet)

2 Haziran 2010 Çarşamba

Verilog ile PID Kontrol

Verilog'da yazılmış ve doğrudan FPGA'de çalışan bir PID kontrol bloğu yaptım. Bir PID kontrol bloğunu çalıştırmak doğru çalışan bir programa ek olarak için P, I ve D katsayılarını doğru belirlemek gerekiyor. İnternette PID anlatan bir sürü belge var ama düzgün çalışan bir kat sayı seti bulamadım. Deneme yanılma ile ISE'de simulasyonda çalıştığı görülebilecek şekilde katsayıları belirledim. Normalde PID kontrol şeması aşağıdaki resimdeki gibi oluyor.


Benim durumumda dış elektronik hiç kullanmadığım için geri besleme FPGA'in içinden oluyor. Genel bir şey olmasını istediğim için de kontrol edilecek blok (resimde plant) "Çıkış=Giriş" olan bir blok.

Kullandığım PID denklemini http://www.atlantixeng.com/pdf-files/PID_Controller_in_FPGA.pdf adresindeki belgeden aldım.

Programın 8 bit girişi ve 8 bit çıkışı var. Program kodlarına buradan erişilebilir.

16 Şubat 2010 Salı

FTDI ve ncurses ile Hazifa Oyunu

Ftdi cipi ile kontrol edebildigim 4 led ile bir hafiza oyunu yaptim. Oyun soyle
  • Oyun rastgele sirayla yanan ledlerin hangi sira ile yandigini programa girmek uzerine kurulu.
  • Oyunda tur/level mantigi var. Ledler yaniyor, sirasi giriliyor, ledler yaniyor sirasi giriliyor ... seklinde.
  • Ayni anda sadece 1 led yaniyor. Birden fazla led ayni anda yanmiyor.
  • Her turda, o turun sayisi kadar led yaniyor. 1. turda 1 led, 2. turda 2 led, 7. turda 7 led yaniyor.
  • Led sirasi soyle belirleniyor: Onceki turdaki led sirasi + rastgele bir led.
Bu kurallara gore yazacagim programda olmasini istedigim bir ozellik her sayiya basilinca enter tusuna basma zorunlulugu olmamasiydi. Bunun icin girdiyi getch() fonksiyonu ile okumak gerekiyor. Getch() Windows'ta conio.h'in icinde, fakat Linux'ta bu kutuphane yok. Getch()'in oldugu kutuphane ncurses.h. N on eki new den geliyor. Curses ogrenmeye getch() kullanmak istedigim icin basladim.

Netten arastirdigimda curses'in aslinda cok kullanilan bir kutuphane oldugunu ve en basit konsol uygulamalari icin bile kullanilmasinin buyuk kolaylik oldugunu ogrendim. Ncurses'i kurmak icin

sudo apt-get install libncurses5-dev

komutunu girmek lazim. Daha sonra c kodunun basina #include satirini eklemeli, gcc ile derlerken de -lncurses bayragini eklemek gerekiyor.

Ncurses kutuphanesinden kullandigim fonksiyonlarin aciklamalarini koda ekledim. Ncurses hakkinda daha ayrintili bilgiye http://tldp.org/HOWTO/NCURSES-Programming-HOWTO/ adresinden ulasilabilir. Kutuphanede tanimli sabitler ve fonksiyonlarin listesi http://www.opengroup.org/onlinepubs/007908799/xcurses/curses.h.html adresinde var.

Programi yazarken en cok zorlandigim yer, getch() fonksiyonunun klavyeden bir girdi beklemeden -1 donmesiydi. Bunu halletmek icin programda nodelay modunu kapatmak gerekiyormus. Ikinci en cok zorlandigim nokta da ekranin kaydirma modunun kapali olmasindan dolayi ekrana sigmayacak satirlarin en son satira arka arkaya yazilmasi oldu. Bu sorunu cozmek icin scroll modunu acmak gerekiyormus. Aklima takilan diger noktalari ustteki iki linkten ve manuellerden hallettim.

Program maalesef sadece linux'ta calisiyor, windowsta calismiyor. Windows'ta calisan versiyonu icin linux kodunu biraz degistirmek yeterli. Yapilmasi gereken conio.h'in eklenmesi, ncurses fonksiyonlarinin cikarilmasi, usleep fonksiyonunun degistirilmesi ve printw fonksiyonlarini printf ile degistirilmesi.

Oyun duzenegi bir onceki yazimda fotografta gosterilen duzenegin aynisi. FTDI donusturucu ve ucuna baglanmis 4 tane led.

Program koduna buradan erisilebilir.

4 Şubat 2010 Perşembe

FTDI Programi

FTDI cipini bitbang modda calistirip, 4 cikis pinini kontrol eden programi yazdim. Program 1-4 arasinda bir sayi girince ona karsilik gelen LED'in durumunu degistiriyor. Ayni zamanda LED'lerin durumunu ekranda da gosteriyor.

Programi calistirmak icin admin olmak gerekiyor. Aksi takdirde USB cipine ulasilamiyor. Program icin gereken kutuphaneleri ve programin nasil derlenecegini onceki yazida anlattim. Donusturucunun 6 cikisindan ikisi VDD ve GND. Geri kalan 4 pinin her biri 1 LED'e bagli. Donusturucunun hangi renk pinlerinin ne oldugu datasheette yaziyor. Bu resimden de bakilabilir.


Burada kullandigim FTDI donusturucu ve Digilent LED karti var. FTDI'nin kablolarini Digilent'e gore siralayip LED'lere bagladim.


Duzenek oldukca basit


FTDI ve 4 LED'i kullanarak bir oyun yazacagim. Bunun icin curses.h kutuphansini kullanmam gerekiyor. Sonraki yazimda curses.h kutuphanesini anlatacagim. Linux'ta temel bir kutuphaneymis.

Program kodlarina buradan erisilebilir.

FTDI USB - RS232 Donusturucu

Bilgisayarla FPGA'i konusturmayi uzun suredir dusunuyordum. Bunun icin en kolay yol RS232 portunu kullanmak. Fakat artik bilgisayarlarin RS232 portu yok. Onun yerine USB-RS232 donusturucusu kullanmak gerekiyor. Bu donusturuculerin yaninda gelen program ile bilgisayarda sanal COM portu olusturuluyor. Isletim sisteminin COM porta yolladigini sandigi veriyi donusturucu surucusu donusturucuden kullanilan cipe uygun bicimde USB'ye yolluyor. Cip de bu datayi RS232 standartlarin uygun hale getirip disari veriyor. Temel mantik bu.

Bilgisayarla FPGA'i konusturmak icin bilgisayarda COM portunu kontrol edebilmek gerekiyor. Windows'ta COM portu sadece Hyper Terminal ile kontrol edilebiliyor. Windows'ta calisan herhangi bir COM port kutuphanesi yok. Hyper Terminal ise oldukca hantal bir program. Linux'ta ise COM portu kontrol eden kutuphaneler var. Biraz dolambaclilar ama yine de calisiyorlar. Bu yuzden bu isi Linux'ta yapmaya karar verdim.

USB hakkinda iyi olan iki firma biliyorum, Cypress ve FTDI. Cypress bu konuda daha tecrubeli ve yetenekli gozukuyor. Cypress'in urunleri daha kapsamli. FTDI'nin cipleri ise daha basit islerde kullanilacak turden. Basit olmasi benim icin daha iyi. Ayrida FTDI'in Turkiye distributoru var. Az bir kargo ucreti ile siparis verebiliyorum. Bu yuzden FTDI almaya karar verdim.

FTDI'in sitesinde 2 surucu var. Bir tanesi anlattigim gibi sanal COM portu olusturuyor. Digeri ise sanal COM portu olusturmadan dogrudan USB portunu kontrol ediyor. Ikinci yontem cok daha kolay. Aslinda ikinci yontem surucu degil, bir C kutuphanesi. Kutuphanedeki fonksiyonlari kullanarak bir C programi ile cip kontrol edilebiliyor. Bu tam istedigim sey.

Bu kutuphaneyi incelerken FTDI ciplerinin baska bir ozelliginin oldugunu ogrendim. Normalde RS232 ile seri iletisim en az 2 pin ile (Rx ve Tx) gerceklesiyor. FTDI ciplerinde 1'er tane de handshaking icin pin var. Toplam 4 pin, 2'si giris, 2'si cikis. Ayrica cikis pinlerinin degeri de RS232 protokolune gore belirleniyor. Fakat bitbang denilen modda bu 4 pin sanki mikroislemci pini gibi giris ve cikis olarak programlanabiliyor ve mikroislemcilerdeki gibi degerleri istenildigi gibi degistirilip istenildigi zaman okunabiliyor. Yani bilgisayardan kontrol edilen, bilgisayarda yazilan c programina gore calisan 4 pinli bir mikroislemci gibi davranabiliyor. Bu da harika bir ozellik. RS232 standartina bagli kalma zorunlulugu yok.

FTDI'in sitesinden 2 kart siparis ettim. Bir tanesi FPGA kartinin RS232 portuna baglayabilecegim, arada voltaj kaydiricinin oldugu EVAL_232R karti, digeri ise dogrudan FPGA pinlerine baglayabilecegim sekilde olan TTL-232R karti. Bunu ucu ciplak kablo olan modelini aldim. Pinleri, Digilent'in PMOD kartlarina uygun sekilde kendim dizip FPGA kartina kolayca baglayabilecegim.

FTDI cipleri icin iki farkli kutuphane var. Bunlardan D2XX kutuphanesi FTDI'nin yazdigi kutuphane. Kaynak kodlari acik degil. Ikincisi ise libftdi kutuphanesi. Bu acik kaynak kodlu. libftdi'yi Linux'ta kurmak

sudo apt-get install libftdi

komutu ile oluyor. libftdi hakkinda daha fazla bilgi http://www.intra2net.com/en/developer/libftdi/index.php adresinden edinilebilir. http://hackaday.com/2009/09/22/introduction-to-ftdi-bitbang-mode/ adresinde de cok guzel bir program ornegi var. Ayni zamanda bitbang modu anlatiliyor. C programi icin herhangi bir metin editorune yazilan program

gcc -lftdi -o main main.c

komutu ile derleniyor. -lftdi bayragi ftdi kutuphanesini eklemek icin yaziliyor. Programin icine yazilan #inlclude yetmiyor. Niye boyle oldugunu bilmiyorum. Bu cozumu de internette buldum.

Yazdigim programi bir sonraki yazida anlatacagim.

21 Ocak 2010 Perşembe

Kart yandi !!!

Karti yaktim. Uzun sureden sonra veriloga geri donmek istedim. Yanlislikla ayni girisli fakat voltaj degeri farkli olan bir adaptoru bagladim. Aninda yandi kart. Iyi haber FPGA'e muhtemelen bir sey olmadi. Cok buyuk ihtimalle voltaj regulatorleri yandi. User manuel'de karta guc veren iki regulator oldugunu soyluyor. Biri Texas Instruments'in 1.2, 2,5 ve 3.3V ureten regulatoru, digeri Lineer Devices'in 2.4 V ureten regulatoru. User manuel sayfa 141'de regulatorlerin semalari var. Lineer'in regulatorunun yandigina eminim, Texas'in regulatorunun durumunu bilmiyorum. Iyi haber Lineer'in regulatoru sadece DRAM'i besliyor. Yani yanan sadece Lineer'in regulatoru ise onu sokup FPGA'i kullanmaya devam edebilirim, DRAM'i kullanmasamda olur. Eger Texas da yandiysa durum kotu. Ustelik Lineer'in paketi SOIC. Yani havya ile lehimlenebilir. Texas'in paketinde ise padler paketin altinda, havya ile lehimlemem imkansiza yakin. En kisa zamanda karti okuldaki laba goturup hangi entegrelerin yandigina bakacagim. Yanan entegreleri de www.tr.farnell.com adresinden getirtecegim. 100 avronun altindaki alimlarda 15 avro ek ucret odeniyor. 100 avroluk bir seyler almaya calisacagim.

12 Eylül 2009 Cumartesi

Klavye Arayüzü - 1

Klavyeden basılan tuşun kodunu 7 bölmeli ledde gösteren bir program yazdım. Program klavyeden gelen veriyi doğrudan ledlerde gösteriyor.

Klavye veriyi SPI(Serial Peripheral Interface) ile gönderiyor. SPI'de bir clock bir de data hattı var. Clock'u da datayı da klavye sürüyor. O yüzden clockdaki kenarları bulmak FPGA'in işi. Klvaye veriyi paket halinde gönderiyor. Bir paket 11 bit. Paket biçimi 1 bit start biti ve hep 0 + 8 bit data + odd parity biti + stop bit. Data, clock'un negatif kenarında okunmalı. Datanın en düşük biti ilk yollanıyor. Aşağıdaki şekil PS2 klavyenin 1 paketi yollarkenki pin seviyelerini gösteriyor.

FPGA, ps2clockdaki negatif kenarları algılayıp, durum makinası ile ps2data'yı shift registera koyuyor. Sonra pariteyi kontrol edip, eğer hata yoksa ledlere veriyor ve data_ready bayrağını 1 yapıyor. Hata varsa ölü bir durumda kalıyor. FPGA'in tekrar çalışması için resetlemek gerekiyor. Ps2 klavyenin çalışma frekansı 10kHz - 16kHz arasında. Bu çok düşük çalışma frekansından dolayı 2 klavye pininin de filtrelenmesi gerekiyor.

Aşağıdaki şekilde klavye kodları var.
Bir tuşa basıldığında klavye o tuşun kodunu yolluyor. Eğer tuşa basılı tutulursa 0.1 saniye sonra tuşun kodunu sürekli yollamaya başlıyor. Tuş bırakılınca da F0 ve tuşun kodunu yolluyor. Yani 2 paket yolluyor. Program en son basılan tuşun kodunu gösterdiği için F0 gözükmüyor, onun yarine bırakılan tuşun kodu gözüküyor. Ama tuş bırakılınca ledlerin kısa bir süre yandığı görebiliyorum. Tuşa basılı tutulunca olan sürekli yollamalar da gözüküyor.

Bundna sonra klavye ile kartın üzerindeki LCD ekrana yazı yazabilecek programı yazmayı düşünüyorum.

Program kodları buradan indirilebilir.

5 Eylül 2009 Cumartesi

Multi LED 2

Çevrim sürelerini LCD ekranda gösterme işini hallettim. İşte ekran görüntüsü
LCD erkanı PicoBlaze mikroişlemci kontrol ediyor. LCD ekranın kontrolü, mirkoişlemci ile durum makinasıdan daha kolay oluyor. PicoBlaze'ı kullanmak için 2 şey gerekli. mikroişlemci kaynak dosyası ve program dosyası. Program kodu, FPGA'deki blok RAM'e hex olarak yazılıyor. Kodu hex'e çevirmek için başka bir program kullanılıyor, ISE bu işi yapamıyor. Gerekli olan her şey zip dosyasında var.

PicoBlaze kodundaki LCD fonksiyonlarını kart geldiğinde içinde yüklü olan programdan aldım. Bu program www.xilinx.com/products/boards/s3estarter/reference_designs.htm adresinden indirilebilir.

LCD ekranda niye olduğunu anlamadığım bir şey var. PicoBlaze'de LCD çıkış port_id'sini 40 kullandığımda harfler düzgün gözükürken 00 tanımladığımda bazı harflerin üstüne istemediğim şeyler yazılmış oluyor. Bunun sebebi belki 01, 02, 03 ve 04 port_id'lerindeki giriş pinleri ile çakışma olabilir ama bana saçma geliyor. LCD pinlerine osiloskopla bakmak gerekir.

Program kodlarına buradan ulaşılabilir.