Más contenido relacionado
La actualidad más candente (20)
Similar a Vivado hls勉強会3(axi4 lite slave) (20)
Vivado hls勉強会3(axi4 lite slave)
- 2. 2
注意点
● 元はVivado HLS 2014.4で作製した資料を修正が
必要なところだけVivado HLS 2015.4に修正して
あります
● よって、Vivado HLSのウインドウにOpen Wave
viewer…が無い画面がありますがご了承下さい
- 4. 4
これから何するのか?2
● Vivado 2015.4
– Vivadoでプロジェクトを作製
– AXI4 Lite Slave (multi_apuint) IPをIP Catalogに登録
– ブロックデザインにIPを追加し、回路を構成
– 制約ファイルを追加
– 論理合成、インプリメント、ビットストリームの生成
– ハードウェアをエクスポートして、SDK起動
– Vivado HLSが作ったドライバを使用し、ソフトウェアを作製
– 実機確認
- 5. 5
これから作る回路
● ARMプロセッサ(Master)がmulti_apuint IP(Slave)の
multi_in0_V, multi_in1_Vレジスタに値をWriteする
● 掛け算を実行し、multi_out_Vレジスタに結果をWriteする
● ARMプロセッサがステータスをReadして、multi_out_Vレジスタ
の値をReadする
multi_in0_V register
multi_in0_V register
multi_out_V register
Control and Status
registers
AXI4 Lite Slave
Interface
*
AXI4-Lite
multi_apuint IP
CPU
ARM(Cortex-A9)
Master
Slave
- 7. 7
AXI4バス
● AXI4バス ー ARM社のAMBAバスの一種
● 主にICチップ内部のバス
● AXI4バスには3種類ある(Master, Slave)
– AXI4 ー メモリマップ式の高性能バス
– AXI4-Lite ー シングル転送のメモリマップ式のバス
– AXI4-Stream ー 高速のデータ・ストリーミング用バス
●
参考文献
– AXIリファレンスガイド UG761 (v13.1) 2011 年 3 月 7 日
● http://japan.xilinx.com/support/documentation/ip_documentation/j
_ug761_axi_reference_guide.pdf
– 7 axi4 バス説明、axi4バスを使用したカスタムipの作成方法2
● http://www.slideshare.net/marsee101/7-axi4-axi4ip2-44567631
- 9. 9
AXI4バスの接続図
AXI4 Master 1 AXI4 Master 2
AXI Interconnect
AXI4 Slave 1
AXI4 Master 1
AXI4 Slave 2
AXI4-Lite
Slave 1
AXI4-Lite
Slave 2
- 10. 10
AXI4のチャネル
● 読み出しアドレスチャネル (Read address
channel)
● 読み出しデータチャネル (Read data channel)
● 書き込みアドレスチャネル (Write address
channel)
● 書き込みデータチャネル (Write data channel)
● 書き込み応答チャネル (Write response channel)
- 29. 29
AXI4 Lite Slaveを
Vivado HLSで生成
● INTERFACEディレクティブのOptionsのうちのmodeをs_axiliteに変
更する
● デフォルトでは1つのAXI4 Lite Slaveにまとめられる
● AXI4 Lite Slaveポートにユニークなバス名を入れたい時はbundle
を設定する
● 今回はあえてbundleを設定してある
● bundleのバス名ごとにAXI4 Lite Slaveインターフェースが生成され
る
● 例えば、A, B, C, Dという引数があるとする
– A, Bのmodeをs_axiliteに、bundleをYYにする
– C, Dのmodeをs_axiliteに、bundleをZZにする
– 2つのAXI4 Lite Slaveインターフェースが生成される
- 36. 36
multi_apuint.cpp
// multi_apuint.cpp
#include <stdio.h>
#include <string.h>
#include <ap_int.h>
void multi_apuint(ap_uint<8> multi_in0, ap_uint<8> multi_in1,
ap_uint<16> *multi_out){
#pragma HLS INTERFACE s_axilite port=multi_in1 bundle=AXI4LS
#pragma HLS INTERFACE s_axilite port=multi_in0 bundle=AXI4LS
#pragma HLS INTERFACE s_axilite port=multi_out bundle=AXI4LS
#pragma HLS INTERFACE s_axilite port=return bundle=AXI4LS
*multi_out = multi_in0 * multi_in1;
}
- 43. 43
Cコードの合成と結果
● Run C Synthesisボタンをクリックして、Cソースコードの合成を行った
● TimingのSummaryでClockのTarget周期が10nsのところ、8.38 nsなので問題無い
● Syn->Verilogに、multi_apuint_AXILiteS_s_axi.vとmulti_apuint.vが生成された
- 45. 45
multi_apuint_AXILiteS_s_axi.vの
メモリマップ//------------------------Address Info-------------------
// 0x00 : Control signals
// bit 0 - ap_start (Read/Write/SC)
// bit 1 - ap_done (Read/COR)
// bit 2 - ap_idle (Read)
// bit 3 - ap_ready (Read)
// bit 7 - auto_restart (Read/Write)
// others - reserved
// 0x04 : Global Interrupt Enable Register
// bit 0 - Global Interrupt Enable (Read/Write)
// others - reserved
// 0x08 : IP Interrupt Enable Register (Read/Write)
// bit 0 - Channel 0 (ap_done)
// others - reserved
// 0x0c : IP Interrupt Status Register (Read/TOW)
// bit 0 - Channel 0 (ap_done)
// others - reserved
// 0x10 : Data signal of multi_in0_V
// bit 7~0 - multi_in0_V[7:0] (Read/Write)
// others - reserved
// 0x14 : reserved
// 0x18 : Data signal of multi_in1_V
// bit 7~0 - multi_in1_V[7:0] (Read/Write)
// others - reserved
// 0x1c : reserved
// 0x20 : Data signal of multi_out_V
// bit 15~0 - multi_out_V[15:0] (Read)
// others - reserved
// 0x24 : Control signal of multi_out_V
// bit 0 - multi_out_V_ap_vld (Read/COR)
// others - reserved
// (SC = Self Clear, COR = Clear on Read, TOW = Toggle on Write, COH = Clear on Handshake)
- 47. 47
C/RTLコシミュレーション
● Run C/RTL Cosimulationボタンをクリックし、HDL
ベースでのシミュレーションを行う
● Co-simulation Dialogで、Dump Trace を none か
ら all に設定を変更する
● OKボタンをクリックする
- 50. 50
AXI4-Lite インターフェース
● AXI Lite インターフェースの特徴
– すべてのトランザクションの転送長が1(バースト転送無し)
– データバス幅は32または64ビット、Xilinxの仕様では32ビット幅
– すべてのアクセスが Non-modifiable, Non-bufferable
– 排他的アクセスは無し
– IPのレジスタ設定などに使用
● FPGAの部屋のAXI4 Lite Slaveの解説ページ
– http://marsee101.blog19.fc2.com/blog-entry-2165.html
– http://marsee101.blog19.fc2.com/blog-entry-2167.html
- 52. 52
AXI4-Liteインターフェースの
Read信号
● Read address channel
– ARADDR[31:0] アドレス、32ビット、64ビット
– ARVALID Read Address Valid
– ARREADY Read Address Ready
– ARPORT[2:0] 保護タイプ
● Read data channel
– RDATA[31:0] データ、32ビット、64ビット、128ビット
– RRESP[1:0] Read Response
– RVALID Read Valid
– RREADY Read Ready
- 54. 54
AXI4-Liteインターフェースの
Write信号
● Write address channel
– AWADDR[31:0] アドレス、32ビット、64ビット
– AWVALID Write address valid
– AWREADY Write address ready
– AWPROT[2:0] 保護タイプ
● Write data channel
– WDATA[31:0] データ、32ビット、64ビット、128ビット
– WSTRB[3:0] バイトイネーブル、幅はWDATA/8
– WVALID Write valid
– WREADY Write ready
● Write response channel
– BRESP[1:0] Write Response
– BVALID Write response valid
– BREADY Write response ready
- 60. 60
C/RTLコシミュレーション波形の説明
● 0x00番地をRead (0x4) ー bit 2が1 (ap_idle)
● 0x10番地にWrite (0x0) ー multi_in0_Vに0を
Write
● 0x18番地にWrite (0x1) ー multi_in1_Vに1を
Write
● 0x00番地をRead (0x4) ー bit 2が1 (ap_idle)
● 0x00番地にWrite (0x1) ー bit 0が1 (ap_start)
● 0x24番地をRead (0x1) ー bit 0が1
(multi_out_V_ap_vld)
● 0x20番地をRead (0x0) ー multi_out_VをRead
- 61. 61
multi_apuint_AXILiteS_s_axi.vの
メモリマップ//------------------------Address Info-------------------
// 0x00 : Control signals
// bit 0 - ap_start (Read/Write/SC)
// bit 1 - ap_done (Read/COR)
// bit 2 - ap_idle (Read)
// bit 3 - ap_ready (Read)
// bit 7 - auto_restart (Read/Write)
// others - reserved
// 0x04 : Global Interrupt Enable Register
// bit 0 - Global Interrupt Enable (Read/Write)
// others - reserved
// 0x08 : IP Interrupt Enable Register (Read/Write)
// bit 0 - Channel 0 (ap_done)
// others - reserved
// 0x0c : IP Interrupt Status Register (Read/TOW)
// bit 0 - Channel 0 (ap_done)
// others - reserved
// 0x10 : Data signal of multi_in0_V
// bit 7~0 - multi_in0_V[7:0] (Read/Write)
// others - reserved
// 0x14 : reserved
// 0x18 : Data signal of multi_in1_V
// bit 7~0 - multi_in1_V[7:0] (Read/Write)
// others - reserved
// 0x1c : reserved
// 0x20 : Data signal of multi_out_V
// bit 15~0 - multi_out_V[15:0] (Read)
// others - reserved
// 0x24 : Control signal of multi_out_V
// bit 0 - multi_out_V_ap_vld (Read/COR)
// others - reserved
// (SC = Self Clear, COR = Clear on Read, TOW = Toggle on Write, COH = Clear on Handshake)
- 67. 67
これから何するのか?2
● Vivado 2015.4
– Vivadoでプロジェクトを作製
– AXI4 Lite Slave (multi_apuint) IPをIP Catalogに登録
– ブロックデザインにIPを追加し、回路を構成
– 制約ファイルを追加
– 論理合成、インプリメント、ビットストリームの生成
– ハードウェアをエクスポートして、SDK起動
– Vivado HLSが作ったドライバを使用し、ソフトウェアを作
製
– 実機確認
- 68. 68
Vivado HLSのIPの接続方法
● PSのAXI_GPポートからAXI Interconnectを通し
て、multi_apuint IPへ接続する
● multi_apuint IPはPSにアドレスマップされる
Processing System(PS)
ARM(Cortex-A9) Dual
AXI_GPポート AXI
Interconnect
multi_apuint
IP
Programmable Logic
(PL)
- 69. 69
Digilent社のボード・ファイル
● ZYBOボード のPSの定義ファイル ZYBO_zynq_def.xml
が、いつの間にか無くなってボード・ファイルをVivadoの
ボード・ファイル・フォルダにコピー&ペーストする方式に変
更になった
● ボード・ファイルをインストールする手順
– Digilent社のGitHubからボード・ファイル(ZIPファイル)をダウン
ロード
● https://github.com/Digilent/vivado-boards/archive/master.zip
– ダウンロードしたZIPファイルを解凍(vivado-boards-
masternewboard_filesフォルダにボード・ファイルがある)
– XilinxVivado<バージョン番号
(2015.4)>databoardsboard_filesフォルダに解凍したボード・
ファイルをコピー&ペースト
- 73. 73
New Projectダイアログ
● Project Typeの設定で、RTL Projectのラジオボタ
ンが選択されていることを確認し、Next >ボタンを
クリックする
● Add Sourcesは、デフォルトのまま、Next >ボタン
をクリックする
● Add Existing IP (optional)は、デフォルトのまま、
Next >ボタンをクリックする
● Add Contraints (optional)は、デフォルトのま
ま、Next >ボタンをクリックする
- 77. 77
これから何するのか?2
● Vivado 2015.4
– Vivadoでプロジェクトを作製
– AXI4 Lite Slave (multi_apuint) IPをIP Catalogに登録
– ブロックデザインにIPを追加し、回路を構成
– 制約ファイルを追加
– 論理合成、インプリメント、ビットストリームの生成
– ハードウェアをエクスポートして、SDK起動
– Vivado HLSが作ったドライバを使用し、ソフトウェアを作
製
– 実機確認
- 86. 86
これから何するのか?2
● Vivado 2015.4
– Vivadoでプロジェクトを作製
– AXI4 Lite Slave (multi_apuint) IPをIP Catalogに登録
– ブロックデザインにIPを追加し、回路を構成
– 制約ファイルを追加
– 論理合成、インプリメント、ビットストリームの生成
– ハードウェアをエクスポートして、SDK起動
– Vivado HLSが作ったドライバを使用し、ソフトウェアを作
製
– 実機確認
- 87. 87
ZYNQ7 Processing System
● ZynqのARMプロセッサIP
● FIXED_IO(MIO)とDDRのポート
● AXI_GPマスタ&スレーブ、32ビット幅、各2ポート
● AXI_HPスレーブ、32または64ビット幅、4ポート
● AXI_ACPスレーブ、64ビット幅、1ポート
● PSからPLへのクロック4個
● ZYBOの設定を読み込める(DigilentのWebからダウ
ンロード)
– ZYBO_zynq_def.xml
- 105. 105
これから何するのか?2
● Vivado 2015.4
– Vivadoでプロジェクトを作製
– AXI4 Lite Slave (multi_apuint) IPをIP Catalogに登録
– ブロックデザインにIPを追加し、回路を構成
– 制約ファイルを追加
– 論理合成、インプリメント、ビットストリームの生成
– ハードウェアをエクスポートして、SDK起動
– Vivado HLSが作ったドライバを使用し、ソフトウェアを作
製
– 実機確認
- 107. 107
これから何するのか?2
● Vivado 2015.4
– Vivadoでプロジェクトを作製
– AXI4 Lite Slave (multi_apuint) IPをIP Catalogに登録
– ブロックデザインにIPを追加し、回路を構成
– 制約ファイルを追加
– 論理合成、インプリメント、ビットストリームの生成
– ハードウェアをエクスポートして、SDK起動
– Vivado HLSが作ったドライバを使用し、ソフトウェアを作
製
– 実機確認
- 114. 114
これから何するのか?2
● Vivado 2015.4
– Vivadoでプロジェクトを作製
– AXI4 Lite Slave (multi_apuint) IPをIP Catalogに登録
– ブロックデザインにIPを追加し、回路を構成
– 制約ファイルを追加
– 論理合成、インプリメント、ビットストリームの生成
– ハードウェアをエクスポートして、SDK起動
– Vivado HLSが作ったドライバを使用し、ソフトウェアを作
製
– 実機確認
- 128. 128
これから何するのか?2
● Vivado 2015.4
– Vivadoでプロジェクトを作製
– AXI4 Lite Slave (multi_apuint) IPをIP Catalogに登録
– ブロックデザインにIPを追加し、回路を構成
– 制約ファイルを追加
– 論理合成、インプリメント、ビットストリームの生成
– ハードウェアをエクスポートして、SDK起動
– Vivado HLSが作ったドライバを使用し、ソフトウェアを作
製
– 実機確認
- 133. 133
multi_test.c ソースコード 1/2// multi_test.c
// 2015/07/24 : by marsee
// multi_in0 の入力の時に999を入力すると終了する
//
#include <stdio.h>
#include "xmulti_apuint.h"
#include "xparameters.h"
int main(){
XMulti_apuint XMluti_ap;
XMulti_apuint_Config *XMulti_apPtr;
int val;
// Look Up the device configuration
XMulti_apPtr = XMulti_apuint_LookupConfig(0);
if (!XMulti_apPtr){
fprintf(stderr, "XMulti_apuint configuration failed.n");
return(-1);
}
// Initialize the Device
int Xlap_status = XMulti_apuint_CfgInitialize(&XMluti_ap, XMulti_apPtr);
if (Xlap_status != XST_SUCCESS){
fprintf(stderr, "Could not Initialize XMulti_apuintn");
return(-1);
}
- 134. 134
multi_test.c ソースコード 2/2
while(1){
printf("nrmulti_in0 = ");
scanf("%d", &val);
if(val == 999)
break;
XMulti_apuint_Set_multi_in0_V(&XMluti_ap, val);
printf("nrmulti_in1 = ");
scanf("%d", &val);
XMulti_apuint_Set_multi_in1_V(&XMluti_ap, val);
while(!XMulti_apuint_IsIdle(&XMluti_ap)) ;
XMulti_apuint_Start(&XMluti_ap);
while(!XMulti_apuint_IsDone(&XMluti_ap)) ;
printf("nrmulti_out = %dnr", (int)XMulti_apuint_Get_multi_out_V(&XMluti_ap));
}
return(0);
}
- 135. 135
これから何するのか?2
● Vivado 2015.4
– Vivadoでプロジェクトを作製
– AXI4 Lite Slave (multi_apuint) IPをIP Catalogに登録
– ブロックデザインにIPを追加し、回路を構成
– 制約ファイルを追加
– 論理合成、インプリメント、ビットストリームの生成
– ハードウェアをエクスポートして、SDK起動
– Vivado HLSが作ったドライバを使用し、ソフトウェアを作
製
– 実機確認
- 146. 146
Run As
● Run Asダイアログが表
示された
● Launch on Hardware
(GDB)をクリックする
● OKボタンをクリックする
- 150. 150
まとめ1
● Vivado HLS勉強会1、2で使用した掛け算のプロジェ
クトをAXI4-Lite Slaveインターフェースにする
● Vivado HLS 2015.4
– Vivado HLS 2015.4のプロジェクトを新規作成
– C++ソースコードとテストベンチは勉強会2の物を使用する
– INTERFACEディレクティブ(AXI4 Lite Slave mode)
– CからHDLを生成
– C/RTLコシミュレーション
– VivadoでC/RTLコシミュレーションの波形を確認
– IPとしてパッケージ
- 151. 151
まとめ2
● Vivado 2015.4
– Vivadoでプロジェクトを作製
– AXI4 Lite Slave (multi_apuint) IPをIP Catalogに登録
– ブロックデザインにIPを追加し、回路を構成
– 制約ファイルを追加
– 論理合成、インプリメント、ビットストリームの生成
– ハードウェアをエクスポートして、SDK起動
– Vivado HLSが作ったドライバを使用し、ソフトウェアを作製
– 実機確認
- 152. 152
参考文献
● Vivado Design Suite ユーザー ガイド 高位合成
UG902 (v2014.3) 2014 年 10 月 1 日
– http://japan.xilinx.com/support/documentation/sw_m
anuals_j/xilinx2014_4/ug902-vivado-high-level-synt
hesis.pdf
● Vivado Design Suite ユーザー ガイド 高位合成
UG902 (v2015.3) 2015 年 9 月 30 日
– http://japan.xilinx.com/support/documentation/sw_m
anuals_j/xilinx2015_3/ug902-vivado-high-level-synt
hesis.pdf
–