OpenCoresのCAN IPに付属しているtest benchではCAN IPが2つinstanceされているが、
この他にsimulation の項目に応じてCAN busのtransaction patternを発生させるtaskがある。
このtaskは全部で17個程ある。
従って実質的には3つのnodeが存在する。先日はこの環境に自作のIPを追加して、
simulationを実行して自作IPがReference Modelと同じ動作をするかを見れるようにした。
最終的にはtest benchを作成してReference Modelをそのbenchにinstanceするつもりだが、
その前に上記のtest benchの全taskでの検証を実施してみることにした。
その結果、自作IPにerror 処理の部分にbugが見つかった。
具体的にはError Frame送出後のError Delimiter Frame時にDominantを検出する場合が
想定されていなかった。これはOverload Delimiter Frameも同様だった。
CAN I/F規約ではbusに繋がっている全てのError ActiveなnodeがError Frameを送出した後、
Error Frame Delimiter Frameに移行するので、Error Frame Delimiter Frameの期間
Recessive状態が続くものと考えてしまったが、甘かった。異常状態を想定しなければならないので、
Dominantも想定する必要があった。 これ以外にもphy部でhard synchronous処理にbugが見つかったりした。
これらを修正していった結果Reference Modelと同じ結果を得られるようになった。

上は主にerror処理を見るためのtaskを実行した時の波形だ。
一方、下は正常処理を見るためのtaskを実行した時の波形だ。

CAN I/Fは仕様が複雑で、serial dataを受信(または送信)しながら、同時処理していかなくてはならない。そのため、自作IPのstate machine記述は複雑なものとなってしまった。

ただし、伝送速度は最高でも1Mbpsなので最近のFPGAなら楽勝で実装できてしまうだろう。
というわけで、これまでのdebug作業で主に受信部の検証は出来た。次は送信部の検証を行う必要があるのだが、これは上記のbenchだとやりにくいため、新しくtest benchを作成して進めていこうと
考えている。
0 件のコメント:
コメントを投稿