FC2カウンター FPGAの部屋 intel HLS コンパイラを試してみる11(mm_slave その1)
fc2ブログ

FPGAやCPLDの話題やFPGA用のツールの話題などです。 マニアックです。 日記も書きます。

FPGAの部屋

FPGAの部屋の有用と思われるコンテンツのまとめサイトを作りました。Xilinx ISEの初心者の方には、FPGAリテラシーおよびチュートリアルのページをお勧めいたします。

intel HLS コンパイラを試してみる11(mm_slave その1)

intel HLS コンパイラを試してみる10(examples\tutorials\interfaces\mm_master_testbench_operators その2)”の続き。

前回は、examples\tutorials\interfaces\mm_master_testbench_operators をやってみたが、今回は、intel HLS のチュートリアルの F:\intelFPGA_lite\17.1\hls\examples\tutorials\interfaces\mm_slave をやってみることにする。

mm_slave は、intel HLS によるAvalon-MM Slave インターフェース・モジュールのいろいろな実装をテストすることができるサンプルだ。これを見れば、intel HLS によるAvalon-MM Slave インターフェースの実装の仕方が分かるのではないか?と思っている。

mm_slave にはpart_1_basic_component.cpp、part_2_slave_component.cpp、part_3_slave_register_arguments.cpp、part_4_slave_mem_args.cpp の4つのC++ ソースファイルがある。
READMEに説明が書いてある。README の説明に従ってやってみることにする。

part_1_basic_component.cpp はintel HLS の通常の Start , busy, done などがある intel HLS のデフォルトのインターフェースになる気がする。
component void swp_int_end() の動作としては、32ビット幅のデータの8ビットごとの入れ替えで、エンディアンを変換する関数のようだ。

