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

8 Aralık 2010 Çarşamba

Rs232 ile RAM Kontrol

Bundan sonra yapacagim projelerin bilgisayar ile iletisimini cok kolaylastiracak bir proje yaptim. Rs232 ile fpga icindeki bir RAM'e yazma ve okuma yapabilen bir modul yazdim. Bu sayede rs232 ile fpga icinde kontrol edebilecegim onlarca register olacak.

Modulun icinde 2 portlu bir RAM var. Hem bilgisayar, hem de fpga uzerinde calisacak devre RAM'e okuma yazma yapabiliyor.

Bu projede mikroislemcilerin hafiza organizasyonundan esinlendim. Ornegin asagidaki sekilde pic16F877'nin hafiza organizasyon semasinin bir kismi var.


Pic'in icindeki RAM'in bazi adresleri belli amaclar icin atanmis. Ben de bundan sonraki projelerimde RAM'in adreslerine ihtiyaclarima gore gorevler atayip ustteki sekildekine benzer sekilde kullanabilecegim. Ornegin basit bir sayac uygulamasi icin; RAM'in 00inci adresini baslangic degeri, 01inci adresi bitis degeri ve 03uncu adresin 0inci bitini de basla sinyali olarak belirleyip sayac modulunu de buna gore olusturursam tamamen bilgisayar kontrollu bir sayac yapmis olurum. Sayac, saymayi bitirdiginde 04uncu adresin 0. bitini 1 yaparsa ve bilgisayardan 04uncu adresi okursam bu sayede sayacin saymayi bitirdigini anlayabilirim ve fpga'den bilgisayara bilgi aktarimi da yapabilirim.

Modulun blok semasi asagidaki sekildeki gibi.



Modul, 3 alt modulden olusuyor. RS232 modulunu onceden yapmistim. RAM, her hucresi 18 bitlik 16 adreslik, fpga'in icindeki dff'lerden olusan basit bir sram. Normal bir sram'den farki: 16 adresteki her datayi paralel olarak disari cikardim. Bu sayede "custom logic" olarak gosterdigim bloktaki modul, ram'i okumak icin fazladan bir is yapmayacak.

Ram interface modulu, Rs232 modulu ile ram arasindaki iletisimi kontrol ediyor. Rs232 modulunden gelen data 1 byte (8 bit), ram modulunden gelen data ise 3 byte (r/w(1) + adres(4) + data(18) = 23) oldugu icin bu module ihtiyac var. Bu modul ayni zamanda bilgisayardan yollanan komutu cozumleyip gereken isleri yapiyor. Bu modulun icinde 3 tane durum makinasi var. Biri ram bilgisini 3'e parcalayip rs232 modulune yolluyor, digeri rs232'den gelen 3 byte'i birlestirip ram'e yolluyor, sonuncusu ise bu iki durum makinasini kontrol ediyor.

Kendi belirledigim komut bicimi

r/w(1) + bos(1) + adres(4) + data(18) = 24 bit

seklinde. r/w biti bilgisayarin ram'e yazma mi okuma mi yapacagini gosteriyor. Eger yazma yapacaksa ram interface modulu ram'e datayi yazmak icin gerekli sinyalleri olusturuyor. Eger okuma yapilacaksa, ram interface modulu ram'den datayi okuyup, bilgiyi 3'e parcalayip rs232 modulune yolluyor. Durum makinalarinin calisma sekli koda bakilarak daha iyi anlasilabilir, kodun icinde bolca yorum yazdim.

Test icin yazdigim test modulunde, hangi portlarin, DE0 kartinda nerelere bagli oldugu kodun icinde yaziyor. Hangi anahtar nereyi kontrol ediyor, hangi led nereye bagli gibi.

Yaptigim modulu denemek icin bilgisayarda seri port uzerinden data yollayip okuyacak bir programa ihtiyacim vardi. Python'da basit bir kod yazdim. Kod sirasiyla okuma-yazma, adres ve data soruyor. Bu 3unu birlestirip rs232 icin 3 byte'a bolup sirasiyla yolluyor. Eger okuma secilmisse, 3 byte okuyor ve okudugu degerleri ekrana basiyor. Kod, nasil kullanilacagi konusunda kullaniciyi yonlendiriyor zaten. Basit olmasi icin data 255'ten buyuk secilemeyecek sekilde yazdim. Arayuz, ihtiyaca gore uygun sekilde duzenlenebilir.

