「PIC AVR 工作室」サイトの日記的なブログです。
サイトに挙げなかった他愛ないことを日記的に書き残してます。
PIC AVR 工作室 ブログ



相変わらずVHDLでカラービデオ表示しちゃおうという話。

もうちょっとだけ進みました。とりあえず8色表示っぽい
ところまで行きました。


テレビ画面で見る色と、キャプチャーで取り込んだPC画面
ではずいぶん色が違っちゃっているんですが、テレビ画面
では黄色はもっとレモン色っぽく、水色ももっと薄く、
紫はもう少し赤寄りで、赤は物凄く茶色っぽく映ってます。

いずれにしても少々ずれた色と輝度です。


そして相変わらずのチラチラノイズ。


10ビットデータのsigned、unsignedの問題は、判別式に
直接「負数の場合」を条件に加えて済ませました。
その結果、ちゃんと赤や青も出るようになりました。

キャプチャー画面では色と色の間にノイズっぽいのが
載ってますが、実際のテレビ画面ではそんなことは無く、
綺麗に出ています。
S信号でテレビに表示して、テレビからコンポジットで
ビデオキャプチャに繋いでいるからかなぁ?


いずれにしても、XC9536XLではこの程度が限界かな。
ちょっと弄るともうフィッティングでエラー出ちゃう。
ノイズのチラチラだけ消せれば凍結にしたいところ。


あとは、もう少し大きいCPLD使って、CPLD内部
でY、C混合してコンポジット出力にする方を進めたいな。


それにしても、このノイズは一体どこからくるんだろう?



コメント ( 0 )




色が上手く出ずに白黒になっちゃってた件。
ひとまず色だけは出るようになりました。

原因はさっきの日記の(3)だったようです。
この点についてVHDLを修正したらカラー
表示されるようにはなりました。

バースト信号の角度は水平同期でリセット
かけてはダメで、フリーランさせる必要が
あるようです。

その他色々有るんですが、

ひとまずこんな感じで色が出ました。
Sビデオ信号です。

まだ色々難点があるんですが、それはまた後で
纏めます。

とりあえずC信号さえ出ちゃえば、コンポジット
も出来たも同然なので、Sビデオ信号をもうちょっと
ちゃんと出すようにします。


(追記)
いま認識している問題は以下のとおり。
 ・紫までしか表示されない
 ・ノイズがちらちら走る
 ・5ビットDACは誤差がデカイ
 ・XC9536XLの容量ギリギリ状態
以上4点。


紫までしか表示されない原因は判りました。VHDL内部
で持っているドットクロックをカウントする10ビット
カウンタの「符号」でした。

バースト信号を表示するタイミングかどうかを判断する
ために、不等号で大小判断を行っているんですが、
現在はsignedのライブラリを使っているので、
512を超えると負数になってしまい、大小判断を
誤っているんですね。

簡単に直すなら、カウンタを1ビット増やせばいいんですが、
規模的にどうかな…

そもそもなぜunsignedじゃなくsignedをつかったのかと
言うと、Y信号とC信号をCPLD内部で合算して
コンポジット出力するための布石でした。

まぁ、バージョンを分けちゃったので、このSビデオ
バージョンについてはunsignedライブラリに変えちゃう
手もありますが…あとで考えます。


ノイズがちらちら走る点。これは良くわからないなぁ。
ちらちら載るノイズの色からすると、丁度90度ずれた
色が載っている感じなんだけど…
もしかしたら3.3Vでオシレータを動かしている
のが悪さしているのかも。規格外だからなぁ…
発振が安定していないんじゃないかな?
オシレータを5Vで発振させても、XC9536XLは5V
トレラントだから動くはず。ひとまずはその方向かな?


そして5ビットDACの誤差の点。発色が少々不正確。
まぁ、少しくらいは仕方ないですな。どうしてもと
言うのであれば、あと1ビット増やして、1ビットあたり
約0.025V単位のDACにしたら良くはなりそうですが…。
規模がね。

でもやっぱり、水色が緑っぽくでちゃうのはなぁ…
出力するビットパターンを工夫したら、5ビットDACの
ままでももう少し青系に寄せられるかな?


最後にXC9536XLの容量ギリギリ状態の件。これは
実際問題結構厳しい…
PACEで自由自在にピンを配置しちゃうと、product
termsがいっぱいいっぱいでNG。

