結局、カメラ側はPICがあるからいいけど、FG(FrameGrabber)側はFPGAしかついていないので、何にしても、FPGAでUARTを送受信する必要がある。
それが分かった私は、UARTについて調べました。
元々、モデムなどを使った事があるので、聞き覚えのある言葉も多かった。(bpsとか)
次のような物だと言う事でした
⭕️ 信号が送られていない時は、信号はHighをキープ
⭕️ 信号が送られたら信号は必ず一度Lowに落ちる
信号がLowになったら、そこからは受信処理を行う
⭕️ 送受信で以下の項目を決めておく
≫ ビットレート:9600bpsと決める
≫ ビット数:8bitと決める
≫ パリティ:なし
≫ ストップビット:1
この後何度もUARTを設定しましたが、ビットレート以外は、ほとんどこの設定でした。ビットレートも迷ったら9600bpsにしてました。
⭕️ データはスタートビット(Low),データ x8bit, ストップビットの並びになる
⭕️ LSB(下位ビット)からMSB(上位ビット)の順番に並ぶ
⭕️ 1ビットの長さは104.2usec(9600bps)
⭕️ データはスタートビット(Low),データ x8bit, ストップビットの並びになる
例えば、0x0F(00001111)と言うデータを送りたければ最初に0(スタートビット)を送り、その後11110000、そして最後に1を送る
今はIPコアがある事を知っているので、自分で記述する必要もないですが
当時の私はHDLで手書きしました
送信の時は一方的にデータを順番に送るだけなので、悩むことも特にありませんでした。
受信はちょっと厄介でした、しっかりやっていたらもう少し厄介だったと思います。
🔷 待ち受け状態で待つ
🔷 LOWになった瞬間にカウンタをスタートする
🔷 5.2usecでもう一度LOWであることを確認する
🔷 10.4usec毎に信号のレベルをチェックしてBit0からBit7へ順に格納
🔷 109.2usecがLowなら、データを破棄、Bit0がHighならFIFOへ格納
実はこの手順は、いろいろと問題があります
UARTは5%まで誤差を許します。
逆に言えば、5%の誤差が出ていないかを確認する必要があるので
各ビットの前後500nsec程度の間、同じ値をキープしているかを確認する必要があり
エラーを返さないといけません
ただ、今回はカメラとFGはセットで私が作っていますので、エラーは特に起きませんし
エラーが起きた場合も、ソフトウェアでリカバリできるので、簡潔に作りました
UARTを作ったと言うよりも、UARTのルールを利用させてもらったような感じでした。