OpenCoresのCAN IPをReference Modelにして自作 CAN IPのdebugを行っている。
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 件のコメント:
コメントを投稿