For english version http://dincaysroom.blogspot.com (Not complete yet)
7 segment etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster
7 segment etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster

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.

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.

3 Eylül 2009 Perşembe

Multi LED

3 renkli multi led aldım. RGB led de deniyor. Multi ledin kırmızı, yeşil, mavi ledlerini farklı şiddetlerde yakarak farklı renkler oluşturmak mümkün. Örneğin kırmızı ve mavi en şiddetli hallerinde mor ışık yayıyor. FPGA'de bu şiddeti ayarlamanın en iyi yolu PWM kullanmak. PWM olarak kullanılacak kare dalganın görev çevrimini değiştirerek ledlere analog gibi davranan bir sinyal vermek mümkün.

Şu an giriştiğim projenin amacı multi leddeki 3 rengin şiddetlerini ayrı ayrı kontrol eden ve 3 rengin PWM sinyallerinin görev çevrimini LCD ekrana yazan bir modül yapmak. Kendime belirlediğim ilk aşama pwm sinyalini üretmek ve görev çevrimini dışarıdan değiştirmek. İkinci aşama da 3 renk için görev çevrim sürelerini LCD ekranda göstermek.

0-255 arası sayabilen bir sayaç ve her renk için bir register var. Sayaç registerdan küçükken o renk sinyali 1 oluyor. Register değerini 0'a yaklaştırınca sayaç daha kısa bir süre register değerinden küçük kalıyor. Bu sayede görev çevrimi ayarlanabiliyor. Aynı işi 3 renk için de yapıyorum.

Registerları döner kodlayıcı ile değiştiriyorum. Bir düğme ile de seçili rengi değiştiriyorum. Seçili rengin değeri 7 bölmeli ledde gösteriliyor. Hangi rengin seçili olduğu ise kartın üzerindeki ledlerde gösteriliyor.

Devrenin bir kaç görüntüsü
Multi ledin içindeki ledler seçilemesin diye ledin çevresine peçete sardım. Bu sayede multi ledin içindeki farklı renkteki ledleri ayırt edemiyorum. Karşılaştığım bir sorun, ledler aynı akıma farklı ışıma verdikleri için her renk için akım sınırlayıcı dirençleri farklı seçmek gerekiyor. Yoksa farklı parlaklıkta yanan ledler oluyorlar. Bunu ölçmenin yolu 3 rengi de son şiddette yakmak. Sonuç tam beyaz olmalı.

Bundan sonra LCD ekranda değerleri göstermek var. Bunun için PicoBlaze kullanmayı düşünüyorum.

Program koduna buradan ulaşılabilir.

11 Temmuz 2009 Cumartesi

Döner Kodlayıcı

Döner kodlayıcı modülünü bitirdim ve önceden yaptığım ileri geri sayan programa ekledim. Program döner kodlayıcı saat yönüne döndükçe ileri, ters yöne döndükçe geri sayıyor.

Döner kodlayıcı modülünü önce kendi bildiğim gibi yapmak istedim. Zıplamaları filtrelemek için 2 tane zıplama önleyici modülü kullanmak istemedim çünkü çok verimsiz bir yol. 2 tane 22 bit register kullanılacak. Onun yerine kendim durum makinası yaptım. Bu şekilde yaptığım modül doğru çalışıyor. Fakat tüm zıplamaları filtrelemek için 9 durum tanımlamak zorunda kaldım. Xilinx'in kendi referans tasarımını düşününce yine çok. O yüzden Xilinx'in referans tasarımını kullanmaya karar verdim. İki tasarım da program kodlarında var.

Döner kodlayıcı modülünü Xilinx'in referans tasarımını biraz değiştirerek yaptım. Referans tasarımına http://www.xilinx.com/products/boards/s3estarter/files/s3esk_rotary_encoder_interface.pdf adresinden ulaşılabilir. Referans tasarımında dönme olduğunu gösteren ve dönmenin yönünü gösteren 2 çıkış var. Ben bunları saat yönünde dönme olduğunu ve saat yönünün tersinde dönme olduğunu göstercek şekilde değiştirdim. Ayrıca modülün iç kısımlarını da kısalttım. Şimdi daha şık duruyor.

