”
NiosⅡ 9.0 IDE を使ってみる5(NiosⅡの設定を変更してみる) ”でNiosⅡ/sとNiosⅡ/fの比較を行った。今度は最後に残った軽量コアNiosⅡ/eでやってみることにした。ついでにBoard_diagのREADME.txtに従ってexboard_led_pio というLEDの名前をデフォルトのled_pio に変更した。(”
NiosⅡ 9.0 IDE を使ってみる4(インターフェースボードのLEDの点灯テスト) ”も参照)
最初に、SOPC Builder でNiosⅡ/eに変更した。これはキャッシュを持たないので、Caches and Memory Interfaces のEnable Burst のチェックはハイドされて選択できない。
いままで、LEDのSOPC Builder での名称はexboard_led_pio としてきたが、Board_diagのREADME.txtに下のように書いてある。(一部抜粋)
* Requirements * ************** * This program requires the following devices to be configured: * an LED PIO named 'led_pio',
Board_diagを使用してLEDのテストプログラムを自動生成してもらうためにはLEDのPIOの名前はled_pio である必要があるようなので、名前を変更することにした。
SOPC Builder のSystem Contents のexboard_led_pio をled_pio に変更した。
これでSOPC Builder で生成して、QuartusⅡでコンパイルした。そうしたらエラー発生。nois_sdramのポート宣言がexboard_led_pio のままだった。ここを修正して、ピンのアサインも変更する必要がある。
トップのnois2_sdram_led.v (niosのスペルが間違っているがこのままとする) のexboard_led_pio をled_pio に変更した。次に、IOピンのアサインはPin Planner でやるのが正式だろうが、面倒なので、nios2_sdram_led.qsf を直接書き換えてしまうことにした。
set_location_assignment PIN_88 -to exboard_led_pio[7] set_location_assignment PIN_90 -to exboard_led_pio[6] set_location_assignment PIN_94 -to exboard_led_pio[5] set_location_assignment PIN_96 -to exboard_led_pio[4] set_location_assignment PIN_99 -to exboard_led_pio[3] set_location_assignment PIN_102 -to exboard_led_pio[2] set_location_assignment PIN_106 -to exboard_led_pio[1] set_location_assignment PIN_112 -to exboard_led_pio[0]
を
set_location_assignment PIN_88 -to led_pio[7] set_location_assignment PIN_90 -to led_pio[6] set_location_assignment PIN_94 -to led_pio[5] set_location_assignment PIN_96 -to led_pio[4] set_location_assignment PIN_99 -to led_pio[3] set_location_assignment PIN_102 -to led_pio[2] set_location_assignment PIN_106 -to led_pio[1] set_location_assignment PIN_112 -to led_pio[0]
に書き換えた。
これでもう一度、QuartusⅡでコンパイルしたら通った。
NiosⅡIDEで、今までのboard_diag_0 とboard_diag_0_syslib を削除してもう一度作り直した。
board_diag_0 をBuild Project した。SignalTapⅡでコンフィグして、トリガをかけてから、NiosⅡIDEでRun As -> NiosⅡ Hardwareを選択する。
今度は、インクルードファイルをいじらなくても、Nios2 9.0 IDE の下のコンソールペインのNiosⅡTerminal Windowにa: Test LEDs のメニューが表示されている。
その時のSignalTapⅡの波形を下に示す。
完全にシングル転送となっている。
さて、a: Test LEDs がきちんと動作するかをチェックすることにする。その前にもう一度、SignalTapⅡのトリガをかける。
a キーを押すと、きちんとLEDが全部点灯した。成功。。。
a キーを押した時のSignalTapⅡの波形を下に示す。
やはり、シングル転送。当たり前か。。。
最後にTotal logic elements は58%(SignalTapⅡを含む)、やはり一番小さい。
(追加)
”
NiosⅡ 9.0 IDE を使ってみる5(NiosⅡの設定を変更してみる) ”のNiosⅡ/sでCaches and Memory Interfaces のEnable Burst のチェックをしないで、4つのバースト転送が発生したと書いた。これは、もしかして、NiosⅡプロセッサのバスユニットはバースト転送対応でなく、シングル転送対応だが、SDRAMのコントローラにコマンドを書き込んでReadする際に、SDRAMコントローラは、最初にアクティベートコマンドを発行してバンクをアクティブにする必要がある。それや、これやで、処理待ちしている間に、シングル転送のReadコマンドがSDRAMコントローラのFIFOバッファに積まれてしまったので、SDRAMコントローラがバースト転送してしまったのではないかと思う。NiosⅡ/sでCaches and Memory Interfaces のEnable Burst のチェックをした場合にはきっちり16バースト転送が行われている。これはキャッシュフィルの場合のバースト転送ができている。
とりあえず、このような現象が起きているのではないか?と推測している。
2009年08月20日 05:41 |
NiosⅡ EDS
| トラックバック:0
| コメント:0
”
NiosⅡ 9.0 IDE を使ってみる4(インターフェースボードのLEDの点灯テスト )”でスマートじゃないけどLEDのテストも出来たので、一旦NiosⅡのコアを入れ替えてみることにした。NiosⅡにコアは3種類あって、それぞれ機能が違っている。今は一番機能の多く、一番ロジックを使用するコアを使用してる。今回は2番目のNiosⅡ/sに変更した。これはいままでのNiosⅡ/f に比べて、データキャッシュやバレルシフタなどがない。
これでSOPC Builder で生成して、QuartusⅡでコンパイルした。するとやはり以前より小さくなった。Total logic elements が77%になった。(SignalTapⅡが入っている状態)以前は92%だった。下がNiosⅡ/s を実装した時のFlow summary。(ただし、SignalTapⅡが入っている状態)
下がNiosⅡ/f を実装した時のFlow summary。(ただし、SignalTapⅡが入っている状態)
SignalTapⅡで最初のSDRAMのReadをキャプチャしているのが、NiosⅡ/fの時にはバーストでアクセスされていたが、NiosⅡ/s を実装した時にはシングル転送だった。データキャッシュが入っていないせいだろうか?
下がNiosⅡ/fを実装した時の最初のSDRAMのReadのキャプチャ。
NiosⅡ/s を実装した時は、Nios2 9.0 IDE の下のコンソールペインにNiosⅡTerminal Windowが表示された状態では(キーを入力しなければ)SDRAMのReadは発生しない。これは命令キャッシュが入っているので当然だと思う。キー待ちのポーリング時はSDRAMにアクセスは発生しないはず。a キーを押すとSDRAMのReadアクセスが発生する。下図参照。
緑色で囲ったBurst Readの部分と黄色で囲ったSingle Readの部分が見える。たぶん、Burst Readの部分は命令、Single Readの部分はデータだと思われる。Single Readの部分はずいぶん上の方のアドレスを使用している。
下にNiosⅡ/fを実装した時、a キーを押した時のSDRAMのReadアクセスを示す。
Burst Readばかり。
最後にNiosⅡ/fを実装してSignalTapⅡを実装していない場合のTotal logic elements は79%だった。
256サンプルのSignalTapⅡに590のlogic elementsと9,728のmemory bitsを使用している。
(2009/08/19:追記)
くりさんに教えていただいて、SOPC BuilderのNiosⅡ CPUの設定項目のうちのCaches and Memory Interfaces で、Enable Bursts をチェックしてみた。デフォルトではチェックはされていないようだ。実はEnable Burstsにチェックを入れると、一番大きなNiosⅡ/fでは、リソースが多すぎてコンパイルができない。よって、NiosⅡ/sだけでやってみた。
Enable Burstsにチェックを入れて、SOPC BuilderでGenerateし、QuartusⅡでコンパイルする。NiosⅡ9.0 IDEからBuild Projectして、SignalTapⅡでコンフィグし000番地のReadアクセスでトリガをかけ、NiosⅡ9.0 IDEでRun As -> NiosⅡHardware を選択して、最初にSignalTapⅡにかかった波形が下の波形だ。
バーストReadしている。やはりEnable Burstsにチェックを入れるとバーストするようだ。次に、a キーを押した時にSignalTapⅡで000番地のReadアクセスでトリガをかけたらどんな波形が見えるかを見てみる。下の図画素の波形。
かなりバーストReadするようになった。0番地からF番地までバーストReadしているので、16バースト、32バイトを一度に読み込んでいる。
ちなみに上のSDRAM波形のコマンドは、最初からプリチャージ、プリチャージ、リフレシュ、アクティベート、バーストRead、プリチャージ、アクティベート、シングルRead、シングルRead、シングルRead、シングルRead。
やはり、Enable Burstsにチェックを入れる以前よりはバースト長が長い。でも、以前も4バーストReadはしていたようなので、Enable Burstというよりは、きっちり32バイト読み込むというイネーブルビットなのだろうか?
最後にどのくらい使用リソースが増えたかというと、下の図がQuartasⅡのFlow Summary。
Total logic elements が77%のところ85%になった。344個、logic elementsの使用が増えた。
やはりこのデバイスではNiosⅡをいろいろ試すのには小さいようだ。
2009年08月18日 06:19 |
NiosⅡ EDS
| トラックバック:0
| コメント:2
くりさんのご指摘のおかげで、(本当に恥ずかしいバグだった)”
NiosⅡ 9.0 IDE を使ってみる3(SDRAMが動作しない原因を追及がわからず...わかりました) ”でSDRAMを動作させることができた。
今度はテストできるはず?なのに、うまく行かないインターフェースボードのLEDをテストしてみることにした。
board_diag.h, board_diag.c を見ると、TestLEDs(void)関数があって、これを生かせば、そのままLEDのテストができるはず。だけど、下のようになっていて、LED_PIO_NAME をdefine しないと生きない。
#ifdef LED_PIO_NAME /* * static void TestLEDs(void) * * This function tests LED functionality. * It exits when the user types a 'q'. */ static void TestLEDs(void) {
そこで、#define LED_PIO_NAME をboard_diag.h に追加した。これでNios2 9.0 IDE でBuild Project をすると、エラー発生。
LED_PIO_BASEがdefine されていないそうだ。そこでSOPC Builder を起動してexboard_led_pio のベースアドレス0x00000000 を確認した。そのアドレスをLED_PIO_BASEの値としてdefine した。
結局、board_diag.h に追加したdefine は下の2つ。
#define LED_PIO_NAME #define LED_PIO_BASE 0x00000000
これでNios2 9.0 IDE でBuild Project をするとビルド出来て、Nios2 9.0 IDE の下のコンソールペインにNiosⅡTerminal Windowが表示された。
前回の表示よりも a: Test LEDs の項目が増えている。a を入力するとインターフェースボードのLED 8個がすべて点灯した。
ここでq を入力するとLEDテストが終了して8個の LED がすべて消灯した。
これでLEDはOK。
7セグメントLEDやRS-232Cもテストしてみようかな?
2009年08月16日 20:46 |
NiosⅡ EDS
| トラックバック:0
| コメント:8
”
NiosⅡ 9.0 IDE を使ってみる2(SDRAMが動作しない) ”でSDRAMのReadデータが出ていないことがわかった。今回は何とかしてSDRAMを動作させてみたい。
まずはSDRAMのイニシャライズ部分を見てみる。下のタイミングチャートに示す。
最初にプリチャージして、リフレッシュを2回、点線の部分がモードコマンドで、バースト長1、シーケンシャルモード、/CASレイテンシ3となっている。その後はReadしている。イニシャライズ手順は問題なさそう。
一度、sdram_clk を0度にしてやってみようと思う。やってみたがやはりだめだった。
sdram_clkを-30度にしてみたが、やはりだめだった。もう一度Pinの配置を見たけれど、問題ないみたいだ。
トップモジュールがVerilogだからダメということはないでしょうよね?原因がわからない。
サンプルをSignalTapⅡで見てみると読めているようだ。違いがわからない?
といういうわけで、いちおうサンプルではSOPC Builder , Nios2 IDEのテストをすることができたし、これでOKということにしようと思う。今度Alteraのツールを試す時には、
Digi-keyでDE1 を購入することにしたほうが良いかも?
しれないと思うようになった。 追記:くりさんに指摘していただきましたが、SDRAM_Dがoutputになっていました。正しくはinoutです。くりさん、本当にありがとうございました。
これでSDRAMのVerifyエラーもなくなりました。SDRAMがRead出来るようになりました。下図参照。
000hをReadして0014hが読めています。
NiosⅡ9.0 IDE を立ち上げて、board_diga0 で右クリックかRun AS... -> NiosⅡHardwareを選択すると、NiosⅡTerminal Windowが表示された。LEDは制御できなかった。この辺がまだなぞ?
しかし、inout がoutputと間違っていてもエラーが出ないのですね?自分で間違ったのが悪いとはいえ、エラーを出してほしかったかなと?ちょっとさみしいです。。。
2009年08月15日 06:59 |
NiosⅡ EDS
| トラックバック:0
| コメント:2
”
NiosⅡ 9.0 IDE を使ってみる1 ”でSDRAMのVerifyがエラーになって先に進めなかった。(
原因がわかりました 。SDRAM_Dの宣言をinout とする必要があるところをoutputにしてしまいました。)
動作するサンプル回路は、PLLのlockedとPowerONタイマータイムアウトのANDを取ってSOPC Builderで生成したNiosⅡシステムのリセットに入っている。FPGA技術Vol.4でも備前長船さんがaltpllのlocked 信号はロック前の準安定状態でもぽつぽつ1になってしまうと書いてあったので、それでPLLのlockedとPowerONタイマータイムアウトのANDを取っているのだと思う。
今回はALTPLLの設定にHold 'locked' output low for というオプションを見つけたので、それを入れてPowerONタイマータイムアウトは入れないでどうなるか様子を見てみることにした。
さて、初めにSOPC Builder を立ち上げてpll をDelete し、Generate ボタンをクリックしてシステムを生成する。
システムの生成が終了した。
SOPC Builder で生成してあったaltpllpll をMegaWizard Plug-In Managerで修正する。QuartusⅡのToolsメニューからMegaWizard Plug-In Manager... を選択する。ダイアログでEdit an existing custom megafunction variation を選択して、Next >ボタンをクリックする。altpllpll.v を選択してNext > ボタンをクリックして、設定を開始する。
Parameter Settings のInputs/Lock の項目で、Lock output のCreate 'locked' output にチェックを入れる。次にHold 'locked' output low for にもチェックを入れる。
これでaltpllpllの設定は終了したのでFinishボタンで終了した。
次にトップのnois2_sdram_led.v を修正した。altpllpll をインスタンシエーションした。具体的には下のようになった。
/ nois2_sdram_led `default_nettype none module nois2_sdram_led( input wire clk, input wire reset_n, output wire [7:0] exboard_led_pio, output wire sdram_clk, output wire [11:0] SDRAM_A, output wire [1:0] SDRAM_BA, output wire SDRAM_nCAS, output wire SDRAM_CKE, output wire SDRAM_nCS, output wire [15:0] SDRAM_D, output wire [1:0] SDRAM_DQM, output wire SDRAM_nRAS, output wire SDRAM_nWE); wire clk_pll; wire pll_locked; nois_sdram nois_sdram_inst ( .clk_0 (clk_pll), .out_port_from_the_exboard_led_pio (exboard_led_pio), .reset_n (pll_locked), .zs_addr_from_the_sdram (SDRAM_A), .zs_ba_from_the_sdram (SDRAM_BA), .zs_cas_n_from_the_sdram (SDRAM_nCAS), .zs_cke_from_the_sdram (SDRAM_CKE), .zs_cs_n_from_the_sdram (SDRAM_nCS), .zs_dq_to_and_from_the_sdram (SDRAM_D), .zs_dqm_from_the_sdram (SDRAM_DQM), .zs_ras_n_from_the_sdram (SDRAM_nRAS), .zs_we_n_from_the_sdram (SDRAM_nWE) ); altpllpll altpllpll_inst( .inclk0 ( clk ), .c0 ( clk_pll ), .c1 ( sdram_clk ), .locked ( pll_locked ) ); endmodule
これでQuartusⅡでコンパイルして通った。やってみたのですが、やはり同じでした。残念。もう一度サンプルと同じ回路を使ってやってみます。
サンプル回路とほとんど同じにしてみました。reset_nはスイッチにつながっているので、スイッチを押さなければ1です。クロックをcountでカウントしてcount[10] が1になって、altpllpll のlocked が1になった時、ANDでNoisⅡシステムのリセットが外れるようにしました。これでサンプル回路と同じはずです。(下にソースを示します)これでもSDRAMがFailしました。
// nois2_sdram_led `default_nettype none module nois2_sdram_led( input wire clk, input wire reset_n, output wire [7:0] exboard_led_pio, output wire sdram_clk, output wire [11:0] SDRAM_A, output wire [1:0] SDRAM_BA, output wire SDRAM_nCAS, output wire SDRAM_CKE, output wire SDRAM_nCS, inout wire [15:0] SDRAM_D, output wire [1:0] SDRAM_DQM, output wire SDRAM_nRAS, output wire SDRAM_nWE, output wire [7:0] digit); wire clk_pll; wire pll_locked; reg [10:0] count; wire reset_n_int_node, reset_n_int; nois_sdram nois_sdram_inst ( .clk_0 (clk_pll), .out_port_from_the_exboard_led_pio (exboard_led_pio), .reset_n (reset_n_int), .zs_addr_from_the_sdram (SDRAM_A), .zs_ba_from_the_sdram (SDRAM_BA), .zs_cas_n_from_the_sdram (SDRAM_nCAS), .zs_cke_from_the_sdram (SDRAM_CKE), .zs_cs_n_from_the_sdram (SDRAM_nCS), .zs_dq_to_and_from_the_sdram (SDRAM_D), .zs_dqm_from_the_sdram (SDRAM_DQM), .zs_ras_n_from_the_sdram (SDRAM_nRAS), .zs_we_n_from_the_sdram (SDRAM_nWE) ); altpllpll altpllpll_inst( .inclk0 ( clk ), .c0 ( clk_pll ), .c1 ( sdram_clk ), .locked ( pll_locked ) ); always @(posedge clk) begin if (!reset_n) count <= 11'd0; else begin if (count[10]==1'b0) count <= count + 11'd1; end end assign reset_n_int_node = count[10]; assign reset_n_int = reset_n_int_node & pll_locked; assign digit = 8'b1111_1111; // 7segment LED 消灯 endmodule
(2009/08/15:上のVerilog-HDLコードが間違っていたので、SDRAM_Dのoutputをinoutに変更しました。この下の3つの波形はSDRAM_Dをoutputとして測定した波形です。Readデータが出ていませんでした)
さてどうしよう?仕方がないので、この際せっかく
SignalTapⅡの使い方を練習 したので、SignalTapⅡでSDRAMとのやり取りを見てみることにした。
まずは、SDRAMにWrite しているところをキャプチャする。下の図。
SDRAMの領域をVerifyするのは、アドレス0番地から書いて読みだしているようだ。その0番地と1番地のWriteを見いる。最初にバンクをアクティベートしてから、0014hと0084hを書き込んでいる。
次のその番地をReadした時の値を見てみる。下の図参照。
0番地、1番地をReadしてもデータはFFFFhだ。読めていない。ちなみにリフレッシュはどうかというと。下の図。
ちゃんとプリチャージしてリフレッシュしている。間隔は20nsのクロックサイクルで256サンプル = 5.12us しかサンプルできないのでわからない。もうFPGAのリソースが残っていないので、これが限界だ。
2009年08月14日 06:15 |
NiosⅡ EDS
| トラックバック:0
| コメント:2
次に、日昇テクノロジーの
MAX II/Cyclone IIボードのマニュアル2009/2/26 の76ページ、第6章に従ってNiosⅡ 9.0 IDEを使ってみることにする。
最初に、前回作成した.sof をQuartusⅡのProgrammer から書き込む必要がある。nois2_sdram_led というプロジェクトなのだが、出来たSOFファイルはnios2_sdram_led_time_limited.sof だった。無料版なので時間制限があるのだろうか?
とにかくこれしかないのでProgrammer で書きこんだ。下図参照
そうすると、OpenCore Plus Status が出てくるので、そのままに置いておくそうだ。
次に、NiosⅡ9.0 IDE を立ち上げて、ワークスペースを今回のプロジェクトのフォルダに設定した。File メニューからNew -> NiosⅡ C/C++ Application を選択した。New Project ダイアログが起動した。
SOPC Builder System PTF File: にnois_sdram.ptf を選択し、Select Project Templete にBoard Diagnostics を選択してFinish ボタンをクリックする。
board_diag_0 を右クリックして、Build Project を選択し、ビルドを行う。
ビルドは結構長い。。。ビルドが終了したらエラーが出ていた。SYSID_BASEやSYSID_TIMESTAMPがundeclared だそうだ。
困った。Webを検索しても解決策は見つからなかったが、SYSID_BASEなどがsystem.h にあるのはわかった。boar_diag.h からsystem.h はインクルードされている。
とりあえず原因がわからないが、NoisⅡIDE起動時にもう1つNoisⅡIDEを起動していたのが原因だろうか?もう一度新しくプロジェクトを作って確かめてみることにする。
takepon256さんに教えていただいて、上の問題は解決できました。takepon256さんありがとうございました。
SOPC Builder を変更したので、”
SOPC Builderを使ってみる1 ”を変更しました。
もう一度、board_diag_0を作り直して、ビルドしたらもんだくなくビルド出来たようだ。なお、たぶんjtag_uart_0 ではなくてjtag_uart に名前を変えたほうがNoisⅡ9.0 IDEでWarningが出るのを防げるようだ。
左側のペインのboard_diag_0 で右クリックしてRun As -> Nois Ⅱ Hardware を選択した。そうするとmake し始める。
ここで、board_diag_0.elf のダウンロードから先に進まない。下に示すメッセージがコンソールに出てきた。
Using cable "USB-Blaster [USB-0]", device 1, instance 0x00 Pausing target processor: not responding. Resetting and trying again: OK Reading System ID at address 0x00000018: verified Initializing CPU cache (if present) OK Downloading 02000000 ( 0%) Downloading 02010000 (92%) Downloaded 70KB in 1.6s (43.7KB/s) Verifying 02000000 ( 0%) Verify failed between address 0x2000000 and 0x200FFFF Leaving target processor paused
SDRAMが動作していないのかな?
日昇テクノロジーのサンプルでやってみた。LEDがアサインされていないのかコマンドを打つとエラーになったが、Board Diagnosticsのコンソールは起動した。QuartusⅡで回路を見るとリセット回路が付加されている。もしかして、これを付けないと動作しないのか?付けてやってみることにした。
(2009/08/12:追記)
原因がわかりました。IOピンのうちSDRAM_nCSのアサインを忘れていました。
あわててSDRAM_nCSをPIN_191に指定しました。これでもう一度QuartusⅡでコンパイル。
やはり、NoisⅡIDEでSDRAMがVerify failが出るのは変わらず。。。
(2009/08/15:追記)
トップのVerilog-HDLをミスっていました。
SDRAM_Dをinoutとするところoutputと記述してしまいました。
2009年08月10日 05:39 |
NiosⅡ EDS
| トラックバック:0
| コメント:2