物理層はI2C busを差動にした様な印象で、へんてこな仕様だなぁーという印象だったが、DataLink層の仕様も読んでみてそれまでの私の知識にはない変わった仕様だった。でも、仕様書を読んでいるうちに自分でもIPを作れそうな気がしてきて作成してみた。 出来上がったRTLの公開も考えていたのだが、上記のLicenseの件が気になったりしている内に興味もなくなり、作業を中断していた。
因みに、CAN プロトコルを実デバイスで私用する場合はLicenseを受ける必要があるが、自分で作成したソースコードの公開自体は問題ないみたいだ。実際、OpenCoresではIgor, Mohorという方が作成されたCAN IPがLGPLで公開されている。(Copyright文にはLGPLの他に、このIPをシリコンに実装する場合はBoschからLicenseを受ける必要がある旨がしっかりと記載されている。) 日本でも、FPGAインフォメーションがVHDL版のCAN IPを公開している。
という訳で暫く放置していたCAN IPだが、Core部のRTLはほぼ完成していたこともあり、作業を再開した。
以下は3つのNodeでの調停と負けたNodeのRetryをSimulationしている様子だ。

上記Simulationは正常に動作しているのだが、全てが自作であり、仕様の解釈を間違えて実装している可能性は排除出来ないため、本当に正しい動作なのかは何とも言えない。
そこで、OpenCoresのCAN IPを入手してこのIPをReference modelとして使うことにした。
このIPのREADME.txtによると、BoschのVHDL Reference Modelでtestしていて全ての項目をpassしているそうなので、Referenceとしては申し分ないだろう。
以下はOpenCores版CAN IPに付属しているTest Benchに自作IPを組み込んでSimulationした様子だ。

動作的には受信部しか見れていないが正しく動作している。
自作IPの組み込みはしたのだが、このTest Benchの構造やどこまでのことが出来るのかまでは、まだ、解析できていないが、一応自作IPの検証項目としては以下を考えているので、これらを見れるようにぼちぼちやっていこうと思う。

順番が逆になってしまったが、私のCAN IPの構造(RTL構成)は以下の様になっている。

図にするとこんな感じだ。


実用の為にはFIFOや受信パケットの取捨選択をするためのIDのマッチング用回路も必要になるが、この部分はcan_coreには含めていない。 これは、その部分の難易度が高いからではなく、自分の設計スタイルでいつも、必要最小限の部分をcoreとしてまとめるようにしているからだ。
0 件のコメント:
コメントを投稿