2015年8月2日日曜日

世界最小クラスかも知れないFPGAボード 7 (CAN IPを実装してみる 3)

このブログの月当たりのページビューが1000を超えることは殆ど無いのだが、珍しいことに7月は1170だった。2013年〜2014年の間に2000近いページビューがあるが、この時はあるスパムサイトからのアクセスが主因だったので、実質的に1100を超えたのは今回が初と言える。




さて、FPGAボードだが、実験を進めるためにはCANのトランシーバやI2Cに何らかのデバイスを接続する必要がある。というわけで、今回はベースボードを作成した。

CANのトランシーバはMAXIMのMAX3051EKAを使ってみることにした。私が調べた限りではこのデバイスが一番小型だった。


I2Cバスには、MCP3425ADT (16bit ΔΣ A/D)、 MCP4726A0T (12bit DAC)、 STTS751 (12bit 温度センサ)を繋いてみることにした。

PWM, A/D, D/Aの入出力信号は左側のピンヘッダに出している。手前のピンヘッダはコンフィグレーション用のコネクタ。


ZYBO側もPMODコネクタに接続できるCANトランシーバ基板を作る必要がある。

2015年7月20日月曜日

世界最小クラスかも知れないFPGAボード 6 (CAN IPを実装してみる 2)

ハタ! と気づけば、もう今日は7月20日。8月の顔が見えてきた感じがする。時間が過ぎるのを本当に早く感じる今日この頃だ。

前回オープンドレインのiCE40の開発環境ではRTL記述が出来ないようだと書いたが問題ないようだ。 I2C IPのデータバス部のポート接続部に記述ミスがあったのでそういうのを修正したら、オープンドレイン記述も通るようになった。その結果、SB_IOをインスタンスする必要も無くなった。

生成されたシミュレーション用ネットリスト

で、漸く合成も出来た。 リソースの使用率は60%弱となった。


クロックは50MHzを外部から入力するつもりでいたのだが、50MHzだとタイミングがmetしなかった。色々試したが、結局20MHzに下げることにした。

私のCAN IPはクロックはデフォルトで50MHzだがparameterで変えられるようにしてある。

トップモジュール(fpga_top)のcan_coreインスタンス部でdefparam文で20MHzにした。


漸くステージを一つクリア出来た。もう少しで実機動作確認に入れそうだ。
CANの通信相手が必要だが、ZynqはCAN IPを持っているのでこれを使ってみようと考えている。

ZYBOのMIO PMODコネクタにCANの信号を出せる筈だと思うのだが、リファレンスマニュアルからは読み取れない。

ZYNQのTRMを見る限りでは出来そうなんだが・・・


さーて、どうなりますか。。。



2015年7月12日日曜日

世界最小クラスかも知れないFPGAボード 5 (CAN IPを実装してみる 1)

ここ数ヶ月、あまり考えないで部品や理工書を購入していたらえらい出費になってしまった。。。orz
しかし、なんで理工書ってのはこんなに高価なのかねー、、、学生や学校関係者ならば学割などで安く購入できる方法が使えるんだろうけど、あたしゃただのおっさんだもんなー。 (>_<) つらい。
どこかに、この50過ぎのおっさんにFPGA三昧の仕事をさせてくれる会社は無いものか・・・
FPGA三昧といってもFPGAを使ったボード開発とかだけど。ハードウェアやソフトウェアのスキルは公開しているRTLやこのブログの記事を見れば大体分かっていただけると思う。良くも悪くもこの程度しか無い。これ以外のスキルとしては、アナログ系回路も多少はできる。。。というか、本業ではこのところアナログ回路の設計開発が多い。あと、TOEICは10ヶ月位前のスコアで730点だった。 仕事のスタイルとしてはどちらかといえば単独でやるスタイルを好むがチームでの仕事も問題無い。ただし、やりたくないオーラ全開で能書きばかり垂れるような奴とのチームだけは勘弁して欲しい。こっちまでやる気が失せてしまう。 また、「あいまい耐性」はある方だと思う。
んーーー、まっ! 多少はねーー、多少はCNWな面もあるかも知れませんよそりゃ。
CNW… ちょっと何言ってるかわかんねー、みたいな。。 50年以上も生きていりゃ考え方とかに癖とかついちゃいますから、白無垢状態でこれから何色にでも染まります、ってな訳には、そりゃー行きませんわ。。ってな事をこんなところに書いてても何にもならないか・・・
いま抱えている仕事を放り出すわけには行かないので、転職できるとしても来年の後半になるが。。
FPGA三昧の仕事がしたいなーー、どこかにいい転職先は無いものか・・・