Xilinx'in referansında bir hata var. Döner kodlayıcının anahtarları normal durumda devre şemasına göre 1 konumunda (pull-up direncinden dolayı) ama osiloskop ekran görüntüsü 0 olduklarını gösteriyor. Doğru olan şemada gösterilen şekil. Karttaki LED'lerden iki tanesi anahtarların durumunu gösteriyor, normal durumda ikisi de 1. Modül girişleri senkron yaparken bu durumu da düzeltiyor, girişlerin tersini alıyor.

Karttaki LED'lerden iki tanesi döner kodlayıcıdaki iki anahtarın durumlarını gösteriyor. Şaftı çevirirken anahtarların durumlarının değiştiğini gözlemleyebiliyorum. Gerçekten eğlenceli.

Çevre birimleri arasından bir tek LCD ekran kaldı. LDC ekranın modülünü de yaptıktan sonra kendi tasarımlarımı yapmaya başlayabilirim.

Döner kodlayıcı modülüne buradan ulaşılabilir.
Verimsiz döner kodlayıcı modülüne buradan ulaşılabilir.
Program kodlarına buradan ulaşılabilir.

2 Haziran 2009 Salı

İlk program

Yapmayı düşündüğüm programı bitirdim. Program, zıplama önleyicisi ve 7 bölmeli LED sürücüsünü test etmeye yarıyor. Her tuşa basılınca LED'lerdeki sayı bir artıyor. Eğlence olsun diye azalma özelliği de ekledim. Bir anahtar sayma yönünü belirliyor. Bu programı yazdığım çok iyi oldu. Çünkü zıplama önleyicisinde ve LED sürücüsünde önemli hatalar varmış. Şimdi ikisi de çatır çatır çalışıyor. İnternete koyduğum dosyaları da düzelttim.

Zıplama önleyiciye, düzgün simulasyon yapabilmek için reset ekledim.

LED sürücüde basamakların yerleri tersti ve 4 rakamını yanlış basıyordu. İkisini de düzelttim.

Kart kutusundan çıktığında programlama jumperlarının üçü de takılıydı. Bu sayede kartı açar açmaz kart, prom'daki programı kendine yüklüyordu. FPGA'i USB'den programlamak için jumperları sadece ortadaki kalacak şekilde yapmak gerekiyor. Bununla ilgili kullanım kılavuzunda açıklama var.

Program kodlarına buradan ulaşılabilir.

Sayma işlemini tuşla değil de döner kodlayıcı ile yapmak istiyorum. Bir dahaki programda döner kodlayıcıyı kullanacağım. Üstelik döner kodlayıcı için de bir modül yapmış olurum.

29 Mayıs 2009 Cuma

Kart Geldi

Sonunda kartım geldi. 26 Mayıs salı günü elime ulaştı. Buraya yazabilmek için anca vakit bulabildim. Kartı Xilinx'in Türkiye distribütörü Empa Elektronik'ten aldım. Fiyatı 190$+KDV. KDV dahil 350 YTL etti. Sipariş formunu imzaladıktan sonra 4 buçuk haftada elime geçti kart.

Kit kutu içinde geldi. Güzel bir kutusu var.

İşte kartın fotoğrafı

Kartın 1.5 m'den uzun USB kablosu var ama adaptör kablosu 1 m'den kısa. Prizlerin, USB girişlerine göre daha zor ulaşılabilir yerlerde olduğunu düşününce adaptör kablosu çok kısa. Kartı masaya koyduğumda; priz, yerde kartın tam altında değilse adaptör kablosu yetmiyor. Bu yüzden uzatma kablosunu bilgisayar kasasının üstüne koymak zorunda kaldım.

Korktuğum hirose konektörü. Korktuğum kadar varmış. Bu konnektörden hayatta bağlantı alamazdım. İyi ki eklenti kartını almışım.

Eklenti kartı ve 7 segment display ile görüntüsü. 7 segment, hirose konnektörün altındaki sokete de takılabiliyor ama hirose kartı takılı değil iken.

Kitin içinde iki tane referans kitabı çıktı:
  • Introduction to Programmable Logic
  • EDK Concepts, Tools and Techniques
Introduction to Programmable Logic kitabında, Xilinx FPGA ve CLPD'leri ve Webpack programını anlatıyor. Spartan serisi için en son Spartan 2E'lerden bahsediyor. Webpack'in de 6 sürümü üzerinden anlatıyor. Kitabın güncellemeye ihtiyacı var.

İkinci kitapta Embedded Design Kit'ini anlatıyor. EDK hakkında çok bilgim olmadığı için bu kitap hakkında pek yorum yapamayacağım.

