Haftasonu TVP5150 Entegresi ile video decode yapmak üzere hazırlamış olduğum PCB'yi birkaç gündür test etme fırsatım oldu. Projenin digital kısmını bir şekilde hallediyoruz ama analog kısmı hiç te sandığım kadar sorunsuz ve kolay ilerlemiyor. C64'ün video çıkışı ile ilgili bir sürü sorun ile karşılaştım. Bunların üzerine zaten analog PAL video'nun HDMI'a özellikle senkron olarak bire bir uyuşmaması eklenince ciddi anlamda gene olmayacak bu iş demeye başladım.
Nereden başlasak, normalde PAL video 625 satırdan oluşur. C64 video çıkışı ise 624 satır(mış).

Yani 624 derken, iki field halinde 312'şer satır desek daha doğru olacak. Bunu fark edene kadar FPGA'in içerisinde PLL lerden tutun da, video decoder üzerindeki kristalin kapasitörlerine kadar aklıma ne geldiyse kurcaladım. Ha bir satırın lafı mı olur diyebiliriz, ama timing tutmadığı için görüntü düşey senkronu tutmayan eski model tüplü siyah beyaz tvlerde olduğu gibi, aheste aheste ekranda düşey olarak kayıyordu... Her tarama 1 satır olmak üzere.

Neyse, sorunu bulduktan buna bir de çözüm üretmek gerekiyordu tabiki. En alta bir adet fazladan satırı FPGA ile eklemek akla ilk gelen çözüm ama bu mümkün değil. En azından donanım bu halde iken. Çünkü hatırlayın C64'te bir scanline 64uS, 64x312=19968 uS eder, yani tarama 50Hz değil, 50.08Hz.