Kullandigim kod

#python ram control with rs232
#08.12.2010
import serial

print("RAM RS232 Python Program")

ser = serial.Serial('/dev/ttyUSB0', 19200, timeout=10)

while True:
    #input
    rw = input('Is it read(1) or write(0)? ')
    if rw == 2: break
    addr = input('Enter the address (<16) ')
    data = input('Enter data (<256) ')

    byte1 = chr(int(rw)*128 + int(addr)*4)
    byte2 = chr(0)
    byte3 = chr(data)

    print 'Data is', ord(byte1), ord(byte2), ord(byte3)

    ser.write(byte1)
    #input('byte1 is send')
    ser.write(byte2)
    #input('byte 2 is send')
    ser.write(byte3)
    print 'Data is send'

    if rw == 1:
        print 'Data is now reading'
        rbyte1 = ser.read()
        rbyte2 = ser.read()
        rbyte3 = ser.read()
        print 'Read data is', ord(rbyte1), ord(rbyte2), ord(rbyte3)

ser.close()


Program kodlarina buradan erisilebilir.

30 Ekim 2010 Cumartesi

Ftdi VCP Sürücüleri ile Seri Iletisim

Libftdi kullanarak yaptıgim seri iletişimi ftdi'in VCP (Virtual Com Port) sürücüleri kullanarak da yaptım.

VCP kullanmamın sebebi, C dışında başka dillerle de ftdi çipini kullanmak istemem. Önceleri libftdi kullanmamın bana daha esneklik vereceğini düşünüyordum. Fakat neredeyse her programlama dili ile pc'nin seri portuyla (com port) konuşabilirim. Libftdi gibi ozellesmis bir kutuphane yerine cok daha yaygin olarak kullanilan seri port kutuphaneleri ile is yapmak daha mantikli.

VCP'yi yuklemek icin ftdi'in web sitesinden suruculeri indirdim. make komutunu dedigim zaman  

cc1: fatal error: /lib/modules/2.6.35-22-generic/build/include/linux/modversions.h: No such file or directory

diye hata verdi. Biraz arastirdigimdan anladigim kadari ile bu dosya daha eski linux versiyonlarinda buluyormus (Su an Ubuntu 10.04 kullaniyorum). http://ftdi-usb-sio.sourceforge.net/#sec6 adresinde eger vcp dogru yuklenmisse su sekilde anlayabilirsiniz diyor. Yazilanlari yaptigimda dogru yuklendigini gordum :)

Vcp'yi kullanmak icin C yerine python dili ile bir program yazdim. Python'da seri iletisim icin pySerial modulu gerekiyor. Kurulum icin http://pypi.python.org/pypi/pyserial adresindeki modulu indirdim. Kurulumun nasil olacagi indirilen klasorun icinde de yaziyor. Indirdigim klasore gidip

sudo python setup.py install 

komutunu verdigimde kurulum tamamlaniyor.

http://pyserial.sourceforge.net/shortintro.html adresindeki kucuk orneklere bakarak fpga'e data yollayip alabilen bir program yazdim. Program cok kisa oldugu icin buraya yaziyorum.


#python serial read-write
import serial


#baud rate = 19200, timeout = 10 sec
ser = serial.Serial('/dev/ttyUSB0', 19200, timeout=10)
ser.write("5")
x = ser.read()
print(x)
ser.close()


Artik de0 kartina bilgisayardan komut gonderebiliyor ve kartin tepkisini okuyabiliyorum. Bundan sonra komut alma/verme isini kolaylastiran bir komut cozucu yazacagim. 

18 Ekim 2010 Pazartesi

Altera DE0 - Seri Konfigurasyon Cipi (EPCS) Programlama

