”
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