VHDLのお勉強が少し進んだことに気をよくして、
課題だった「CPLDでNTSCカラーコンポジット」
の生成回路を考えてみました。
回路と言っても、いきなりVHDLじゃなくて、
スキームを図にするところから。
![](https://blogimg.goo.ne.jp/user_image/7c/c4/52b1fd9a776cb8873e2e94ecead27526.jpg)
こんな感じかな…と。
CPUからの入力信号は垂直同期、水平同期、RGB。
ビデオへの出力はY信号、C信号。
S端子用の信号というわけですが、2つを単純に足し
合わせればコンポジット信号になります。
Y信号は、RGBから作り出す輝度信号と、垂直/水平
同期信号を合成するだけなので、単純に入ってきた信号
から単純な計算でOK。結構単純なprocess文で
できちゃうのではないかと。
まぁ、RGBから輝度に変換する計算式の表現が
少し規模的に懸念?
出力はカラー4ビット、シンクロ1ビットの5ビットで
足りるのでは無いかと。
C信号は2つの信号を含んでいます。burst信号と
sub-carrier信号です。
14.3Mhzで1ラインは910クロックに相当し、
1ライン分は910カウントできればよいから、
10ビットのカウンタを設けます。
burst信号は0度、90度、180度、270度の4パターンを
連続して出力できれば良いので、カウンタを0~3の間で
カウントさせておいておきます。
これらのカウンタは、水平同期でリセットします。
そしてこのカウンタ値を見ながらラインの冒頭で
burst信号を出力、その後はRGB信号の有無によって
sub-carrier信号を生成します。
C信号は、例の↓このページによると
http://www.geocities.jp/kwhr0/hard/pc8001.html
多分4ビットデータで足りるので、4ビットで
出力する方向で考えます。
入出力ピンが合計14本、レジスタが12ビットという
感じなので、これだけなら多分XC9536XLでも
入りきるはずだと思うんだけどなぁ。
というか、できれば8色RGBじゃなく、せめて
RGB各2ビットか3ビット欲しいので、これが
動いたらあとで多色化にも挑戦の予定。
その時に入りきるのかどうか…
そうそう。そもそもY/C分離で出力するんではなく、
完全にコンポジットにしてもいいですよね。
それでも8色出力程度ならレジスタ消費が少し増える
程度じゃないかな。
4~5ビット程度、最大でも9ビット程度?
そうそう。フィールド数をカウントするカウンタは
無いので、4フィールドシーケンスによる縦縞消去は
できません。でも気にしないことにします。
多分問題出るのは白黒テレビだけだろうし。
(カラーでも出るのかな???)
4フィールドシーケンスも実現したい場合は…
何とか頑張ってフィールド数をカウントしてください。
このスキームなら垂直同期信号は全然弄ってないので、
多分インターリーブでもプログレッシブでもどちらも
OKだと思うんですが、確信は持てません。
まぁ、多分大丈夫だけど。
一番厄介なのは、RGB信号とburst信号から作り出す
sub-carrier信号の計算式。8色RGBでさえ
8×4=32パターンあるので、if文が相当
大きくなりそう。入りきるかな?
配列とか上手く使えば可読性は良くできそうだけど、
規模はちょっと???だな。
という感じで作っていって、いずれRGB各2~3
ビットまで拡張すれば、マイコンと繋ぐ範囲では
必要十分じゃないかなぁ。それ以上になると、
マイコン側がRGBの全信号を一度に(1命令で)
出力することはできないだろうし。
ひとまずブレッドボード上で、8色でもいいから
カラーコンポジットが出せるようになれば、あとは
そんなに難しくはないでしょ。
S出力がいいかな?コンポジット出力がいいかな?
どちらにしても、録画やビデオキャプチャには
用は足りるはずなんだけど。
![](/images/clear.gif)
![](/images/clear.gif)
![](/images/clear.gif)
|
この間simさんから教わったVHDLによる論理合成の基礎 。
さらに読み進めました。
他の入門系の本と違って、じっくり読まないとなかなか
頭に入ってこないので腰据えてじっくりと読んでいる
んですが、スルメの様に噛めば噛むほどこれまで
解らなかったことが掴めてきました。
他の入門書類が、いわゆるLEDピコピコやナイトライダー
的なところで一段落しちゃっているのに対して、
この本だと「なぜこういうコーディングになるのか」と
いったことを、実際に論理合成される回路と結びつけて
解説されているので、今まで「魔法の呪文」だったところも
中身まで解るようになっていっている気がします。
ひとまずようやく「ステートマシン」の入り口まで
たどり着きました。
ここに行き着くまでに、ライブラリってどうなってるの?
とか、オブジェクトの作り方とか、リセット信号の
クロック同期/非同期の回路とか、不定値(x)を入力値
にするのってどんな時?とか、'event以外にどんな属性が
あるのかとか、functionやprocedureの作り方、使い方とか、
もう盛りだくさん。
今までに躓いたところはことごとく触れられている気がする…
ここらへんが解ってないと、やっぱり複雑なものは
作れないし、人の書いたVHDLも読めないだろうし。
他の入門書を読んでみたはいいけど、本の課題から
すこしでも外れてしまうとチンプンカンプンになって
しまうという場合、この本はいい助け舟になって
います。
でもまだ、本題の「合成に向いたコーディング」の章までは
たどり着いてないんだよな。もうちょっと先。
でも今日はなんだか風邪気味なので、続きはまた今度
読むことにします。
|
先日訪れたブログ「言語ゲーム」の12/10の日記、
http://d.hatena.ne.jp/propella/20081210
を通じて、世界聴診器というものを体験してみました。
世界聴診器自体は元々arduinoを使うものではない
ようなのですが、要はVFコンバーターなので
arduinoのAD入力とタイマー割り込み処理を使って
代替機(?)を作られたようです。
ブログ上でスケッチが公開されています。
(あれ?今見たらスケッチの下半分が見えなく
なってるかな?)
(↑今見たら直っているようです)
で、公開されていたスケッチを使って、入力部分は
5V電源を可変抵抗で分圧して0~5Vを作り、
出力はそのまま圧電ブザーに繋いでみて、いざ
実行してみると…
可変抵抗をグルグル回すと、音程が高くなったり
低くなったりして出力されます。
VFコンバーターとしてはバッチリ動いている
という感じ。
ここに、普通なら光センサーとか色々繋いで入力して、
それを音程として出力するみたいですが、「言語ゲーム」
のpropellaさん曰く、シリアル入力端子を持ってない
PCへの入力デバイス(音声入力)という用途が
あるようです。
なるほど。単なる音量にしてしまうとPCのハードに
よって不正確なデータしかやり取りできないけど、
電圧を周波数に変換してから入力すれば、FFTなど
通すことで環境に因らない正確な入力デバイスにも
なるんだな。
そうそう。で、PCのソフトと繋いで使うというお話
だったので、どんなものがあるのか調べてみたら、
http://squeakland.jp/index.html
スクイーク(squeak)って言うソフトがあるんですね。
これ自体は世界聴診器用ソフトというわけでは
ありませんが、繋いで遊ぶこともできるっぽい…。
まだ詳しく調べてないので仕様とかよくわかって
ませんが、スクイークに限らず、音声入力端子を
一つの入力デバイスとして使うっていうのも
面白いですね。
他にもソフトがあるのかな?
問題は、FFTの計算方法がいまだに良く解って
ないんだよなぁ…。自分でソフト作るとしたら、
そこが最大の壁になるかな。
ネコロジーにオシロ機能を足したら、FFTとしても
使いたいんだけど…
FFTの専門書でもそのうち探しに行こう…
|
arduinoの公式ライブラリで公開されていた
Capacitive Sensing Libraryを使ってみました。
http://www.arduino.cc/playground/Main/CapSense
基本的にはサンプルスケッチをそのまま動かして
みただけですが、抵抗には家に有った1MΩを使い、
ピンは2と4を使うようにしたので、以下のように
一部修正してます。
long total = capSense(2, 4, 20);
これでスケッチを実行し、デジタル4番ピンに直接
触ると、出力される数値(アナログ入力の値)が
大きくなるようです。
(離すと0か1程度なのが、触ると数十以上に)
もっと大きい抵抗値を使えば、触るだけではなく指を
近づけるだけでセンシングできるようです。
3つ目のパラメタの数値を色々弄ると、出力される
数値のレンジが変わるようです。感度として
働くようです。
とりあえず動かしてみただけなので今ひとつ仕組みが
解ってませんが、なんとなく機械的なスイッチを
つけなくても入力が作れるということで便利
に使えそうです。
もう少し大きな抵抗が家にあったらなぁ…
|
arduinoのOfficial Librariesを眺めていたら、
servo用ライブラリが付け加わってました。
0012に合わせて新たに取り込まれたようですが、
気付きませんでした。
http://arduino.cc/en/Reference/Servo
servoモーター用のライブラリといえば、
Contributed Librariesに既に2つあったのですが、
そのどちらとも全く一緒というわけではないようです。
ライブラリ名はServoということで、旧ライブラリの
http://www.arduino.cc/playground/ComponentLib/Servo
と一緒なんですが、中身は違っていて、Servo::refresh();
を使う必要がないみたい。
機能的にはタイマー1を使ったServotimer1↓
http://www.arduino.cc/playground/ComponentLib/Servotimer1
と機能面でソックリですが、名前は違っています。
機能が追加になっていくのは便利なんですが、
同じ名前で古いライブラリの仕様と大きく異なる
モノができていくのはちょっと厄介だなぁ。
特にServoライブラリは新旧で全く同じ名前だから、
混同してしまいそう。
基本的にはOfficial Librariesがその名の通りOfficial
なのでしょうが、Contributed LibrariesのServoは
2個を超えるサーボモーターを同時に接続できるなど
機能面で上回っている部分もあるので、こういうときは
せめて別の名前で作るか、もしくは割り当てるピンによって
扱いを変えると嬉しいんだけどな。
(9番10番ではrefresh()メソッドが不要で、それ以外
のピンではrefresh()メソッドが必要になるとか)
Official LibrariesのServoライブラリは最大で2個までしか
サーボモーターを制御できないので、それ以上の
モーターを繋ごうとした時に絶対困ってしまうはず。
|
|
|