XPS IPコアでのVerilogモジュールの使用

EDKで自作IPコアの使用を試している。Create or Import Peripheralを使用し、VHDLでuser_logic.vhdを作成する。user_logic.vhdからVerilogで記述された回路を使用したい。PAOファイルにVerilogファイルを記述したり、MPDファイルにVerilogも使用する設定の記述などを行ったが、どうやってもISEでコンパイルできなかった。

結局、IPコアとして埋め込むのはあきらめて、MicroBlazeのxmpがISEでトップレベルファイルになっていたのをやめて、MicroBlazeのstubファイルをトップレベルにし、普通にISEプロジェクトにVerilogのファイルを追加したらOKになった。

後日記


上記の方法でまたおかしくなってしまったのが、もう一度挑戦したら、最初に試みた方法でできるようになった。ただし、verilogのソースを変更したときは、implementationフォルダにあるngcファイルと、その中のcacheフォルダにあるファイルを削除してからgenerate netlistしないと、変更が反映されない。

more…

PLB slave single

plbv46_slave_singleの自分用のメモ

ARD: Address Range Definition。アドレスデコードとチップセレクト信号を生成する。
C_ARD_ADDR_RANGE_ARRAY, C_ARD_NUM_CE_ARRAYは、VHDLのunconstrained arrayとして定義される。これら二つの配列のそれぞれ対応するインデックスのアドレスとチップセレクトが結び付けられる。

C_ARD_ADDR_RANGE_ARRAY: 2データで1ペア。それぞれ、ベースアドレスハイアドレス。このアドレスは、バイトアドレスで指定する。ブロックサイズ(ハイアドレス-ベースドレス+1)は2の累乗でないといけない。ベースアドレスは、ブロックサイズの倍数のアドレスでないといけない。

C_ARD_NUM_CE_ARRAY: それぞれのアドレススペースで必要なチップセレクトの数を指定する。それぞれの値は2の累乗でないといけない。各アドレススペースは、少なくとも1つのチップセレクトがないといけない。各アドレススペースは、チップセレクトの数で分割される。

結局これらの配列の値は、Create or Import Peripheralでテンプレートを生成すると、一応genericで定義されるが、実際はXPSでインスタンスを作るときに決まる。

more…

C to Verilog (2)

合成の問題(?)について
C to Verilogを試していると、メモリの制御信号がDon't Careになってしまうことがあると分かった。いろいろ入力となるCプログラムを変えてみたら、どうやらforループの中にcontinueがあるとうまくいかないらしい、ということが分かった。ひょっとしたらbreakもだめなのかな?

メモリ(RAM)の使用について
C to Verilogでは、ポインタはRAMとして生成され、テストベンチの中にはRAMの宣言もある。このRAMはポート数は可変のようだが、タイミングは固定されてしまっている。つまり、同期書き込み、非同期読み出しのメモリでないと、期待したタイミングとずれてしまう。そして、Xilinxの場合、BRAMは同期読み出しである。したがって、C to Verilogで生成されたプログラムを使用する場合は、BRAMは使用できない。その代わりに、分散RAMを使用する。これであればdual-portメモリもOK。でも、dual-port設定時にC to Verilogで生成されるRAMのモジュールは、Write Enable信号が2つある。分散RAMは、書き込みは1ポートだけしか使えない ...

more…

MicroBlaze + IPコア

XilinxのMicroblazeに自作IPコアをどのように接続するかを調査中。いろいろ検索してみたが、要領よくまとまっている資料が見つからなかった。


最新はAXIというARMのバスらしい。しかしこれは最新のFPGAにしか対応していないようだ。AlteraはAvalonかCustom Instructionくらいしかなかったが、Xilinxはしょっちゅうバスを入れ替えている。OPB, PLB, AXI, FSL。FSLはMicroBlazeにPoint-to-Pointで接続するので、残りとは少し違う。AlteraのCustom Instructionと同じような目的で使うために準備しているらしい。FSLのI/Fを使ってやりとりするのが一番簡単そうではある。でもこれだとCPUの介在がワードごとに必要なので、DMAで使えない。でもPLB to FSL bridgeというのがあるので、FSL I/Fで作ったIPコアをPLBに接続することもできるっぽい。これでやってみようかと思う。ただ、PLB to FSL bridgeのデータシートは古いので、最新のISE12.4でも使えるのか、というのが少し不安。

more…

C to Verilog

C to Verilogというサイトを見つけた。最近はいろいろ高位合成ツールもあるようだけれど、きっと高価なものだと想像してしまう。このサイトだと、無料でCコードからVerilogコードを生成してくれる。試しに、サイトにもあるpop countのコードをverilogに変換してシミュレーションしてみた。

ちなみに、ポップカウントというのは、変数中の1の数のこと。例えば、a=0x12だと、二進数で00010010だから、ポップカウントは2になる。