DE0'in uzerinde 4 kbitlik ozel bir seri flash var. Altera'nin dokumanlarindaki adi Serial Configuration Device, EPCS diye kodlaniyor. DE0'da 4 kbitlik modeli oldugu icin kodu epcs4. Karta guc verildiginde, eger programlama anahtari Run konumundaysa fpga epcs'deki konfigurasyonu yukluyor. Karti her baslattigimda, kartta, fabrikada yuklenen test programini gormek istemedigim icin epcs'yi kendi istegime gore programlamak istedim.

Epcs'yi programlamak icin DE0'in kullanim kilavuzunda bir bolum var (sayfa 20-21) ama orada yazanlari yapmak yeterli degil. Sadece orada yazanlar yapilirsa epcs'yi programlanamiyor. Zaten bu yaziyi yazma sebebim kullanim kilavuzunda ve internette bununla ilgili eksiksiz bir kaynak olmamasi.

Altera'nin fpga'in icine yuklenen konfigurasyon dosyasinin uzantisi .sof. Xilinx'te bu .bit idi. Fakat bu .sof dosyasi fpga icin, bunu epcs icin olacak sekilde degistirmek gerekiyor. Bunun icin quartus'ta
  • File->Convert Programming Files
tiklamak gerekiyor. Acilan yeni pencerede yapilmasi gereken ayarlar:

  • Programming file type -> Programmer Object File (.pof)
  • Configuration Device -> ECPS4
  • Input files to convert -> "SOF data'ya tikla" -> Add File -> cevirilecek .sof dosyasini sec

Bende bu islemlerden sonra pencerenin goruntusu soyle: 


Generate diyip .pof dosyasini olusturdum.

Ikinci adim yaratilan bu .pof dosyasini epsc4'e yazmak. Bunun icin quartus'tan programmer'i aciyorum. Cikan ekranda yapilacak degisiklikler soyle:

  • Hardware Setup -> USB Blaster
  • Mode -> Active Serial Programming -> Cikan ekrana 'Yes'
  • Enable real-time ISP to allow background programming (for Max2 devices) sec
  • Add Device -> EPCS4 -> OK
  • Cikan sembole tikla -> Change file -> .pof dosyasini sec
  • Program/Configure secenegini sec
  • Start

Start'a basmadan once ekran goruntusu soyle


Bu adimlari izledikten sonra epcs4'u programlayabildim ve kart her acilisinda artik saat uygulamasi ile basliyor.

7 Ekim 2010 Perşembe

PC-FPGA RS232 ile iletisim - 2

Fpga'de calisan koda ek olarak bilgisayarda da calisan bir yazilima ihtiyac var. Ftdi ciplerinin kontrol edilebildigi iki kutuphane mevcut: D2XX kutuphanesi ve libftdi kutuphanesi. Bunlardan ilki ftdi'in hazirladigi kutuphane ve acik kaynak kodlu degil. Fakat dokumantasyonu guzel. Libftdi ise acik kaynak kodlu ama dokumantasyonu kotu. Onceleri libftdi kullaniyordum. Bu defa dokumantasyonu daha iyi oldugu icin d2xx kullanmaya niyetlendim ama ubuntuda kutuphaneyi yuklemeyi beceremedim. Libftdi ise ubuntunun "repository"lerinde var ve cok kolay yukleniyor. Herhangi bir paket programiyla (synaptic, aptitude vs..) yuklenebiliyor. Lbftdi fonksiyonlari hakkinda bilgi sahibi olunabilecek belki de tek yer kutuphanenin dokumantasyon web sitesi. http://www.intra2net.com/en/developer/libftdi/documentation/index.html adresindeki sitede her fonksiyonla ilgili kisa aciklamalar var. Ayrica kutuphaneyi kurduktan sonra /usr/share/doc/libftdi-dev/examples klasoru altinda 5-6 tane ornek kod var. Orneklerden simple.c ve serial_read.c kodlari cok yardimci oldu.

Program deneme programi oldugu icin faydali bir seyler yazmaya calismadim. Program 100 kere donen bir dongu icinde once klavyeden girilen sayiyi yolluyor, sonra fpgaden gelecek datayi bekliyor. Data geldiginde ise o degeri ekrana basiyor.