話は変わって、ツイッターのタイムラインを見ていたら、DIPSYというiCE40Ultraを使ったDIP型のFPGAモジュールの開発プロジェクトの情報を見つけた。 オリジナルはEETimesの記事のようだ。
http://www.eetimes.com/author.asp?section_id=216&doc_id=1327108 
この記事でリンクしているリンク先に実物の写真も載っていた。。。 ちょっと親近感を覚えた。 でも、載っかっているFPGAはiCE40UL1Kなのでリソース規模は小さいし、ピン数も少ないので用途は限られてくる気がする。 フルカラーLEDの調光くらいなのかな? 用途としては。。。

さて、うちの子(ボード)だが、以下のようなアーキテクチャを実装して動かしてみることにした。

PWMとI2Cマスタを持ち、CAN経由でそれらを制御してみる。
RX PIPEは受信フレームのIDフィールドをパターンマッチングして一致したフレームを各ポートに振り分ける。ポート0はPWMの周期設定、ポート1はDuty比設定、でこれらは標準IDフォーマットを使う。また、書込(マスター➔当FPGA)のみとする。 ポート2はI2Cの制御用で拡張IDフォーマットを使い、拡張IDの部分をレジスタインデックスとして使うようにした。リモートフレームによりリードバックも可能とする。



I2Cはハードコアを使わずに自作のI2C IPを使ってみた。 I2CのSDAはinout(双方向)でオープンドレインにする必要があるのだが、iCE40の開発環境ではオープンドレインのRTL記述が出来ないらしくエラーとなってしまう。しかし、FPGAのIOBの構造的には可能な筈だ。

そこで、シミュレーション用ライブラリソース等を参考にして上記のようにSB_IOをインスタンスして見た。合成は一見成功している。しかし、生成されたネットリスト(ゲートシミュレーション用ネットリスト)で確認すると、オープンドレイン出力の系は生成されているのだが何故か入力の系の回路が生成されていない。ネットリストを見るとRTLでインスタンスしたSB_IOはIO_PADとPRE_IOというモジュールに変わっており、PRE_IOのDIN0のポートが未接続となっている。

SB_IOの代わりに、IO_PADとPRE_IOでRTLを使ってみたのだが合成でエラーとなってしまう。。
なぜ、出来ないんだろう??

素直にI2Cのハードマクロを使ったほうがいいのかな…


2015年6月28日日曜日

世界最小クラスかも知れないFPGAボード 4 (CPUを実装してみる)

自作CPUのzumi32がiCELM40に入るかを見てみた。
以下のようなアーキテクチャとした。従来であればプログラムダウンロード用のパスも設けるのだが、iCE40LMのEBRAMはtrue dual port ram モードを持っていないため省略した。
合成の結果はP&R(配置配線)でエラーとなってしまった。

iCE40は配線用リソースが少ないと見え、純粋な論理回路としてはLUTやDFFはリソース内に収まっているが、配線経路としてLUTが使用されておりその数と合わせるとデバイスのリソース規模を超過してしまうようだ。

そこで、今度はデバイス設定をiCE40UltraのiCE5LPに変えてやってみたところ成功したが、リソースの使用率は100%で、P&Rに1時間位かかった。

iCE5LPのLUTとBRAMの規模はiCE40LMと同じだが、その他にハードマクロの乗加算器(16x16 Multiply & 32bit Accumulator Blocks)を持っている。 ただし、パッケージはWLCS36 (6x6)とWLCS20 (5x4)である。iCE40LMはWLCS25 (5x5)なので非互換ということになる。
以下の写真の右側がiCE5LPのWLCS36パッケージ品である。こうしてみると大きさ的には大差無いと言える。こいつのハンダ付けも今度挑戦してみようと思う。


iCE40LMに戻って、今度はCAN IPの実装をやってみた。
とりあえず、アーキテクチャは以下のようにした。

合成は旨く行った。

リソースの使用状況はこんな感じになった。

今回のRTLではUARTも入れているが必須ではない。また、iCE40LMはI2CとSPI IPをハードマクロで内蔵しているので、これらを利用すれば、リソース的には余裕が出来る筈だ。


2015年6月13日土曜日

世界最小クラスかも知れないFPGAボード 3 (動作確認)

