2011年6月4日土曜日

CAN IPの作成

「カン」という言葉を聞くと何故か、し~んぱ~いないからね…という歌が反射的に頭の中に湧いてきてしまうが、そのカンでは無くて(そっちはKANだし)、CANとはController Area Networkのことで、Controller Area Networkは、耐ノイズ性の強化を考慮して設計され、相互接続された機器間のデータ転送に使われる規格。機器の制御情報の転送用として普及しており、輸送用機械、工場工作機械等のロボット分野においても利用されている。自動車においては、速度、エンジンの回転数、ブレーキの状態、故障診断の情報などの転送に使用されている。(出典 Wikipedia)  CANはBosch社によって開発され、その後、国際標準化機構(ISO)が ISO 11898およびISO 11519として標準化している。(同)  CANの規格書はBosch版をここから入手することができる(日本語の資料としてはこれが解りやすい)が、Patentの関係でCANのプロトコルを使用する場合はBosch社からLicenseを受ける必要があるらしい。2年ほど前にCANについて調べたみたことがあり、上記の仕様書を入手して読んでみたりしていた。
物理層は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 件のコメント:

コメントを投稿

自作CPUで遊ぶ 25

まだ制御ソフトが完成していないので今まではスピンドルを移動するために一々簡単なプログラムを書いて移動させていたのだが、非常に面倒なのでCNCペンダント的なものを作ることにした。 右側の縦に2つ並んでいるスイッチ...