Program 3 esas kisma ayrilabilir: baslangic, yazma ve okuma. Su an yazilimi anlattigim icin yazma ve okuma tanimlarini yazilimin bakis acisindan yaziyorum. Ornegin cikis dedigim yazilimdan fpga'e giden demek.

Baslangic kisminin buyuk kismini ftdi'in bilgisayara kurdugu examples klasorundeki simple.c programindan yararlanarak yaptim. Iletisim hizini, data bicimini buradan belirliyoruz. Fpga'deki program 19200 baud, 1+8+1 bit (start+data+stop) seklinde oldugu icin yazilimi da ayni ayarlarda calistiriyorum.

Yazma kismi basit. Fpga, gelecek data icin surekli hazir oldugu icin bilgisayardan data yollama isi cabuk bitti. Tek yapilmasi gereken ftdi_write_data fonksiyonunu cagirmak.

Okumak en zor ve libftdi'yi ogrenmeyi gerektiren kisim. Dokumantasyonda okuma fonksiyonu hakkinda 1 satir aciklama yapilmis. Aciklamada fonksiyon cagirildiginda data alana kadar bekliyor mu yoksa data yoksa devam ediyor mu bahsedilmiyor. D2XX kutuphanesinin dokumantasyonunda bu durumdan acikca bahsediliyor ve iki durum icin de fonksiyonun nasil kullanilacagi anlatiliyor. Samples klasorundeki serial_read.c programina baktigimda data yoksa beklemedigini anladim. Fonksiyon dogru sekilde okudugu data sayisini dondugu icin, dondugu deger 0'dan farkli olana kadar dongu icinde cagirdim.

Programi test ederken dikkatimi ceken bir sey oldu. Ftdi cipinin icinde buffer var. Eger fpga'den data yollama sirasinda 1'den fazla data yollarasaniz, bilgisayar tarafindan okunmayanlar cipin icindeki buffera kaydediliyor ve bir sonraki okuma sirasinda yollaniyor. Yazdigim programi her defasinda 1 byte okuyacak sekilde yazdim. Ola ki fpga'den bilgisayara 2 byte yollandi, bu durumda bir sonraki okuma fpga o sirada ne gonderirse gondersin bir onceki seferde ne okuduysa onu gonderiyor. Bu ozelligi yollama ozelligi icin debounce filtresi olmadigi zaman farkettim.

Bir sonraki asamada VCM (Virtual COM Port) suruculerini kullanarak ayni isi yapmaya calisacagim.

Program kodlari buradan indirilebilir.

6 Ekim 2010 Çarşamba

PC-FPGA RS232 ile iletisim - 1

FTDI cipini kullanarak libftdi kutuphanesi ve rs232 protokolu ile fpga - bilgisayar arasinda cift yonlu veri aktarimini basardim.

Bu isi yapmasi icin yazdigim program once kullanicidan bir sayi istiyor ve bu sayiyi fpga'e gonderiyor. Fpga'de bu sayi 3 ve 4uncu 7 segment ledlerde gosteriliyor. Sonrasinda program fpga'den data yollamasini bekliyor. Fpga'den data yollamak icin kart uzerindeki button 1'e basmak yeterli. Butona basinca kart uzerindeki anahtarlarla girilen 8 bitlik sayiyi bilgisayara yolluyor ve bilgisayardaki program gonderilen sayiyi ekrana basiyor. Bu sayede hem bilgisayardan fpga'e, hem de fpga'den bilgisayara veri transferi yapilabiliyor. Bu sistemin guzelligi, pc'de atik eskiyen rs232 portu yerine usb portundan veriyi yollamasi. Ftdi cipi usb'den gelen datayi rs232 formatina ceviriyor. Ayrica ftdi cipini kontrol etmek icin ozel programlara ihtiyac yok, bunun icin olusturulmus bir kutuphane var. Bu sayede herhangi bir c programinda gerekli fonksiyonlari cagirarak rs232 portunu istedigimiz sekilde kontrol edebiliriz. Bu da bilgisayarda uygulama gelistirmek icin cok buyuk bir esneklik sagliyor. Ftdi ciplerinin kutuphanesini kullanarak yaptigim bir oyunu bu bloga yazmistim. Bu linkten o yaziya ulasilabilir.

