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.