component void swp_int_end (int* x,
                            int N ) {


Intel_HLS_94_171121.png
intelFPGA_lite\17.1\hls\examples\tutorials\interfaces\mm_slave のpart_1_basic_component.cpp を引用する。

part_2_slave_component.cpp は、 Avalon-MMスレーブインタフェースとして実装されるようだ。(hls_avalon_slave_component)

hls_avalon_slave_component
component void swp_int_end (int* x, 
                            int N ) {


Intel_HLS_95_171121.png
intelFPGA_lite\17.1\hls\examples\tutorials\interfaces\mm_slave のpart_2_slave_component.cppp を引用する。

part_3_slave_register_arguments.cpp は、コンポーネントの引数をコンポーネントのAvalon-MMスレーブインタフェースのメモリマップに追加しているそうだ。コンポーネントの引数のそれぞれがスレーブレジスタとして指定されているということだ。(hls_avalon_slave_register_argument)

hls_avalon_slave_component
component void swp_int_end (hls_avalon_slave_register_argument int* x,
                            hls_avalon_slave_register_argument int N ) {


Intel_HLS_96_171121.png
intelFPGA_lite\17.1\hls\examples\tutorials\interfaces\mm_slave の part_3_slave_register_arguments.cpp を引用する。

part_4_slave_mem_args.cpp は、ポインタ(Avalon MM-Master)インタフェースを、M20Kを使用した整数配列を格納するスレーブ・メモリに置き換えるそうだ。x のみ hls_avalon_slave_memory_argument() が使用されている。x はAvalon-MM マスタ・インターフェースになるのかもしれない?

hls_avalon_slave_component
component void swp_int_end (hls_avalon_slave_memory_argument(BUFFER_SIZE*sizeof(int)) int* x,
                            hls_avalon_slave_register_argument int N) {


Intel_HLS_97_171121.png
intelFPGA_lite\17.1\hls\examples\tutorials\interfaces\mm_slave の part_4_slave_mem_args.cpp を引用する。

build.bat を引用する。14行目をArria10 からCyclone Vに変更した。
Intel_HLS_98_171121.png

build.bat を起動した。
Intel_HLS_99_171121.png

part_1_basic_component.cpp、part_2_slave_component.cpp、part_3_slave_register_arguments.cpp、part_4_slave_mem_args.cpp の4つともPASSED になった。

F:\intelFPGA_lite\17.1\hls\examples\tutorials\interfaces\mm_slaves フォルダの内容を示す。
Intel_HLS_100_171121.png

F:\intelFPGA_lite\17.1\hls\examples\tutorials\interfaces\mm_slaves\part_1_basic_component.prj\components\swp_int_end フォルダのswp_int_end_inst.v の内容の一部を示す。

swp_int_end swp_int_end_inst (
  // Interface: clock (clock end)
  .clock               ( ), // 1-bit clk input
  // Interface: reset (reset end)
  .resetn              ( ), // 1-bit reset_n input
  // Interface: call (conduit sink)
  .start               ( ), // 1-bit valid input
  .busy                ( ), // 1-bit stall output
  // Interface: return (conduit source)
  .done                ( ), // 1-bit valid output
  .stall               ( ), // 1-bit stall input
  // Interface: x (conduit sink)
  .x                   ( ), // 64-bit data input
  // Interface: N (conduit sink)
  .N                   ( ), // 32-bit data input
  // Interface: avmm_0_rw (avalon start)
  .avmm_0_rw_address   ( ), // 64-bit address output
  .avmm_0_rw_byteenable( ), // 8-bit byteenable output
  .avmm_0_rw_read      ( ), // 1-bit read output
  .avmm_0_rw_readdata  ( ), // 64-bit readdata input
  .avmm_0_rw_write     ( ), // 1-bit write output
  .avmm_0_rw_writedata ( )  // 64-bit writedata output
);


Start などのブロックレベルの信号とメモリ・インターフェースがある。

F:\intelFPGA_lite\17.1\hls\examples\tutorials\interfaces\mm_slaves\part_2_slave_component.prj\components\swp_int_end フォルダのswp_int_end_inst.v の内容の一部を示す。

swp_int_end swp_int_end_inst (
  // Interface: clock (clock end)
  .clock               ( ), // 1-bit clk input
  // Interface: reset (reset end)
  .resetn              ( ), // 1-bit reset_n input
  // Interface: irq (interrupt end)
  .done_irq            ( ), // 1-bit irq output
  // Interface: x (conduit sink)
  .x                   ( ), // 64-bit data input
  // Interface: N (conduit sink)
  .N                   ( ), // 32-bit data input
  // Interface: avmm_0_rw (avalon start)
  .avmm_0_rw_address   ( ), // 64-bit address output
  .avmm_0_rw_byteenable( ), // 8-bit byteenable output
  .avmm_0_rw_read      ( ), // 1-bit read output
  .avmm_0_rw_readdata  ( ), // 64-bit readdata input
  .avmm_0_rw_write     ( ), // 1-bit write output
  .avmm_0_rw_writedata ( ), // 64-bit writedata output
  // Interface: avs_cra (avalon end)
  .avs_cra_read        ( ), // 1-bit read input
  .avs_cra_write       ( ), // 1-bit write input
  .avs_cra_address     ( ), // 2-bit address input
  .avs_cra_writedata   ( ), // 64-bit writedata input
  .avs_cra_byteenable  ( ), // 8-bit byteenable input
  .avs_cra_readdata    ( )  // 64-bit readdata output
);


start, busy, done, stall などの信号が消えて、avs_cra_.... のAvalon Slave の信号が増えた。

F:\intelFPGA_lite\17.1\hls\examples\tutorials\interfaces\mm_slaves\part_3_slave_register_arguments.prj\components\swp_int_end フォルダのswp_int_end_inst.v の内容の一部を示す。

swp_int_end swp_int_end_inst (
  // Interface: clock (clock end)
  .clock               ( ), // 1-bit clk input
  // Interface: reset (reset end)
  .resetn              ( ), // 1-bit reset_n input
  // Interface: irq (interrupt end)
  .done_irq            ( ), // 1-bit irq output
  // Interface: avmm_0_rw (avalon start)
  .avmm_0_rw_address   ( ), // 64-bit address output
  .avmm_0_rw_byteenable( ), // 8-bit byteenable output
  .avmm_0_rw_read      ( ), // 1-bit read output
  .avmm_0_rw_readdata  ( ), // 64-bit readdata input
  .avmm_0_rw_write     ( ), // 1-bit write output
  .avmm_0_rw_writedata ( ), // 64-bit writedata output
  // Interface: avs_cra (avalon end)
  .avs_cra_read        ( ), // 1-bit read input
  .avs_cra_write       ( ), // 1-bit write input
  .avs_cra_address     ( ), // 3-bit address input
  .avs_cra_writedata   ( ), // 64-bit writedata input
  .avs_cra_byteenable  ( ), // 8-bit byteenable input
  .avs_cra_readdata    ( )  // 64-bit readdata output
);


part_2_slave_component.prj とひかくすると、x と N が消えて、.avs_cra_address が 2 bit から 3 bit になった。つまり、x と N もレジスタにマップされたようだ。

F:\intelFPGA_lite\17.1\hls\examples\tutorials\interfaces\mm_slaves\part_4_slave_mem_args.prj\components\swp_int_end フォルダのswp_int_end_inst.v の内容の一部を示す。

swp_int_end swp_int_end_inst (
  // Interface: clock (clock end)
  .clock             ( ), // 1-bit clk input
  // Interface: reset (reset end)
  .resetn            ( ), // 1-bit reset_n input
  // Interface: irq (interrupt end)
  .done_irq          ( ), // 1-bit irq output
  // Interface: avs_cra (avalon end)
  .avs_cra_read      ( ), // 1-bit read input
  .avs_cra_write     ( ), // 1-bit write input
  .avs_cra_address   ( ), // 3-bit address input
  .avs_cra_writedata ( ), // 64-bit writedata input
  .avs_cra_byteenable( ), // 8-bit byteenable input
  .avs_cra_readdata  ( ), // 64-bit readdata output
  // Interface: avs_x (avalon end)
  .avs_x_read        ( ), // 1-bit read input
  .avs_x_write       ( ), // 1-bit write input
  .avs_x_address     ( ), // 12-bit address input
  .avs_x_writedata   ( ), // 32-bit writedata input
  .avs_x_byteenable  ( ), // 4-bit byteenable input
  .avs_x_readdata    ( )  // 32-bit readdata output
);


part_3_slave_register_arguments.prj と比較すると、avmm_0_rw_.... のAvalon MM-Master インターフェースが avs_x_..... のAvalon-MM slave インターフェースに置き換えられている。
  1. 2017年11月21日 05:25 |
  2. intel HLS
  3. | トラックバック:0
  4. | コメント:0

コメント

コメントの投稿


管理者にだけ表示を許可する

トラックバック URL
https://marsee101.blog.fc2.com/tb.php/3980-b6c99d3e
この記事にトラックバックする(FC2ブログユーザー)