Rs232 uygulamasi icin fpga icin yazdigim kod esas olarak 3 parcadan olusuyor. Baud yaraticisi, alici ve verici. Baud hizi olarak 19200 kullandim. Rs232 protokolunde ayrica bir clock bilgisi gitmedigi icin, ornekleme noktasini hassas olarak ayarlamak icin baud yaraticisi 19200x16 Hz hizinda palsler uretiyor. Alici ve verici modulleri kendi iclerinde palsleri sayiyorlar. Her bit gonderimi 16 pals surdugu icin; verici, basla komutu geldikten sonra her 16 palste bir cikisini guncelliyor. Alici ise yeni data gonderildigini algiladigi anda ilk basta 8 pals sayiyor ki orneklemeler bitlerin tam ortasina denk gelebilsin. Sonrasinda 16 palste bir hatti okuyup datayi aliyor. Kodlari referens kitabi olarak kullandigim kitaptan esinlenerek yazdim. Kod kendimin ama algoritma kitabin. Kitabi anlattigim yaziya buradan ulasilabilir.

Bu semada fpga icindeki esas bloklarin baglanti semasi gosteriliyor.


Alici ve vericinin arkasindaki bloklar basit birer RS flip flop. Rs232 modulunu sadece bu projede tek basina kullandim, bundan sonra kullanacagim her projede rs232 modulu yan modul olarak kullanilacak. O yuzden ana modulle iletisimlerini kolaylastirmak icin yeni veri alindigini(newdata) ve o an bir veri yollandigini(busy) gosteren iki sinyal de rs232 modulunun icinde uretiliyor.

Bilgisayarda yazdigim yazilimi bir sonraki yazida anlatacagim.

Program kodlarina buradan erisilebilir.

27 Eylül 2010 Pazartesi

Saat

DE0 ile basit bir saat uygulamasi yaptim. Saniye, dakika ve saati gosteriyor. Saniye ve dakika icin 0-59 arasinda sayan, saat icin de 0-23 arasinda sayan sayaclar kullandim. Tabii ki saniye 59;dan 0'a gecerken dakika bir sayiyor, dakika 59'dan 0'a gecerken saat bir sayiyor. Butun sayaclar 50 MHz'lik clock ile calisiyor. 1 saniyede bir arttirma islemini 1 saniyede 1 clockluk pals ureten bir devre ile yapiyorum. 1 saniyede bir, saniye sayacinin count_enable pini 1 oluyor. Bu sayede saniyede 1 artmis oluyor. Sayac cikislarindaki ikili sistemdeki sayilari BCD formatina cevirdim. Bunu icin internetten binary-to-bcd converter diye aratip uygun buldugum bir kodu kullandim. BCD formatindaki sayilari 7 segment ledlerde gostermek kolay bir is. DE0'da 7 segment ledlere 1 verince led sonuyor. Bir de 4 basamagin her biri FPGA'e ayri ari baglandigi icin time-multiplexing yapmaya gerek yok. FPGA'in 4x7=28 pini bu is icin ayrilmis.

Programin kullanimi soyle. 4 tane 7 segment ledlerde saat ve dakika gosteriliyor 2'ser basamak ile. Ustteki resimde saat 1'i14 geciyor. 10 ledin ilk 4 ve son 4'u bcd formatinda saniyeyi gosteriyor. Yukaridaki resimde (0101)(0011) = 53uncu saniyeyi gosteriyor. Ortadaki iki led birbirinin degili ve saniyenin iki kati hizla yanip sonuyor. 5-0 numarali anahtarlardan girilin ikili sayi yukleme tusuna basinca (button 1) dakika yada saat hanesine yukleniyor. Dakikaya mi saate mi yuklenecegi 9 numarali anahtar ile belirleniyor. Buton 0 reset tusu ve buton 2'ye basinca da 7 segment ledlerde saniye gosteriliyor.


Saatin calismasi ile ilgili video buradan izlenebilir.

Programin kodlari buradan indirilebilir.

30 Temmuz 2010 Cuma