ユニバーサル基板で作った時にFlashの書込が旨く行かなかったが、これは1.2V LDOの配線ミスが原因だろうと判断したが確認はしていなかったので、基板化したセットでFlashへの書込ができるかを確認した。

結果は成功した。

FPGAへの書込も問題なく出来た。

書き込んだのはLチカのやつだ。LEDを接続すると点滅した。
(※. 緑色のLEDは+3.3V受電確認のためのLEDである。)

次に、ユーザI/Oとして使える全てのピンに信号を出して確認することにした。
このボードのピンの信号割り当ては以下のようになっている。

RTLとピン定義は以下のようにした。


確認はロジアナを使った。



んー・・・、バッチ・グーです。

全ての信号で単独のパルスが出ているのでハンダブリッジ等も無いと判断できる。

念の為、オシロでも電圧レベルを確認した。
全ピン、+3.3Vまで振れていた。

この時の電源電流も見てみた。 受電確認用のLEDは外した。
442uA !!
動作クロック周波数が低いのと、実装している回路規模が極めて小さいというのもあるとは思うがかなり少ないと思う。

ハンダ付けは問題無いことが判ったので接着剤(アロンアルファ)を接続部に流し込んで固めることにした。
アロンアルファは固まると白濁してしまうがしょうがない。
今度、紫外線硬化型レジンを試してみようかな。


2015年6月6日土曜日

世界最小クラスかも知れないFPGAボード 2 (FPGAへの配線)

部品を実装した3枚の内、1枚のFPGAの配線が終わった。





世界最小クラスかも知れないFPGAボード (基板が届いた)

世界最小クラスかも知れないFPGAボードの基板が届いた。

基板1枚の寸法は10.16mm × 30.48mmなのだが、FusionPCBで作成できる基板の最小寸法が20mm × 20mmなので3面付にし、板厚は1.0mm、製造枚数10枚で注文した。価格は$9.9、送料$3.64の計$13.54だった。支払いはPaypal経由で行ったのだが日本円で1,699だった。
枚数はこんなに要らないのだが10枚でも価格が$9.9だったので10枚にした。


アクリルカッターで基板を1枚づつにカットして、部品を実装してみた。






2015年5月31日日曜日

road to the soldering master 6

前回、フラッシュROMへのアクセスが出来なかった。フラッシュROM単体ではどうか見てみたらアクセスできたので、今度はFPGA単独でFPGA内部のCRAMに書き込めるか見てみようとして配線をばらしていたら、FPGAのコア電圧用のレギュレータの配線が間違っていることが判明した。  他にも問題があるかも知れないので、とにかくFPGA単体での動作確認をしてみることにした。
その結果、単体ではCRAMへのコンフィグレーションデータの書込は旨く行くことが確認できた。
bitmapデータはLatticeのリファレンスデザインのデータを使った。

次に、LEDを点滅させる回路を書いて動かしてみることにした。

iCE40はOn-Chip Strobe Generatorsというパルス発生モジュールを2種(Low Power Strobe Generator と High Speed Strobe Generator)内蔵しており、この出力はクロックソースとしても使える。今回はLPSGをクロックソースとして使用した。LPSGからは10KHzのパルスが出力される。
ちなみに、HPSGは12MHzだ。また、データシートによればiCE40のF/F(フリップフロップ)のfMAXは100MHz程度のようだ。

ただし、25pin WLCSPパッケージの場合はGND端子が2pinのみだし、今回進めている実験では0.15mmのワイヤーで基板のランドまで引き回しているのでどの周波数までちゃんと動作するかは未知数だ。

合成からbitmap生成までは旨くいった。

早速、生成されたbitmapファイルをiCE40に書いてみた。


そしたら、無事LEDが点滅した。


やったー \(^_^)/
やっべ、超ウレシー

フラッシュROMを繋いだ状態でどうかも見なければならないが、旨く行かなかったのはレギュレータの配線ミスが原因だと思う。  Lチカが確認できれば後は所望の回路を記述して実装して動かしてみるだけだ。 前回、KiCADで基板設計も行ったがその後若干の修正を加えてFusionPCBに発注した。その基板を使えば次のセットは少しは作りやすくなる筈だ。

ERROR: Failed to spawn fakeroot worker to run ...

なにかと忙しくてなかなか趣味の時間を確保できない。 ...orz  家の開発機のOSはLinux Mintなのだが、最近バージョンを22に更新したところ、myCNC用のpetalinuxをビルドできなくなってしまった。ビルドの途中で ERROR: Failed to spawn ...