Bagaimana cara membuat klon Ambilight berbasis FPGA?

10

Beberapa latar belakang cepat:
Ambilight adalah sistem pada beberapa TV Philips yang menganalisis informasi warna pada layar dan kemudian menetapkan beberapa LED di bagian belakang layar untuk memproyeksikan warna layar ke dinding. Ini adalah efek yang sangat bagus. Ada klon dari sistem ini di luar sana sekarang yang menggunakan PC untuk memproses video dan mengontrol LED. Saya menemukan ini sedikit berlebihan - menggunakan seluruh mesin untuk menari beberapa LED ...

Saya ingin memodifikasi NeTV kelinci untuk memproses yang tidak terenkripsiUmpan video HDMI dan kendalikan beberapa LED. Saya tahu NeTV telah dirancang untuk tujuan lain, tetapi saya merasa itu dapat dimodifikasi untuk mencapai tujuan saya. Saya tidak peduli dengan subsistem Linux yang mendasarinya, spoofing I2C, overlay video, dll. Pada titik ini, saya tidak peduli dengan bekerja dengan aliran terenkripsi HDCP.

Skema NeTV

Kode sumber NeTV

Diagram Blok FPGA Diagram Blok NeTV
Ini adalah diagram blok dari salah satu slide presentasi kelinci.
The sisa set slide di sini .

Slide menampilkan HSYNC, VSYNC, PIXCLK
Slide ini tampaknya menyiratkan bahwa piksel video sebenarnya didekodekan (tidak harus didekripsi ) .

Akhirnya ... beberapa pemikiran dan pertanyaan saya:

  1. Apakah ini dapat dilakukan pada perangkat keras yang saya inginkan? Jika "ya", lanjutkan! Jika "tidak", katakan padaku apa lagi yang aku butuhkan!

  2. Apakah saya dapat memproses informasi video tanpa memori eksternal? Tidak ada memori yang dapat diakses FPGA secara langsung, sejauh yang saya tahu. Ini mungkin tergantung pada algoritma apa yang saya gunakan untuk memproses data video - untuk menggunakan RAM FPGA Block sesedikit mungkin, saya kira saya ingin menggunakan semacam 'penjumlahan berulang' dari piksel yang masuk, daripada menyimpan keseluruhan bingkai data gambar dan kemudian rata-rata warnanya. Adakah petunjuk terkait penerapan algoritma ini? Bagaimana memulainya dengan ini adalah rintangan terbesar saya.

  3. Saya telah menyelidiki kode sumber tentang di mana saya harus 'memanfaatkan' data video.
    Ini terlihat seperti tempat yang tepat:
    Block Diagram dari Decoder DVI
    Saya tahu, gambar ini panjang - itu yang terbaik yang bisa saya lakukan sambil membuatnya jelas untuk dibaca. Salahkan alat Xilinx untuk itu!
    Ini tampaknya mengambil data TMDS dan output 8-bit untuk setiap warna.

  4. Saya harus memiliki semacam mesin negara untuk driver LED - setiap siklus jam, ia mendapat info pixel dari modul apa pun yang saya buat untuk memproses data video.

Maaf jika ini bertele-tele atau panjang - saya mencoba untuk lebih teliti ... Saya hanya butuh bantuan untuk menyelesaikan masalah ini. Ini adalah upaya pertama saya di proyek FPGA - beberapa mungkin mengatakan itu terlalu sulit untuk pemula tapi saya katakan ... harus mulai di suatu tempat :) Terima kasih telah membaca.

dext0rb
sumber
1
NeTV tidak men-decode aliran HDMI. Ini mengikuti proses negosiasi HDCP dan mengenkripsi aliran baru untuk mencocokkan; Saya rasa Anda tidak akan bisa mendapatkan informasi video dari ini.
akohlsmith
Bisakah Anda memposting (tautan ke) skema yang relevan? Juga, deklarasi modul HDL yang relevan akan membantu.
drxzcl
1
@AndrewKohlsmith, jadi overlay dilakukan di ujung TV? Wow, saya tidak tahu HDMI bisa melakukan itu!
drxzcl
1
Saya tidak yakin apakah Anda akan dapat melakukan semua yang Anda butuhkan tanpa menggunakan buffer bingkai memori eksternal, tetapi bagaimanapun, analisis warna apa yang Anda rencanakan untuk digunakan? Jika FFT, maka itu akan memakan waktu dan saya tidak yakin apakah cahaya sekitar tidak akan terlambat ke warna video. Saya katakan pertama kali mencoba untuk mendapatkan data dari HDMI dan periksa apakah Anda dapat menganalisisnya. Misalnya lakukan filter low-pass dan output hasilnya.
Socrates
1
Saya ingat membaca ini kembali ketika NeTV keluar. Menurut posting itu, Bunnie menggunakan skema overlay rumit yang tidak perlu mendekripsi sumber HDMI; dia hanya mengenkripsi ulang bila perlu. Tidak ada decoding aliran terenkripsi.
mng