Yeni Kit: Altera DE0

Bozulan S3E kitimin yerine Altera DE0 kitiniz aldim. Cizgi Tagem'den 220 liraya aldim. 3 gun icinde elime ulasti. Baska herhangi bir karti bu kadar hizli teslim alamazdim.

Kutunun icinden FPGA karti, adaptoru, priz icin cevirici, usb kablosu, metal ayaklari icin plastik kiliflar ve bir iki ufak kablo cikiyor. Adaptorun ufak olmasi guzel. Hem adaptor kablosu hem de usb kablosu yeterince uzun. Kartin onunde koruma amacli seffaf plastik bir levha var. Bu levha isigi engeller, kart soluk gorunur diye dusunuyordum ama levha seffaf. Kart yine capcanli gozukuyor. Baski devre uzerindeki mavi renkli yalitim kaplamasi da kartin guzel gosteriyor. Kart, S3E karti gibi icinde test programi yuklu geliyor.

Karttaki cevre birimlerine gelince: SDRAM, flash bellek, VGA, PS/2, RS232, SD kart okuyucu, 10 anahtar, 3 pushbutton, 8 basamakli 7 segment LED, 10 yesil led var. LCD icin yer yapmislar ama LCD'yi kullanicinin takmasi gerekiyor. Genisleme yuvasi standart 0.1 inc 2x40 pin soket seklinde. S3E kiti icin aldigim hirose konnektorlu genisleme kartini bir iki degisiklikle DE0'da da kullanabilirim gibi. Genisleme kartini kullanmak istiyorum cunku bir suru PMOD kartim var.

DE0 kitinin kullanim kilavuzu ne yazik ki S3E Starter kitin kullanim kilavuzu kadar kapsamli degil. Ornek programlar da S3E kitine gore cok daha az. Altera, Altera Universite programi cercevesinde pek cok universitelere bu kitten bir suru dagitti. Ornek programlari cogaltirsa kitin okullarda kullanimini kolaylastirir.

Xilinx'ten farkli olarak Altera'nin tek tip mikroislemci yapisi var. Yani picoblaze ve microblaze gibi iki mikroislemci modulu yerine ikisini de kapsayan Nios isimli mikroislemci modulu var. Nios'un belli kisimlari ucretsiz. Kullanimi Picoblaze'in kullanimi kadar kolay degil. Bu benim gibi hobiciler icin kotu bir sey.

Altera FPGA'leri programlamak icin Quartus yazilimi gerekiyor. Tipki ISE gibi Quartus'un da ucretsiz surumu ve Linux destegi var. Quartus'u kurmak ISE'yi kurmaktan biraz daha kolay. Quartus'tan edindigim izlenim, Quartus'un ISE'den daha derli toplu bir program oldugu yonunde. ISE'nin aksine her yaptigim is icin yeni bir program calistirmiyorum. Quartus'un bir kotu yani, cok fazla penceresi oldugundan netbook'umun ekrarina sigmamasi. Anca netbook'a monitor baglayip iki monitorlu kullanabiliyorum.

Quartus'u kurma kismi kolay. Zor kisim, Linux'ta usb suruculerini kullanmak icin biraz numara cekmek gerekmesi. Bunun ilac gibi cozumu http://gunluk.muuzoo.gen.tr/2009/06/17/vhdl-bolum-1 adresinde veriliyor.

Kitin resmi sitesi:
http://www.terasic.com.tw/cgi-bin/page/archive.pl?Language=English&No=364

13 Temmuz 2010 Salı

Spartan 3E Kit Bozuk

Spartan 3E kitimin tamamen bozuk oldugunu anladim. Kartin derve semalarina baktigimda regulatorlerin yandigina karar vermistim. Harici bir guc kaynagi ile regulatorleri devre disi birakarak, karta regulatorlerin vermesi gereken voltajlari verdigimde FPGA'in kendisi cok akim cekiyor ve cok isiniyor. Bu durumda FPGA'in kendisinin bozulmus oldugunu anliyorum. Guzelim kart, bir defaligina yanlis adaptor bagladigim icin kullanilamaz oldu :(

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.