なので、一部のピンは明示指定せずコンパイラに
自動アサインさせたんですが、それで辛うじて
入った感じ。
(そのせいで、C信号の5本の出力があちこちに
 ちらばってしまいましたが…)
ちょっと修正したら、それだけで入らなくなる可能性も。
うーむ。


それにしても、ドットの解像度は今ひとつですが、
発色は見事かな。しかもビデオアンプなどの類を一切
使わず、数本の抵抗介してCPLDとテレビを直結
ですからねぇ。お手軽でいいかんじ。



コメント ( 0 )




昨日の続き。RGB信号をCPLDでカラー
コンポジット信号に変換する機能がなんとなく
上手く動いていないことについて。

バグかと思っていたものがokっぽいことが
わかりました。バースト信号の生成処理についてです。
CXA1645のデータシート見ていて判明。
http://pdf1.alldatasheet.com/datasheet-pdf/view/46646/SONY/CXA1645.html

データシート11ページに、シンクロ信号の入力と
バースト信号の出力について纏めた挿絵があったんですが、
これを眺めると、等価パルスの最中にもバースト信号を
生成してしまってます。内部のブロック図を見ると
私のVHDLと似たような処理をしているっぽいので、
まぁ、考えることはいっしょということでしょう。
なにしろ、この方が規模が小さくて済むので。

なので、これを除外。


昨日考えたことも含めて、想像できる幾つかの原因を
列挙してみます。

(1)TINY2313が出力する水平同期信号の幅
(2)14.318Mhzのクロック精度
(3)C信号にLPFが必要?
(4)動作電圧


まず(1)ですが、15.734khz(約63.5us)でちゃんと
出力しないといけないのかな?という話。そんなことも
無いんじゃないのかなぁ?CXA1645だって少しくらい
周波数がずれても、ちゃんとカラー表示できるはず。
多分問題なし。

次に(2)ですが、表示された画面を見る限り14.318Mhz
の1/4…約3.58Mhzで縞模様が載っている様子を見ると
発振周波数は多分問題なし。

次に(3)ですが、C信号とLPFについて調べていて
この情報にあたりました。LPFとは直接関係ないですが、
http://fpgapark.com/ntsc/ntsc.htm#top
このページの「ステップ3」という所に似たような
症状が書かれています。
水平同期でサブキャリアの角度をリセットすると
色が出ずに輝度が変わる…と。
うーん、十分考えられる原因だよなぁ…

サブキャリアをたった9個の波のバースト信号で正確に
ロックし直すっていうのがなんとなく心に引っかかって
いたんですが、バースト信号のクロックにリセットを
かけずに、常時フリーランさせておけば納得も行くと
言うもの。
逆に、ロックが上手く行かなければカラーキラーが
働いて白黒になっていると考えれば合点もいきますし。

ドットクロックカウント用のカウンタと、サブキャリア
の角度カウント用カウンタを当初の考えどおり「分けて」
設ければいいのかな。
これは十分に試す価値あり。

最後に(4)について。そもそもですが、今回の発振元
には5V用のオシレータ(14.31818Mhz)を使って
いますが、繋いでいる電源は3.3Vです。
本来の仕様とはずれています。まぁ、一応カラーバースト
信号が3.58Mhz程度で出力されている様子を見るに、
発振は行われていて、周波数もおおよそ正しいと考えて
よさそうです。本当は5Vで発振させたほうがいいので
しょうが、他に手が無くなったら試してみます。


ひとまずは、(3)について考えてみましょうかね。




コメント ( 0 )




うまく映らなかった件。

DACの抵抗、やっぱり間違えてました。
最上位に一番大きい抵抗が、最下位に一番小さい
抵抗が挿さってました。アホですな。

入れ替えてみて、いざ表示!

こんな感じ。

左から白、黄色、水色…と言いたいところなんですが、
やっぱり色が出ないなぁ。それに、赤と青に相当する
ところに輝度が全く載ってない…

シンクロは完全にあっているんだけどな。
なんで赤と青のところだけ抜けちゃうんだろう?
そしてC信号がちゃんと出ないんだろう?


あと、縮小画像ではわかりにくいので部分的に切り
取ったクローズアップ画像を。

こんな感じ。どうやら、C信号自体は出ているようで、
色ではなく「縦の縞々」という形で現れています。

なので、C信号の線を抜いちゃうと↓こんな感じ。

縦線がすっかり消えて、綺麗な白黒映像になっています。

