思いつきメモ FPGA
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でインスタンスを作るときに決まる。
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ポートだけしか使えない ...
LMBの使い方
Xilinx Platform StudioでLMBのサイズを変更するには、dlmb_cntlr, ilmb_cntlrを右クリックし、Configure IP....を選択 > LMBのアドレスレンジを設定。このレンジの幅でメモリサイズが決まるようだ。LMBバス幅が32bitの場合は、lmb_bramの最大サイズは256Kbytes(Virtex-5の場合)。
more…MicroBlaze + IPコア
XilinxのMicroblazeに自作IPコアをどのように接続するかを調査中。いろいろ検索してみたが、要領よくまとまっている資料が見つからなかった。
C to Verilog
C to Verilogというサイトを見つけた。最近はいろいろ高位合成ツールもあるようだけれど、きっと高価なものだと想像してしまう。このサイトだと、無料でCコードからVerilogコードを生成してくれる。試しに、サイトにもあるpop countのコードをverilogに変換してシミュレーションしてみた。
ちなみに、ポップカウントというのは、変数中の1の数のこと。例えば、a=0x12だと、二進数で00010010だから、ポップカウントは2になる。
ポップカウントを計算したいデータ(モジュールへの入力)は、mem_BというBRAMに格納されている。また、計算結果はmem_Aに格納する。
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をライトするための信号。
正しく求められていることが分かる。
少し試して見ただけだが ... more…
NIOS2カスタム命令
NIOS2で計算を高速化するためにカスタム命令を実装してみた。最初は、レイテンシ固定で実装してみたのだが、どうやっても計算結果がおかしい。クロック数がずれているのかと思っていくつか試してみたが、だめ。それで結局、レイテンシ可変にして、START, DONE信号をモジュールで処理するようにしたら動いた。Quartus II 9.0 SP2で実験。
more…NIOS+DDR2
これまでNIOS2を使ったシステムでDDR2コントローラを使うときには、コントローラはAvalonバスに接続せずに、CPU外に置いていた。今回、ちょっと思い立ってAvalonバスに接続して試してみることにした。
しかしはまった点がある。インプリメントしたSOFをボードにダウンロードするまでは良いのだが、Nios II IDEからファームをダウンロードして実行しようとしても、target processor not responding(正確ではないかも)のようなメッセージが出て、CPUが動作しない。いろいろ試して検索してみた結果、DDR2コントローラのポートglobal_reset_n_to_the_altmemddr_0をCPUからPIOで操作しようとしているのが悪さをしているらしいと分かった。これをFPGA端子に入力されているRSTnピンにしたら、ファームのダウンロードもできるようになった。これで半日つぶれてしまった。
Avalonバスのメモ
Avalon-MMのバス幅
マスターが32bitでスレーブが16bitの場合、マスター側で32bit readを行うと、スレーブ側では16bit readが2回発行される。このようになるので、マスター側から見ると、スレーブのデータ空間のアドレスは連続して見える。(Avalon Interface Specifications 3.6.1)
デジタルズーム(2)
前回の続き
前回はバイキュービック関数から、画素補間に使用する係数をどのように求めるのかということを記述しました。
今回は、「画素補間に使用する元画素をどのように求めるのか」ということについて記述します。前回と同じように、ズーム前の画素がd0,d1,d2,d3,...と並んでいるとします。すると、ズームのために参照する画素としては、1倍(ズームなし)の場合は、最初はd0,d1,d2,d3、次はd1,d2,d3,d4、その次はd2,d3,d4,d5、...以下同様となります。これは当たり前ですね。
次に2倍の場合は、最初はd0,d1,d2,d3、次もd0,d1,d2,d3、その次はd1,d2,d3,d4、その次もd1,d2,d3,d4 ...
SOPC BuilderにてSRAMを使う
めも。
QuartusIIのSOPC BuilderでSRAMを使いたい。QuartusIIにはCypressのコンポーネントが付いているが、ビット幅などが使用したいものと違うので、コンポーネントを作成する必要があった。
Component Editorを起動してAvalon-MM Tristate Slaveをテンプレートから作成すると、とりあえずコンポーネントはできるものの、NIOSIIのメモリとして使用できない。調べた結果、(コンポーネント名)_hw.tclにある、isMemoryDeviceというのを、"false"から"true"にすればOKであると分かった。