Aldığım kitin kullanıcı rehberinin çıkmaması hoş değil. Bunu kendim kitap haline getireceğim artık.

Kitten 3 cd çıktı.
  • Spartan 3 Customer Resource CD
  • Xilinx 9.2i Design Tools Evaluation DVD
  • Embedded Development Kit DVD ve ISE 9.2i DVD
ISE'nin 11 sürümü çıkmışken kitin içinden 9.2 sürümü çıkıyor. Üstelik 2 tane. Hoş değil.

Spartan 3 Customer Resource CD'sinde bir sürü pdf var. İnanıyorum ki hepsini Xilinx'in sitesinden indirebilirim.

Design Tools Evaluation DVD'sinde ISE, webpack Chip scope gibi programlar var. Ama hepsi 9.2 sürümü. Şu sıralar işime yarayacak sadece webpack. Onunda 10.1 sürümünü kullanıyorum. Şu an işime yaramaz bir cd.

EDK DVD'sinde, ne olduğunu yeni yeni öğrenmeye başladığım gömülü tasarımdan bahsediyor.

Kitten çıkanlar hakkında bu kadar.

Kartın her tarafı açıkta olduğu için ESD tehlikesi var. Bunun için aklıma gelen ilk şey adaptör toprağına bir kablo bağlayıp ara sıra bu kabloya dokunmak. Şimdilik böyle idare edeceğim. Belki ileride ESD korumalı masa örtülerinden alırım.

Kartı çalıştırdığımda, kart üzerindeki flash bellekte saklanan program yükleniyor. Bu program test programı. LED'leri, döner kodlayıcıyı , tuşları ve LDC ekranı test ediyor. Bende hepsi düzgün çalışıyor. Bu program http://www.xilinx.com/products/boards/s3estarter/files/s3esk_startup.zip adresinden indirilebilir. Benim için kötü yanı vhdl ile yazılmış olması.

Kartla ilk yapmak istediğim 7 segment ile zıplama önleyiciyi denemek. Bunun için programı yazmaya başladım. Her şey bittiğinde buraya yazacağım.

25 Mayıs 2009 Pazartesi

Sık kullanılacak modüller

Kartım hala gelmedi. Kart gelene kadar kullanacağım garanti olan bazı modülleri yazayım dedim. Kartta kullanacağım garanti olan hangi modüller var?
  • 7 bölmeli LED (Pmod kartım sayesinde 7 bölmeli displayim var)
  • Düğmeler için zıplama önleyicisi (Debouncing circuit)
  • LCD kontrol
  • SDRAM kontrol
Kolaydan zora doğru sıraladım. SDRAM kontrol modülü yazmak çok zordur. Sürekli yenileme yapmak, okuma yazma protokolleri, gerekli zamanlama (timing) koşullarına dikkat etmek... Neyse ki Xilinx'in SDRAM için hazır kontrolörü var. http://www.xilinx.com/support/documentation/ip_documentation/opb_ddr.pdf adresinden kontrolörün dökümanına ulaşılabiliyor. Kendisini nasıl bulabiliriz, hiç ilgilenmedim ama ona da sıra gelecek.

Başlangıç olarak 7 bölmeli LED ve zıplama önleyici modülü yaptım. Basit modüller oldukları için ayrıntılı açıklama yapmıyorum.

7 bölmeli LED display modülüne 2 adet 4 bitlik data girişi var. Datada kaç varsa 16'lık düzende LED'lerde gösteriyor. Zaman çoğullamasını kendi yapıyor. Tabii bu yüzden clk lazım. Bir de reset pini olmalı ki modülü kapatabilelim.

Zıplama önleyicinin espirisi, tuşa basıldıktan belli bir süre geçene kadar kendini tuştan gelen sinyale kapaması. Sinyalde bir değişikli olduktan sonra 50 ms çıkışı sabit tutuyor. İnsan eli bir tuşa saniyede 20 defa basamayacağı için bir problem yok. Bekleme süresi 1 saniye olursa tuşa basıp hemen çekilince tuş 1 saniye basılı kalır. Tuşa basılı tutarken bırakıp geri basılırsa 1 saniye bırakılmış kalır. Bir de, asenkron bir giriş olduğu için sinyali bir flip floptan geçirerek kullanmak lazım. Yoksa kararlılık (stability) problemleri çıkabilir.

Kartım gelince ilk bu ikisini deneyeceğim :)

Dosyalar: sevensegment.v, debouncer.v