FC2ブログ

[Quartus]NiosII(DE0-nano)

環境

評価ボード: DE0-nano
ホストPC: x230 Windows 10 Home 64bit
Quartus Prime: 17.1.0 Build 590 10/25/2017


qsfファイルでピン配置設定

set_global_assignment -name TOP_LEVEL_ENTITY led_top
set_global_assignment -name FAMILY "Cyclone IV E"
set_global_assignment -name DEVICE EP4CE22F17C6
set_global_assignment -name MIN_CORE_JUNCTION_TEMP 0
set_global_assignment -name MAX_CORE_JUNCTION_TEMP 85

#============================================================
# CLOCK
#============================================================
set_location_assignment PIN_R8 -to clk
set_instance_assignment -name IO_STANDARD "3.3-V LVTTL" -to clk

#============================================================
# LED
#============================================================
set_location_assignment PIN_A15 -to led_out[0]
set_location_assignment PIN_A13 -to led_out[1]
set_location_assignment PIN_B13 -to led_out[2]
set_location_assignment PIN_A11 -to led_out[3]
set_location_assignment PIN_D1 -to led_out[4]
set_location_assignment PIN_F3 -to led_out[5]
set_location_assignment PIN_B1 -to led_out[6]
set_location_assignment PIN_L3 -to led_out[7]
set_instance_assignment -name IO_STANDARD "3.3-V LVTTL" -to led_out[0]
set_instance_assignment -name IO_STANDARD "3.3-V LVTTL" -to led_out[1]
set_instance_assignment -name IO_STANDARD "3.3-V LVTTL" -to led_out[2]
set_instance_assignment -name IO_STANDARD "3.3-V LVTTL" -to led_out[3]
set_instance_assignment -name IO_STANDARD "3.3-V LVTTL" -to led_out[4]
set_instance_assignment -name IO_STANDARD "3.3-V LVTTL" -to led_out[5]
set_instance_assignment -name IO_STANDARD "3.3-V LVTTL" -to led_out[6]
set_instance_assignment -name IO_STANDARD "3.3-V LVTTL" -to led_out[7]

#============================================================
# KEY
#============================================================
# KEY1
set_location_assignment PIN_E1 -to reset
set_instance_assignment -name IO_STANDARD "3.3-V LVTTL" -to reset




sdcでタイミング制約

create_clock -period 20 [get_ports clk]
derive_pll_clocks





回路トップを作る

LED 4bitは、HWカウンタ出力。(ハードウェア動作確認用)
LED 3bitは、NiosからのPIO出力。(ソフトウェア動作確認用)
LED 1bitは、reset入力をそのままスルー出力。

module led_top (
clk
, reset
, led_out
);

input clk ;
input reset ;
output [7:0] led_out ;

reg [31:0] led_reg ;
wire [31:0] pio_out ;

always @ (posedge clk) begin
if (~reset)
led_reg <= 0 ;
else
led_reg <= led_reg + 1 ;
end

assign led_out[0] = led_reg[24] ;
assign led_out[1] = led_reg[25] ;
assign led_out[2] = led_reg[26] ;
assign led_out[3] = led_reg[27] ;

assign led_out[4] = pio_out[0] ;
assign led_out[5] = pio_out[10] ;
assign led_out[6] = pio_out[18] ;
assign led_out[7] = reset ;

nios nios1 (
.clk_clk (clk )
, .pio_out_export (pio_out )
, .reset_reset_n (reset )
);

endmodule





Quartusプロジェクト作成

簡単なので省略。


Platform DesignerでNiosIIシステムを作る

Platform DesignerでNios /e入りのシステムを作る。

Quartus > Tools > Platform Designer
 > IP Catalogから呼び出すIPは、Nios、On chip memory(1port)(インスタンス名ram)、PIO。

 > clk_0クロックソース > 「Clock Input」、「Reset Input」共に、Export設定。入力端子名をつける。

 > Niosプロパティ > Mainタブ > /e選択
 > Niosプロパティ > Vectorsタブ > Reset vector memory = ram.s1
 > Niosプロパティ > Vectorsタブ > Exception vector memory = ram.s1

 > On chip memoryプロパティ > RAM(Writable)、1port設定(Dualにチェック無)、Total size=32768、
 > On chip memoryプロパティ > Initialize memory contentsにチェック、
 > On chip memoryプロパティ > Use created initialization fileで、後述で生成する、.hexファイルパスを指定。

 > pioプロパティ > Width=32、Direction=output