Jawaban:

7

Saya mendasarkan jawaban saya sepenuhnya pada kode dan dokumentasi modul dvi_decoder , dan menganggapnya benar-benar berfungsi seperti yang diiklankan. File ini tampaknya merupakan salinan (dimodifikasi?) Dari IP dalam catatan aplikasi Konektivitas Video Menggunakan TMDS I / O di Spartan-3A FPGA dan / atau Menerapkan Antarmuka Video TMDS di Spartan-6 FPGA . Catatan aplikasi ini penuh dengan detail penting, dan saya sarankan Anda membacanya dengan cermat.

Seperti yang Anda tunjukkan dalam pertanyaan, saya akan menganggap Anda memperlakukan aliran yang tidak terenkripsi, yaitu aliran non-HDCP. Saya cukup yakin bahwa informasi dalam proyek NeTV dapat diadaptasi untuk mendekripsi HDCP, tetapi itu akan melibatkan sejumlah pekerjaan tambahan yang tidak sepele dan dengan alasan hukum yang dipertanyakan tergantung pada yurisdiksi Anda.

Sepertinya Anda akan dapat memperoleh data yang Anda butuhkan dari output blok dvi_decoder. Blok menghasilkan informasi warna 24-bit menggunakan kabel red, greendan blue, disinkronkan ke jam piksel pclk. Output hsyncdan vsyncmemperingatkan pengguna ke ujung garis / layar masing-masing. Secara umum, Anda harus dapat melakukannya dengan rata-rata menggunakan output ini.

Anda akan memerlukan logika dasar untuk menerjemahkan hsync, vsyncdan jam piksel menjadi lokasi (X, Y). Hanya instantiate dua counter, satu untuk Xdan satu untuk Y. Kenaikan Xsetiap jam piksel. Setel ulang Xmenjadi nol pada hsync. Kenaikan Ypada setiap hsync. Atur ulang Yke nol di setiap vsync.

Menggunakan red, green, blue, Xdan Y, Anda dapat melakukan pada rata-rata fly. Dengan membandingkan dengan Xdan Y, Anda dapat menentukan kotak apa yang masing-masing piksel harus berkontribusi, jika ada. Jumlahkan nilai warna ke dalam register akumulasi. Untuk mendapatkan nilai rata-rata, Anda perlu membagi nilai dalam register dengan jumlah piksel. Jika Anda cerdas, Anda akan memastikan jumlah piksel adalah kekuatan dua. Kemudian Anda bisa mengirimkan MSB register ke apa pun yang ingin Anda kendarai.

Karena kami ingin menggerakkan display saat melakukan akumulasi, kami perlu melakukan buffering ganda. Jadi kita akan membutuhkan dua register per kotak per komponen. Jika Anda menggunakan string 25-led, ini berarti Anda akan membutuhkan 25 * 3 * 2 = 150 register. Itu agak sedikit, jadi Anda mungkin ingin menggunakan ram blok alih-alih register. Itu semua tergantung pada kebutuhan Anda, percobaan!

Saya berasumsi Anda akan mengendarai string yang dipimpin seperti yang digunakan dalam kit proyek AdWords asli . Anda harus bisa mengetahui cara mengusirnya dari nilai-nilai di register dengan cukup mudah menggunakan SPI.

Modul dvi_decoder adalah perangkat kit yang cukup kompleks. Saya sarankan Anda mempelajari catatan aplikasi secara rinci.

Selain itu, jika Anda belum membeli NeTV untuk digunakan dalam proyek ini, saya sarankan Anda juga melihat papan Atlys Digilent . Dengan dua input HDMI dan dua output HDMI, tampaknya dibuat khusus untuk proyek semacam ini.

drxzcl
sumber
NP, terima kasih untuk pertanyaan kerennya. Jika Anda mengalami masalah spesifik dengan proyek ini, jangan ragu untuk memposting lagi.
drxzcl
Btw, (dan ini sedikit di luar lingkup pertanyaan) apakah Anda pernah mempertimbangkan untuk mengemudikannya dari sistem mikrokontroler yang relatif gemuk? Sesuatu seperti RaspberryPi sekitar 6 kali lebih murah dan harus dapat mengarahkan led dan menampilkan video pada saat bersamaan.
drxzcl
masih menunggu alat JTAG saya untuk masuk sehingga saya bisa debug dengan ChipScope ... akan menerima jawaban ini; itu menjabarkan pendekatan mendasar untuk memecahkan masalah ini. @drzxcl saya sudah punya netv di tangan saya. RaspPi adalah saran yang menarik, tetapi mustahil menggunakan HDMI sebagai sumber video.
dext0rb
Apakah Anda pernah berhasil ini? Saya ingin melihat tulisan / video!
drxzcl
Tidak terlalu. : | Saya membuat driver LED setengah-setengah , tetapi belum punya waktu untuk membahasnya lebih lanjut. Semoga secepatnya.
dext0rb