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

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.

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.

16 Haziran 2009 Salı

Booth - Wallace ve Shift - Add Multiplier

Aldığım dijital VLSI tasarım dersinin projesi olarak 2 farklı çarpma devresi yaptım. Amaç bunları karşılaştırmak ama ben o kısmı geçiyorum. Bu iki devreden booth-wallace çarpma devresi kombinasyonel çarpma yapıyor. Yani clocka ihtiyacı yok, içinde DFF yok. Ama bu yüzden çok sayıda kapıdan oluşuyor. FPGA'in çok kaynağını tüketecektir.

Asıl anlatmak istediğim shift-add çarpma devresi. Bunun hoşuma giden yanı algoritmik akış şemasından (ASM - Algoirthmic Flow Chart) yola çıkarak kodu yazmış olmam. Internette pek çok yerde ve pek çok dijital tasarım kitabında bu ASM bulunabilir. Ben kullanımını rahatlatmak için küçük bir değişiklik yaptım. İşte ASM akış şeması

Normalde shift-add çarpma devresi 3 durumlu. En sona END durumunu ekledim. Start bitini 1'de unutunca çarpmaya devam etmesin. Çünkü çarpmaya başladı mı arada durdurulmuyor. Durum değişkeni için 2 bit kullanıldığı için 4. durumu oluşturmak donanım olarak da yük getirmiyor.

Esas modülde 3 always bloğu var. Biri sonraki durumu şimdiki durum yapan tek satırlık blok. Diğeri next_state için; bir sonraki duruma karar veren blok. Sonuncusu ise aritmetik işlemleri yapan blok. Always bloklarını bu şekilde ayırmak kodun yazılabilirliğini ve okunabilirliğini çok arttırıyor. Bu programlama tekniği aldığım verilog kitabında kullanılıyor.

En tepedeki modülü, çarpma modülünü kullanabilmek için yazdım. Spartan 3E Starter Kit'teki anahtar ve düğmelere göre sayı girme yöntemi belirledim. Karttaki 4 anahtar, 4 bitlik bir sayıyı gösteriyor. Batı düğmesi giriş tuşu. Ona basınca anahtarlardaki 4 bit sayı girilmiş oluyor ve 8 ledin ilk 4ü bu sayıyı gösteriyor. Aynı işlemi bu defa 2. sayı için yapıyorum. Bu sayede 2 tane 4 bitlik sayı girmiş oluyorum. Güney düğmesi çarpma modülünün "start" girişi. Ona basınca da 2 sayının çarpımı 7 segment ledlerde gözüküyor.

Shift-Add multiplier kodları buradan indirilebilir.

Booth-Wallace kodları buradan indirilebilir. Booth-Wallace çarpma modülünü karta uygun hale getirmeye uğraşmadım. Sadece algoritma hali var.

Booth-Wallace algoritması hakkında kaynak
http://www.eecs.tufts.edu/~ryun01/vlsi/index.htm

13 Haziran 2009 Cumartesi

Verilog Sunumu

Okulda bu dönem 3. sınıflara verilog sunumu yaptım. Slaytlarda çok yazı yok, sunumda anlattığım şeylerin özetini içeriyor. En azından biraz dijital elektronik, biraz da mantık tasarımı bilen ama verilog hakkında hiç bir şey bilmeyen birine nereden başlaması gerektiğini hakkında bilgi verebilir. Zaten anlattığım insanlar da ilk defa verilog gören kişilerdi. Sunum buradan indirilebilir.