Platform Designer > System > Assign base addresses
Platform Designer > File > Save
Platform Designer > Generate > Generate HDL > Verilogを指定してGenerateボタン

これでNios含むシステムのVerilogソースが生成された。



Quartusで必要ファイル登録

Quartus > Assignments > Settings > 以下ファイルを登録。

nios/synthesis/nios.qip  > Platform Designで生成したNiosシステムVerilog
led_top.sdc  > 上で作成したsdc
led_top.qsf  > 上で作成したqsf
led_top.v  > 上で作成した回路トップ





Niosプログラムを作る

Platform Designerで自動アサインされたPIOのアドレスを以下defineで設定。
あとは単なるLEDチカチカのプログラム。

#define GPIO *(( volatile unsigned int *)0x00011010)

void wait(int n)
{
int i, j;
for(long i=0; i for(long j=0; j<2000; j++);
}

int main()
{

while(1)
{
GPIO = 0xffffffff ;
wait(500);
GPIO = 0x00000000 ;
wait(500);
}


return 0;
}



Niosプログラムをビルド

Quartus > Tools > NiosII Software build Tools for Eclipse (以降NiosII SBT)

新規プロジェクトを作る。
NiosII SBT > File > New > NiosII Application and BSP from templete
 > SOPC informatoin file nameにPlatform Designerで自動生成されたファイルを指定
 > Project nameをてきとーに決める。(今回hoge)
 > Use default locatoinにチェック
 > Templetes = Blank Project
これでプロジェクトを生成する。(ウィンドウ左に、hoge、hoge_bspができる)

上で作ったプログラムを、hogeフォルダへコピー。

NiosII SBT > 左側のhogeプロジェクト > 右クリック > Build Project

エラーが無ければ、 \Software\hoge\hoge.elfが生成される。

エラー出る場合は、おそらくBSPを更新しろってやつ。
その場合は、
hoge_bsp > 右クリック > NiosII > Generate BSP で更新する。
それでさらにエラー出た場合は、
hoge > 右クリック > Clean Project
hoge_bsp > 右クリック > Clean Project
をやってから再度Generate BSP。
さらに、それでもうまくいかない場合は、hogeプロジェクトを別名で新規に作ればうまく行くと思う。


elfからメモリ初期化ファイル生成

NiosII SBT > 左側のhogeプロジェクトを展開 > hoge.elf > 右クリック > Make Target
 > Build > mem_init_targetを選択 > Build

これで
\software/hoge2/mem_init/nios_iram.hex
が生成される。



hexをメモリ初期値に登録

Platform Designer > On chip memoryプロパティ
 > Use created initialization fileで、さっき生成した.hexファイルパスを指定。


Quartusでコンパイル

ようやく以下回路が揃った。

FPGAトップ
Niosシステム + メモリ初期化ファイル

これでコンパイルして、.sofを作る。



評価ボードへダウンロード

Quartus > Tools > Programmer
 > Hardware SetupでUSB Blasterが選択されている事。
 > Mode = JTAG
 > output_files/led_top.sofが選択されている事。
 > 左側STARTボタン

右上プログレスバーがSuccessfulとなれば、成功。
評価ボード上では、NiosIIでLEDチカチカしたものと、HWカウンタでチカチカした両方が見えているはず。
スポンサーサイト



カレンダー
03 | 2018/04 | 05
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 - - - - -
累積訪問者
現在の訪問者
現在の閲覧者数:
最新記事
最新トラックバック
最新コメント
月別アーカイブ
カテゴリ
プロフィール

bobgosso

Author:bobgosso
FPGAのブログへようこそ!

検索フォーム
RSSリンクの表示
リンク
ブロとも申請フォーム

この人とブロともになる

QRコード
QRコード