FC2ブログ

[Quartus]HPS(atlas-soc)

環境

ホストPC: x230 win10 home 64bit
Quartus: 17.1.0 build 590
評価ボード: atlas-soc


atlas-soc用にCyclone Vデバイスデータをダウンロード

QuartusへCyclone Vデバイスをインストール。


Quartusプロジェクト作成


Platform DesignerでHPSシステム作る

Cyclone Vデバイスをインストールしてないと、以下が選べない。
Platform Designer > IP Catalog > Processor and peripheral > Hard Processor System
 > Arria V/Cyclone V Processor System

スポンサーサイト

[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カウンタでチカチカした両方が見えているはず。

[Quartus]メモ

RAM使用状況

以下でSRAMの使用状況がわかる。
初期値ファイルとして、inst_ram_data.hexが記載されていたので、初期値はちゃんと設定されたようだ。

Quartus > Analysis & Synthesis > View Report > RAM Summary
 > inst_ram_data.hex
ether:ether1|lm32_top:LM32|lm32_cpu:cpu|lm32_instruction_unit:instruction_unit|pmi_ram_dp_true_altera:ram|altsyncram:ram|altsyncram_kni1:auto_generated|ALTSYNCRAM


メモ

分散RAM(ルックアップテーブルを使用したRAM)




SDC

create_generated_clock -name {clk16x} -source [get_ports {CLOCK_50}] -divide_by 2 -master_clock {CLOCK_50} [get_registers {system_top:mico32|uart_core:uart_module|intface:u_intface|clk16x_reg}]

derive_clocks -period 20
derive_pll_clocks

set_clock_uncertainty -rise_from [get_clocks {CLOCK_50}] -rise_to [get_clocks {clk16x}] 0.020
set_clock_uncertainty -rise_from [get_clocks {CLOCK_50}] -fall_to [get_clocks {clk16x}] 0.020







バッチ

#!/bin/csh -f

set prj_name = mico32_de0_nano

# update pof
quartus_cdb.exe --update_mif $prj_name
quartus_asm.exe $prj_name

# to check cable index
jtagconfig -n

# program to DE0 nano
quartus_pgm -c "USB-Blaster [USB-0]" $prj_name.cdf

[Quartus]トラブルシューティング

■Niosメモリ初期値データ生成方法1 = これやってもシミュレーションに使える.datとか見当たらない。
NiosII SBT > BSPフォルダをActive > メニューのProject > Properties > Nios II BSP Properties > ModelSim Only, no hardware support

■Niosメモリ初期値データ生成方法2 = これで.hex、.datが生成される。
NiosII SBT > アプリケーションフォルダ(BSPでない方)をActive
 > 右クリック > Make Targets > Build > mem_init_generateを選択 > Build
 > 以下.hex、.datが生成される。確かaltsyncramでは.hexか.mifしか読み込めないので.datは使えないと記憶。
    PJフォルダ\software\appliフォルダ\mem_init\nios_mem.hex
    PJフォルダ\software\appliフォルダ\mem_init\hdl_sim\nios_mem.dat

■QuartusII 13.1 ModelSim Alteraが起動できない原因
Quartus > Tools > Options > General > EDA Tool Options >
誤: C:\altera\13.1\modelsim_ase\win32aloem\
正: C:\altera\13.1\modelsim_ase\win32aloem ⇒ 末尾に\を追加。
RTLシミュレーション方法
Quaruts > Tools > Run Simulation Tool > RTL Simulation > これでModelSimが起動した。


■Nios II SBT

test.c:91:1: warning: control reaches end of non-void function [-Wreturn-type]

main関数の末尾に
return 0;
を書かないと出るWARNING



test.c:30:6: warning: return type of 'main' is not 'int' [-Wmain]


main関数を、intで宣言しないと出るWARNING
誤: void main() {
正: int main() {

[Quartus]`.rwdata' is not within region `mem'

make all
Info: Building ../hogehoge/
C:/intelFPGA_lite/16.1/nios2eds/bin/gnu/H-x86_64-mingw32/bin/make --no-print-directory -C ../hogehoge/
[BSP build complete]
Info: Compiling main.c to obj/default/main.o
nios2-elf-gcc -xc -MP -MMD -c -I../hogehoge//HAL/inc -I../hogehoge/ -I../hogehoge//drivers/inc -pipe -D__hal__ -DALT_NO_INSTRUCTION_EMULATION -DALT_SINGLE_THREADED -O0 -g -Wall -mno-hw-div -mno-hw-mul -mno-hw-mulx -mgpopt=global -o obj/default/main.o main.c
Info: Linking hoge.elf
nios2-elf-g++ -T'../hogehoge//linker.x' -msys-crt0='../hogehoge//obj/HAL/src/crt0.o' -msys-lib=hal_bsp -L../hogehoge/ -Wl,-Map=hoge.map -O0 -g -Wall -mno-hw-div -mno-hw-mul -mno-hw-mulx -mgpopt=global -o hoge.elf obj/default/main.o -lm -msys-lib=m
c:/intelfpga_lite/16.1/nios2eds/bin/gnu/h-x86_64-mingw32/bin/../lib/gcc/nios2-elf/5.3.0/../../../../../H-x86_64-mingw32/nios2-elf/bin/ld.exe: address 0x53dc of hoge.elf section `.rwdata' is not within region `mem'
c:/intelfpga_lite/16.1/nios2eds/bin/gnu/h-x86_64-mingw32/bin/../lib/gcc/nios2-elf/5.3.0/../../../../../H-x86_64-mingw32/nios2-elf/bin/ld.exe: address 0x6b54 of hoge.elf section `.bss' is not within region `mem'
c:/intelfpga_lite/16.1/nios2eds/bin/gnu/h-x86_64-mingw32/bin/../lib/gcc/nios2-elf/5.3.0/../../../../../H-x86_64-mingw32/nios2-elf/bin/ld.exe: address 0x53dc of hoge.elf section `.rwdata' is not within region `mem'
c:/intelfpga_lite/16.1/nios2eds/bin/gnu/h-x86_64-mingw32/bin/../lib/gcc/nios2-elf/5.3.0/../../../../../H-x86_64-mingw32/nios2-elf/bin/ld.exe: address 0x6b54 of hoge.elf section `.bss' is not within region `mem'
collect2.exe: error: ld returned 1 exit status
make: *** [hoge.elf] Error 1



memのメモリ容量を増やしたらエラー消えた。

Qsys > mem容量UP > Save > Generate HDL > NiosII SBT > Generate BSP > Build Project
の順。
カレンダー
08 | 2018/09 | 10
- - - - - - 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コード