Eğer 625 satır olmuş olsa idi tam 50Hz edecekti. HDMI çıkışımız ise tam 50Hz, yani bu şekilde olursa yavaş yavaş zamanlama kayacak. Bu soruna şimdilik çok kirli bir çözüm ürettim geçici olarak. HDMI sinyalini de biz ürettiğimiz için, düşeyde 625 progressive yerine 624 progressive satır gönderdim. Böyle birşey yapmak HDMI spesifikasyonu açısından uygun mu bilmiyorum. Muhtemelen değildir. Ama şu an test için kullandığım TV buna kızmadı ve gayet güzel tanıdı sinyali. Birkaç farklı marka modelde test edip sorun çıkarmadığını görürsem bu şekilde bile bırakabilirim.
Karşılaştığım ikinci problem ise, C64'ten gelen video sinyali entegre tarafından decode edildiğinde ortaya çıkan, line locked 27MHz PAL sample clock hiç stabil değil. FPGA içerisindeki PLL'e bu sinyali verip, HDMI pixel clock olarak ihtiyacım olan 30MHZ'i üretmeyi planlıyordum. Bu iki sinyal birbirlerine locked olmak zorunda ki frame buffer ihtiyacımız olmasın. Gelen sinyali 27'ye bölüp, 30'la çarpmam gerekiyor ama stabil oldmadığı için PLL locked kalmıyor. Ara ara lock kaybediyor ve görüntü kayıyor vb... Esasen buna da henüz bir çözüm üretemedim. Hiç istemiyorum ama bu 27MHz'i 30MHz'e çıkarmak için, FPGA dışında bir PLL devresi tasarlamak gerekebilir günün sonunda. Peki ben ne yaptım, bu 27MHz sinyali doğrudan HDMI pixel clock olarak kullandım. Tabiki bu durumda normalde 30MHz olması gereken HDMI clock 27MHz düştüğü için, frame rate değişti. Senkronizasyonu sağlamak için gene HDMI formatını birazcık çekiştirdim, yatayda gönderilen pixel sayısını düşürerek 27MHz ile 50HZ olmasını sağladım. Yatayda 968 pixel göndermem gerekirken 864 pixel gönderince 27MHz ile 50Hz yi tutturmuş oldum. Tabiki bu gene standart bir uygulama olmadığından farklı model TV'ler de denemesi şart. En kötü seneryo dediğim gibi external bir PLL devresi olacak.
Bir üçüncü ve henüz tam olarak çözüm bulamadığım problem ise şu. Video decoder entegresinin S-Video veya composite girişleri var. İlk başta composite sinyal giriyordum. Ancak nedense entegre C64 sinyali ile beslendiği zaman 27MHz sample clock'u neredeyse hiç üretemiyor. Devrede hata olmadığından emin olmak için başka bir kaynak bağladığımda ise hiç problem yaşamıyorum. Bunun nedenini henüz anlayamadım. C64'ün video çıkışının elektriksel olarak standartların biraz dışında olmasından şüpheleniyorum. Neyse, eğer C64'ten gelen sinyali composite değilde, Luma veChroma (S-Video) olarak alıp entegreyi beslediğimde bu sorun büyük ölçüde ortadan kalktı. Aslen bu şekilde kullanmak zaten benim hedeflediğim bir durum du, zira görüntü compositeden daha kaliteli olacak. Ama bu arabirimin standart bir ürün olmasından yavaş yavaş uzaklaştırıyor bizi bu C64'e has çözümler. Neyse şimdilik bu problem de aşılmış görünüyor.
Karşılaştığım son problem ise, C64'ten gönderilen düşey senkron darbeleri ile ilgili. Her nedense video decoder entegresi C64 çıkışındaki bu senkron darbelerini Non-Standart olarak algılıyor. Eski video kayıt cihazları da hızlı ileri geri sarıldığında bu tür non-standart senkron üretirmiş. Entegrenin bir özelliği de bunları algılayıp, ona göre davranmak. Ama bizim sinyal non-standart olmadığı halde non-standart olarak algılanınca, özellikle ekranın üst kısmı, yani düşey senkronden hemen sonraki bölüm, sağa sola dalgalanıyor. İlk başka bunu çözemedim. Sonra farkettim ki elimdeki entegrede bir registeri set ederek Non-Standart detection özelliğini kapatmak mümkünmüş. Bunu özelliği de kapatınca titremeyen bir görüntümüz oldu.
Şimdilik bütün çalışma sadece Luma kanalı üzerinde yapıldı. Henüz Chroma kanalını sample etmeye başlamadım. Çalışma mantığı şu şekilde, decoden edilen video sinyali içerisindeki yatay senkron detect edildiği anda bir counter sıfırlanıyor. 27MHz lik sample clock geldikçe bu counter arttırılıyor. Bu counter FPGA içerisinde yaptığım bir RAM'in adres bus'ı olmuş oluyor. Decode edilen video sinyalindeki Luma bilgisini de aynı RAM'in data bus'ına bağladım. Bu sayede gelen sinyale ait tüm satır capture edilip RAM içrisine alınmış oluyor.
HDMI Transmitter tarafı ise eski kod ile aynı. Kendi içerisinde bir x değeri var ve pixel clockla senkron bir şekilde arttırılıyor. Her bir clock darbesinde, yukarıda sözünü ettiğim RAM'den bir byte read ederek, bunu x10 clock hızında bit bit seri olarak HDMI'a gönderiyor.
Şimdilik elde ettiğim görüntü aşağıda. Görüldüğü üzere sadece Luma kanalı çalışıyor. Bir miktar düşey gürültü mevcut. Bunu biraz filtrelemeyi deneyeceğim. Henüz 4 bit vb işlerine geçmedim. Ama scanline effect devrede ve açıkçası ben bu görüntüyü çok sevdim. Bu halde, renksiz bile doğrudan TV'ye bağlayarak aldığım görüntüye tercih ederim.


Bu işleri gerçekleştirdiğim test setup ise aşağıda. Burada hesapta olmayan bir de PIC var. (Board üzerindeki devre) Bunu video decoder entegresindeki bir kaç registeri I2C üzerinden konfigüre etmek için kullandım. Aslında bu kısım FPGA içerisine yazılabilir proje bittiğinde. O zaman PIC'e gerek kalmayabilir.

Şimdi sırada biraz filtreleme ve renk kanalı ile ilgili çalışmalar var...
EDIT: Ekran görüntüsünü post edince boyutu küçülmüş detaylar görünmüyordu. Biraz daha büyük halini de ekliyorum.