ポップカウントを計算したいデータ(モジュールへの入力)は、mem_BというBRAMに格納されている。また、計算結果はmem_Aに格納する。

シミュレーションの様子を次に示す。まずはシミュレーション開始時。

resetをテストベンチから入力すると、rdyがLになる。生成されたモジュールがmem_B_addr0を順次カウントアップしている。mem_B_outから得るデータでモジュールが計算を行う。最初の方はmem_B_addr0が1clkごとに7になるまでカウントアップしているのに注目できる。これはこのモジュールがパイプラインで計算しているから。

120nsでmem_A_mode0がHになる。これは最初のデータ0に対するポップカウントが計算でき、mem_Aに結果を格納するためのWrite Enable信号である。mem_Aのアドレス0に0(mem_A_in0に出力されている)をライトしている。160nsでもまたmem_A_mode0がHである。これはアドレス1にデータ1のポップカウント1をライトするための信号。


次にシミュレーション最後の部分を示す。rdyがHになると終了。最後の出力は、データ0x3FFに対するポップカウント10(=0x0a)である。


正しく求められていることが分かる。

少し試して見ただけだが ...

more…

node.js+MySQLで文字化け

node.jsからMySQLを使用して、昔にRoRで作成したアプリと同等のものを(同じデータベースを使って)作ろうとしているが、いろいろやっても文字化けが解決できなかった。ひたすら検索し、仙石浩明の日記 2009年9月14日 文字化けしていなくても MySQL 内の文字コードが正しくない場合があるを見て、ついに原因が判明した。結局、既存のRoRで作成したアプリが、latin1でMySQLとやりとりしているのが原因だった。実際に、mysqldumpでデータベースをダンプする際に、--default-character-set=latin1を追加したら、文字化けしなかった。というわけで、根本的に解決するには、データベースのデータをちゃんとUTF8にすることだけれど、ひとまず、node.jsのプログラム側で、set names latin1というクエリを送って、RoRと同じ動作にさせたら、文字化けが直った。

more…

C#のScrollBar

ScrollBarの値をユーザが操作して変更すると、Scrollイベントが発生するが、プログラムコードでValueプロパティを変更するとScrollイベントは発生しない。ValueChangedイベントを使用すれば、Valueプロパティをコードで変更しても捕捉できる。分かってしまえばどうということは無いけれど、ちょっと調べる必要があった。

# Delphiは確かコードで変更してもC#でいうところのValueChangedイベントのような動作がデフォルトだったように思った。

more…

NIOS2カスタム命令

NIOS2で計算を高速化するためにカスタム命令を実装してみた。最初は、レイテンシ固定で実装してみたのだが、どうやっても計算結果がおかしい。クロック数がずれているのかと思っていくつか試してみたが、だめ。それで結局、レイテンシ可変にして、START, DONE信号をモジュールで処理するようにしたら動いた。Quartus II 9.0 SP2で実験。

more…

node.js vs Erlang

Node.js vs Erlang: SyncPad’s Experience になかなか興味深い結果が掲載されている。node.jsを長時間サーバとして動かしていると、徐々にメモリ使用量が増えてしまうという問題に遭遇したので、同じ機能のサーバをErlangで作成してみた、という記事。node.jsと比較して、CPU, Memory両方とも使用量が少なくて済んだ、という結果。またErlangブームが起きるか?ただ自分としてはErlangはあまり構文が好きになれない。まだJavaScriptの方がきれいにまとまっているように感じる。

Is node.js best for Comet? この記事も参考になる。V8は現状の所サーバに使用するにはあまり良いアーキテクチャではない、という指摘。全部は読んでいないけれど、コメントも参考になりそう。

more…

最近のJava騒動

最近、AppleがJavaの公式サポートを打ち切る、というのが話題になったので、色々調べていて気づいたのだけれど、OracleがSunを買収してからというもの、Java界隈の動向が怪しくなっているように思った。AppleとしてはiOSへの囲い込みというのもあるのかも知れないが、将来性が不透明になってきているJavaへの投資をやめようという動機もあるのかもしれない。もしそうだとすると、ZFSの場合と同じ理由といえるかも。

そう思うと、1ベンダーが広める言語というのは、そのベンダーが無くなってしまったようなときに言語の存在価値が減じることもあるかもしれない。その点、C, C++, Lispなどベンダーとは(少なくとも仕様としては)関係ない言語の生存期間は、より長いと言えるかも知れない。

もしJavaが廃れてしまったら、マイブームのclojureも危うくなるなぁ。そうなると今度はnode.jsあたりになるのかな。JavaScript自体も一応ベンダー非依存の言語だし。Lisp->JavaScriptトランスレータもあるので、Lispでサーバサイドプログラミングというのは一応できるはず。

やれやれ...

more…