ComProcのUART通信プロトコルの改良
プログラムの転送
データ通信
UART通信の要件
連続で複数の自動テストを走らせることができる
ComProc CPU上のソフトウェアから入出力できる
現在(2023/10/25現在)はプログラム転送に主眼を置いたプロトコルを使っている
初期状態ではプログラム受信モードになり、命令列を受信してメモリ(BRAM)に書き込む
プログラムに絶対に現れない特殊なワード(2バイト)を用いてプログラムの終端を表す
特殊ワード:0111 111x xxxx xxxx(7e00~7fff)
特殊ワードを受信したら、プログラム受信モードが終わり、CPUのリセットが解除されてプログラムの動作が開始する
命令ワード(7e00~7fff以外のワード)を受信したら、CPUがリセット状態になり、プログラム受信モードに入る
上記を繰り返すことで、連続的に複数の自動テストを走らせる
現在のプロトコルの欠点
ComProc CPU上で動くプログラムがUART受信を行う場合に面倒が発生する
PC→ComProc CPUへのデータ送信の際、データ量が2倍になる
1バイト目を7eか7fにしなければならない
例えば0x01 0x02を順に送りたい場合、0x7e01 0x7e02の4バイトを送る必要がある
データをそのまま送ると「命令」と見なされ、CPUがリセット状態に入ってしまうから
新プロトコルの案
特殊ワードの2バイトが、指定された時間間隔で受信されたら、プログラム転送開始の合図とする
特殊ワードの候補:55aa
もしデータの中に特殊ワードが含まれていても、時間間隔を満たさない場合、プログラム転送の合図とはしない
時間間隔:0.2ms~20ms
ComProc CPUのUARTは115.2kbpsで通信する
バイト単位の転送速度は115.2kbps/10=11520バイト/s
1バイトあたりの転送時間は1s/11520=86.8μs≒0.09ms
PC→ComProc CPUへのデータ通信に、偶然55 aaとなるバイト列があった場合
2バイトが連続で送られるなら、0.09ms程度の間隔で送信されるので、プログラム転送の合図とはならない
1バイトずつ分割して送るなら、20msより長い間隔で送信するようにすれば、プログラム転送の合図とはならない
手動で送る場合は、工夫しなくても20msより長い間隔になるだろう
プログラム転送は専用のスクリプトで行う
このスクリプトは、プログラム転送の開始前に数ms間隔で55 aaを送信する
プログラム転送が終わったら 7f ff で転送終了を示す
新プロトコルの欠点
データ受信の遅延
データの中に55 aaが含まれていた場合、ComProc CPU上のプログラムが55を受け取るのに、最大で20ms程度遅延する
ComProc CPUは、55を受け取ったらそれがプログラム転送開始の合図の一部かどうかを判断するため、最大20msの間、後続のバイトを待つ
連続送信時はすぐに後続バイトが来るので、遅延は1バイト分だけ
個別送信でゆっくり送る場合は20ms程度の遅延は問題にならないだろう
受信回路の複雑化
1バイトのバッファを追加する必要がある
55を受信したら、後続のバイトを受信するまで55を出力せずに待つ必要がある
新プロトコルの回路設計
https://gyazo.com/eaed4238e30436c9a28ba596709c0332
今はシフトレジスタから出力レジスタに直接転送している
新方式では、一旦内部バッファを介す
受信した値が0x55なら出力せず待機
0.2ms以内に後続バイトを受信
シフトレジスタの値を内部バッファへ、内部バッファの値を出力レジスタへ転送
0.2ms~20msの間に後続バイトを受信
後続バイトが0xAAなら、出力レジスタへの転送はせず、プログラム転送モードへ
その他の場合、シフトレジスタの値を内部バッファへ、内部バッファの値を出力レジスタへ転送
後続バイトが来ないまま20msが経過
内部バッファの値を出力レジスタへ転送
必要なレジスタ
シフトレジスタ
内部バッファ
内部バッファにデータがあることを示すフラグ
出力レジスタ
出力レジスタにデータがあることを示すフラグ
タイマカウンタ
27MHzで20msをカウント→20ビット幅
新プロトコルの信号タイミング設計
55AAを短時間に連続して受信する場合
https://gyazo.com/f5f114fcffc4877c3ab398510bc15e4a
55を受信した後AAを受信するまで、55がrx_dataに出力されない