PSからPLのモジュールへ値を読み書きしたいとき、AXI経由で読み書きするのが普通かと思う。
モジュールがAXIに対応していなければ、AXIとの変換モジュールを作ることになる。
その場合、
- GPIOモジュールを使う
- RTLをガリガリ書く
と言う手段があるが、GPIOではどのレジスタの何ビット目が何だったかがコードに現れないので辛いし、
RTL書くのは輪をかけて面倒である。
というわけでHLSで書く。イメージとしてはこんな感じ。
typedef struct{
int32_t A;
bool B;
} Config_write;
typedef struct{
uint16_t C;
bool D;
uint8_t E;
} Config_read;
void HogeConfigurator(
Config_write wcfg_axi,
Config_read& rcfg_axi,
Config_write& wcfg_pl,
Config_read rcfg_pl
){
wcfg_pl = wcfg_axi;
rcfg_axi = rcfg_pl;
}
PLへ書き込む設定値はConfig_write
、PLから読み込む設定値はConfig_read
構造体にまとめる。
引数の~_axi
はAXI側、_pl
はモジュール側である。
_axi
と関数本体のインターフェースをs_axilite
にして
_pl
のインターフェースをap_none
にすればAXI経由で操作でき、おまけにドライバをHLSが生成してくれる。
(本当にap_noneでええんか?validいらんのか?と警告が出るが無視する。)
レジスタ指定をつければ、XHogeConfigurator_Start()
を呼ぶとまとめて変更が反映される動作になるし、
つけなければ即座に変更が反映される動作になる。