ということは、tiny2313の出力信号はおおよそ
ビデオ信号の規格に合っていて、しかもCPLD上
で動いているVHDLの中身もある程度機能して
いると考えて良さそうですが…


C信号が機能していない理由を調べないとな…。
特に、カラーバースト信号が活きてないのが
気になるなぁ。


14.318Mhzで4個分のデータ出力…つまり3.58Mhzの
波が出ていないのかな?と思って確かめてみると、
とりあえず縞々の密度から計算してみるとピッタリ
3.58Mhz。CPLD用のクロック回路には問題ない
みたい。

出力タイミングのズレか何かなのなぁ?
なんだろうなぁ…

ひとまずY信号が出るようになったのはいいんだけど、
1歩進んだら袋小路だった…なんてことじゃなければ
良いんだけどな…


カラーバースト信号さえ生きていれば、なんらかの
色が出ているはずなんだけどな…。映像を見るに
3.58Mhzのサブキャリア信号は出ているみたい
だから、バースト信号さえ活きていればなんらかの
色が出るはずなんだけどな。

C信号にLPFか何かを通さないといけないのかな?
だとすると、一旦アンプを通してインピーダンス
変換をしないといけないだろうから面倒だな。


そういえば1点。既にわかっているVHDL上の
バグがあったなぁ。まさにバースト信号関係なん
ですが…。

水平同期信号のタイミングを基準に10ビットカウンタ
をリセットしているので、各ラインの先頭では
これを基準にバースト信号を出力されることに
なるわけですが、一方、水平同期信号が存在して
いない時には10ビットカウンタがオーバーラップ
する毎に勝手にバースト信号が出力されてしまいます。

具体的には、垂直同期期間に意図しないタイミング
でカラーバースト信号が出てしまうということに
なります。

この点については訂正方法を既に考えてあるん
だけど、でもこれが直接悪さしているとは思え
ないんだけどなぁ…

あと、細かいことを言えば垂直同期期間の直後
の約20本程度にもカラーバーストが載っている
んですが(本来は水平同期信号のみ)、これも
悪さするとは思えないんだけどなぁ…

目下、TINY2313が吐き出す水平同期信号は64.3Mhz
(シミュレータ上の計算による)なんですが、
これがいけないのかな?

うーん、何が原因か良くわからん。

CXA1645でも使ってTINY2313用に作ったプログラム
がRGBからコンポジットにちゃんと変換できる
のか、いっぺん試してみようかな?



コメント ( 0 )




まずは以前作ったtiny2213用のカラーバービデオ表示
プログラムを修正します。

・シンクロ信号の論理が逆なので負論理に変更。
・複合シンクロ出力なのを水平、垂直シンクロに
 わけて出力
・どうせなら、3.3Vでも動くように10Mhz
 用に変更

で、ひとまず5Vのまま1kΩと470Ωの抵抗で
白黒信号が表示されるかどうかだけ確認しておきます。

…ちゃんと出ました。まぁ、以前作ったプログラムを
ちっと弄っただけだからね。当然動くでしょう。

次。

CPLDにY、C分離の信号生成用VHDLを書き込んで、
このtiny2313のRGB出力とシンクロ出力を繋いで、
CPLDの出力を150Ω~2.4kΩの抵抗のDAC用
抵抗を通してS端子で出力してみます。

ブレッドボードが派手な生け花状態になってます。

で、映像は…



とか、


こんな感じ。流れてます。しかも色出てない…

なんだろうねぇ…

Y信号くらいはちゃんと出てるだろう…って思って
Y信号だけを、白黒のコンポジット信号として
テレビに入れてみたんだけど、輝度が極端に低い
映像が出てきます。シンクロはしているんだけど…。

うーん、何か上手く行ってないみたい。
なんだろうなぁ…
せめてY信号がバッチリ出てくれないとお話に
なりませんがな。

5VでRGB信号が出たのはいいとして、3.3Vでは
tiny2313が上手く動いていないのか?

それともVHDLのバグか?

いや、生け花が間違えているのか?

(追記)
風呂に入りながらあれこれ考えていたんですが、
なんとなく「これか?」という原因を思いつき…

出てから生け花を眺めたら、案の定。

DAC用抵抗の上位ビットと下位ビット、逆転してた!
ばかだなぁ…。

というわけで、これから組替えてみます。



コメント ( 0 )