1.8K Views
January 26, 24
スライド概要
フィックスターズならではの「FPGA」に関する高速化手法、 効率的な開発ノウハウ、苦労話などについてお話しいたします。
<講演内容>
1、格安 FPGA で始めるシンセサイザー製作
2500 円の FPGA ボードの登場により、FPGA 学習の開始のハードルはとても低くなっています。
しかし、その一方でハードウェアに興味があり FPGA を買ってみたものの、画像処理や CPU 製作に興味がない場合、
Lチカの次に取り組む魅力的なタスクが見つからず、
せっかく購入した FPGA ボードをタンスの肥やしにしてしまったといった話もよく見聞きします。
今回は FPGA 初学者に魅力的な L チカの次を、
画像処理に飽きたエンジニアに音プログラミングへの入り口を開拓すべく、
格安 FPGA ボード『Tang Nano 9K』でシンセサイザー製作を行ってみました。
格安ボードでシンセサイザー作り、あなたも始めてみませんか?
2、進化を続ける Intel Nios-V プロセッサの新機能を試す
Intel Nios-V プロセッサは登場してから1年以上が経ち、順調に進化してきました。
ローエンドデバイスへの対応やカスタム命令の追加など、ソフトコアプロセッサの用途や特徴を活かせる機能が追加され、
実用フェーズに入っていると言えるでしょう。
本セミナーではこれまでに追加された Nios-V プロセッサの以下の機能に焦点を当てて試行した結果を共有します。
・Cyclone10 デバイスでの Nios-V/m システムの動作
・Nios-V/g カスタム命令追加による高速化
実践的なデモンストレーションを通じて、新機能の効果と可能性を感じて頂ければと思います。
・当社技術ブログ 記事: https://proc-cpuinfo.fixstars.com/
・フィックスターズグループ/セミナー一覧: https://www.fixstars.com/ja/seminar
・フィックスターズのFPGAシステム開発: https://www.fixstars.com/ja/services/fpga
フィックスターズは、コンピュータの性能を最大限に引き出すソフトウェア開発のスペシャリストです。車載、産業機器、金融、医療など、幅広い分野での開発経験があります。また、ディープラーニングや機械学習などの最先端技術にも力を入れています。 並列化や最適化技術を駆使して、マルチコアCPU、GPU、FPGA、量子アニーリングマシンなど、さまざまなハードウェアでソフトウェアを高速化するサービスを提供しています。さらに、長年の経験から培ったハードウェアの知識と最適化ノウハウを活かし、高精度で高性能なアルゴリズムの開発も行っています。 ・開催セミナー一覧:https://www.fixstars.com/ja/seminar ・技術ブログ :https://proc-cpuinfo.fixstars.com/
実践的!FPGA開発セミナー vol.25 2023/08/23 18:00~ Copyright© Fixstars Group 1
格安 FPGA で始める シンセサイザー製作 Copyright© Fixstars Group 2
Who I am Hiroki NISHIMOTO 写真 西本 宏樹 ソリューション第四事業部 エンジニア Copyright© Fixstars Group
自己紹介 ● 西本宏樹 ○ ○ ○ 4月に新卒入社しました! 現在は Kubernetes 等を使った開発プロジェクトに従事 略歴 ■ ■ ■ ■ ギター製作の専門学校でギター職人を目指す 特命助教として奈良高専で観測ロケットへの組み込み機器設計・製造 奈良先端大で博士(工学)を取得 在学中のアルバイトを経て、フィックスターズに入社 Copyright© Fixstars Group 4
Lチカの次、何をするか問題 FPGA 初学者に向けた FPGA 入門課題は多くが画像処理や自作 CPUであり、 『Lチカはとりあえずしてみたけど、画像処理や自作 CPU には特に興味がない』といった場合、 次に取り組みたいものが見つからず、FPGA ボードをタンスの肥やしにしてしまう...... 今回は Lチカの次として、画像処理や自作 CPU 以外の新たな選択肢を提示するべく、 『音』の処理、シンセサイザー製作に取り組みました。 Copyright© Fixstars Group 5
格安 FPGA 評価ボード Tang Nano 9K 今回は FPGA 入門を考えている人にも取り組みやすいように、超格安ボードで製作してみました - Sipeed 社が製造・販売している FPGA ボード - 秋月電商で 2480 円で購入可能(CQ出版様発刊の入門書も付いてきました) - IDE の無償版あり 入門書 主なスペック - 27MHz 水晶発信機 - 8640 LUTs - SPI フラッシュ - SPI LCD コネクタ - HDMI 端子 - オンボードデバッガー - TFカードスロット - ボタン x 2 - LED x 6 Copyright© Fixstars Group 6
アウトライン 1. 音とは?シンセサイザーとは? 2. とりあえず音を鳴らしてみる 3. 音をオン・オフする 4. 音階を鳴らしてみる 5. まとめ・次回予告 Copyright© Fixstars Group 7
アウトライン 1. 音とは?シンセサイザーとは? 2. とりあえず音を鳴らしてみる 3. 音をオン・オフする 4. 音階を鳴らしてみる 5. まとめ・次回予告 Copyright© Fixstars Group 8
Q. 音とは? A. 空気の振動です。 世の中にあふれている音、全て波です。 『ド』の周波数で揺れる空気 ド! ド! ex) ピアノ 『ド』の鍵盤を叩く → ピアノ内のハンマーが弦を揺らす → 空気が『ド』の周波数で揺れる → 鼓膜が揺れて、人間は『ド』と認識する ex) リコーダー 『ド』の押さえ方で空気を吹き込む → 筒内で共振し、『ド』の周波になり、筒の外へ → 鼓膜が揺れて、人間は『ド』と認識する 音の高さ(ドレミ)は空気の振動の周波数です Copyright© Fixstars Group 9
スピーカーを使う楽器の場合は? エレキギターも弦の振動です。 ド! 誘導電流(実際は矩形ではないです) ex) エレキギター 『ド』の音程で鳴るように押さえて弦を鳴らす → 弦の揺れにより、コイルが『ド』の周波数で振動する誘導電流を生む → アンプで信号を増大 → 信号がスピーカーに入力され、空気を揺らす → 鼓膜が揺れて、人間は『ド』と認識する Copyright© Fixstars Group 10
電流を直接作ってアンプに繋げばいいのでは? エレキギターの弦をわざわざ弾いて音を鳴らさなくても、 電気信号をアンプに入力するだけでいいのでは? ド! ドの周波数 これがシンセサイザーの根本です Copyright© Fixstars Group 11
アウトライン 1. 音とは?シンセサイザーとは? 2. とりあえず音を鳴らしてみる 3. 音をオン・オフする 4. 音階を鳴らしてみる 5. まとめ・次回予告 Copyright© Fixstars Group 12
Lチカが出来れば、音は鳴らせる 音高は 1秒間に何回振動するか、つまり周波数で決まる デジタル信号における振動とは? → みんな大好き Lチカ 任意の速さで Lチカが出来れば、任意の高さの音が鳴らせる Copyright© Fixstars Group 13
実装方針 Tang Nano 9K の外部端子に 『440Hz で Low, Hi を切り替えるモジュール』を繋ぐ Copyright© Fixstars Group 14
環境構築 Windows 環境で構築しました。基本的に以下を DL して exe ポチッでした。 - Gowin EDA FPGA 開発用 IDE。Education 版が無料。アカウント登録の必要あり。 - openFPGALoader FPGA 書き込みツール。Gowin EDAの書き込み機能が不安定らしく、 入門書においてこちらの使用が勧められていた。Gowin EDA で書き込めなかったので、利用した。 - Zadig USBドライバインストールソフト。 Tang Nano 9K を openFPGALoader が認識できなかったので、ドライバの上書きを行った。 ([FTDI]→[WinUSB]に変更した) Copyright© Fixstars Group 15
FPGA を焼くまでの流れ ~プロジェクト作成~ 起動 > [Create Project]>[FPGA Design Project]を選択 プロジェクト名、パスを指定 Copyright© Fixstars Group 16
FPGA を焼くまでの流れ ~プロジェクト作成~ デバイスの選択 [Series] : [GW1NR] を選択 下のデバイス候補から[GW1NR-LV9QN88PC6/I5]を選択 Copyright© Fixstars Group 17
FPGA を焼くまでの流れ ~Verilog File 作成~ [File]>[New]>[Verilog File]を選択し、 ファイル名を入力(fpga_synth_topとした) また、今回は SystemVerilog で書きたかったので、ファイル形式は sv にした Copyright© Fixstars Group 18
FPGA を焼くまでの流れ ~ハードウェア記述~ module fpga_synth_top ( input wire clk, input wire rst, output logic synth_output 例) CNT_MAXが 3 のとき ); wire synth_overflow; count_clk #( .CNT_MAX (30681) ) sound_gen_inst ( .clk (clk), .rst (rst), parameterに与えたクロック数でまで数え、 オーバフロー信号を立てるモジュール .overflow (synth_overflow) ); always_ff @ (posedge clk or negedge rst ) begin if( ~rst ) synth_output <= 'b0; else if (synth_overflow) begin synth_output <= ~synth_output; end end endmodule オーバフロー信号を検知すると、 論理を反転する Copyright© Fixstars Group 19
音声信号反転のタイミングについて 今回鳴らす音は『ラ』です。 ポピュラーミュージックにおいて、ラは 440Hz が一般的です。 27MHz のクロックを数え、いくつになったとき反転すれば 440Hz を作れるかは 以下の式で計算することができます。 count_clk #( .CNT_MAX (30682) ) sound_gen_inst ( .clk (clk), .rst (rst), overflow の閾値を30682に設定 .overflow (synth_overflow) ); Copyright© Fixstars Group 20
音声信号反転のタイミングについて [Project]>[Configuration]でメニューを開き、 [Synthesis] の [Top Module/Entity] に記述したモジュール名を記述 今回は System Verilog で書いたので、[Verilog Language] を [System Verilog 2017] にした Copyright© Fixstars Group 21
FPGA を焼くまでの流れ ~物理制約作成~ [File]>[New]>[Physical Constraints File]を選択し、 ファイル名を入力(無難に Verilog File と同名にした) IO_LOC "synth_output" 69; IO_PORT "synth_output" IO_TYPE=LVCMOS33 PULL_MODE=UP DRIVE=8; IO_LOC "clk" 52; IO_PORT "clk" IO_TYPE=LVCMOS33 PULL_MODE=UP; IO_LOC "rst" 3; IO_PORT "rst" IO_TYPE=LVCMOS18 PULL_MODE=UP; どのポートを IC のどのピンに割り当てるかの設定をする 設定時は公式が右のような図を公開しているので、参考にする https://wiki.sipeed.com/hardware/en/tang/Tang-Nano-9K/Nano-9K.html Copyright© Fixstars Group 22
FPGA を焼くまでの流れ ~タイミング制約作成~ [File]>[New]>[Timing Constraints File]を選択し、 ファイル名を入力(無難に Verilog File と同名にした) create_clock -name clk -period 37.037 -waveform {0 18.518} [get_ports {clk}] -add Tang Nano 9K の周波数は 27MHz であり、そのとき周期は 37.037…nsとなる 周期を 37.037ns にし、clk の立下りのタイミングが真ん中になるように、 duty 比の設定を{0 18.518}とし、生成した Clock を ポート clk に入力している Copyright© Fixstars Group 23
FPGA を焼くまでの流れ ~合成~ 合成!(クリック) Copyright© Fixstars Group 24
FPGA を焼くまでの流れ ~書き込み~ 私の環境だと、Gowin EDA での書き込みに失敗してしまったので、 openFPGALoader を使って書き込んだ 1. powershell 等で [project_dir]/impl/pnr に移動 2. openFPGALoader.exe [module名].fs を実行 Copyright© Fixstars Group 25
ラを鳴らしてみる ブレッドボードに繋ぐために作ったやつ ギターアンプに繋いでみた 440.1Hz を確認 Copyright© Fixstars Group ↓ 26
アウトライン 1. 音とは?シンセサイザーとは? 2. とりあえず音を鳴らしてみる 3. 音をオン・オフする 4. 音階を鳴らしてみる 5. まとめ・次回予告 Copyright© Fixstars Group 27
音をオン・オフする 同じ音を鳴らし続けるだけでは楽器としては使いどころは難しいです。 ボタンを使って音のオン・オフを出来るようにしてみます。 ↑ Amazon で購入した、100個500円のタクトスイッチ Copyright© Fixstars Group 28
入力ポートを追加 Verilog File とPhysical Constraints File に入力ポートの情報を追加 fpga_synth_top.sv fpga_synth_top.crt module fpga_synth_top ( input wire clk, input wire rst, input wire synth_switch, output logic synth_output ); IO_LOC "synth_switch" 25; IO_PORT "synth_switch" IO_TYPE=LVCMOS33 PULL_MODE=DOWN; Copyright© Fixstars Group 29
スイッチの反映 出力は sound_on が Hi のとき『音の信号』に、Low のとき『0』になるようにした reg hz_reg; always_ff @ (posedge clk or negedge rst ) begin if( ~rst ) hz_reg <= 'b0; end else if ( synth_overflow ) begin ここ以外は先ほどの実装と同じ hz_reg <= ~hz_reg; end end assign synth_out = sound_on ? hz_reg : 0; Copyright© Fixstars Group 30
スイッチを用いて鳴らしてみる なりました! Copyright© Fixstars Group 31
アウトライン 1. 音とは?シンセサイザーとは? 2. とりあえず音を鳴らしてみる 3. 音をオン・オフする 4. 音階を鳴らしてみる 5. まとめ・次回予告 Copyright© Fixstars Group 32
音階を鳴らす 『ラ』だけ鳴らせるシンセサイザーは悲しいので、 『ドレミファソラシド』を鳴らせるようにしましょう! 今鳴らせる音、これだけ Copyright© Fixstars Group 33
音程と周波数の関係 ある音から 1オクターブ上の同じ音の周波数の関係は 2倍したものとなる ex ) ドが x [Hz] のとき、高いドの周波数は 2x [Hz] となる 2倍 Copyright© Fixstars Group 34
音程と周波数の関係 この 2倍間を以下のように区切ったものが音程(平均律)です。 『ラ』が440Hzのとき、3つ上の『ド』の周波数は 以下のように求められる Copyright© Fixstars Group 35
実装方針 先ほどと同様にスイッチを追加し、それぞれに各音階を割り当てる Copyright© Fixstars Group 36
任意の音高の作成モジュール作成 毎回欲しい周波数を得るために計算して書くのも無駄なので cnt_clk をラップして任意周波数を作れるモジュールを作成 module x_hz_gen #( parameter integer BASE_CLK = 27000000, parameter real HZ = 440 ) ( input wire clk, input wire rst, output logic overflow ); localparam integer CNT_MAX = $rtoi(BASE_CLK / 2.0 / HZ); cnt_clk #( .CNT_MAX (CNT_MAX) ) cnt_clk_inst ( .* ); endmodule Copyright© Fixstars Group 37
音の信号の作成モジュール作成 先ほどのモジュールをラップして、スイッチを入力にパラメータで決まった 周波数を出力するモジュールを作成 module generate_sound_module #( parameter integer BASE_CLK = 27000000, parameter real HZ = 440 )( input wire clk, input wire rst, input wire sound_on, output wire sound_output ); wire synth_overflow; // 略 任意の周波数を作成するモジュールでsynth_overflow を制御 reg hz_reg; // 略 synth_overflow に従い、hz_reg を反転 assign sound_output = sound_on ? hz_reg : 0; endmodule Copyright© Fixstars Group 38
係数のテーブルとgenerate でまとめて作成
係数のテーブルを作成し、C4 (523.25Hz)を基準に、
13音分のモジュールを作成
localparam [63:0] coefs [13] = {
$realtobits( 1.000000 ) ,
$realtobits( 1.059463 ) ,
$realtobits( 1.122462 ) ,
$realtobits( 1.189207 ) ,
$realtobits( 1.259921 ) ,
$realtobits( 1.334839 ) ,
$realtobits( 1.414214 ) ,
$realtobits( 1.498307 ) ,
$realtobits( 1.587401 ) ,
$realtobits( 1.681793 ) ,
$realtobits( 1.781797 ) ,
$realtobits( 1.887749 ) ,
$realtobits( 2.000000 )
};
localparam real C4_FREQ = 523.251130;
genvar i;
generate
for(i = 0; i < SOUND_NUM ; i = i + 1) begin :
generate_sound_mod_blk
generate_sound_module #(
.HZ( C4_FREQ * $bitstoreal ( coefs[i] ) ),
.BASE_CLK(27000000)
) gen_sound_mod_inst (
.clk(clk),
.rst(rst),
.sound_on(sound_on[i]),
.sound_output( sound_signals[i] )
);
end
endgenerate
Copyright© Fixstars Group
39
最後に音をまとめる デジタル信号の和音の生成の正しそうな方法が思いつかなかった。 鳴っている信号の AND を取るといい感じだったので、AND にした。(要追加検討) module bundle_sound_module #( parameter SOUND_NUM = 13 )( input wire [SOUND_NUM-1:0] sound_signals, input wire [SOUND_NUM-1:0] sound_on, output wire bundled_sound ); wire [SOUND_NUM-1:0] sounds; assign sounds[0] = sound_on[0] ? sound_signals[0] : 1; genvar i; generate for(i = 1; i < SOUND_NUM; i = i + 1) begin : connect_sound_blk assign sounds[i] = sound_on[i] ? ( sounds[i-1] & sound_signals[i] ) : sounds[i-1]; end endgenerate assign bundled_sound = sounds[SOUND_NUM-1]; endmodule Copyright© Fixstars Group 40
実演 12音階 期待する音高を確認 Copyright© Fixstars Group 41
実演 和音 Copyright© Fixstars Group 42
アウトライン 1. 音とは?シンセサイザーとは? 2. とりあえず音を鳴らしてみる 3. 音をオン・オフする 4. 音階を鳴らしてみる 5. まとめ・次回予告 Copyright© Fixstars Group 43
まとめ 今回は FPGA 初学者に魅力的な Lチカの次を、 画像処理に飽きたエンジニアに音プログラミングへの入り口を開拓すべく、 格安 FPGA ボード『Tang Nano 9K』でシンセサイザー製作を行ってみました。 スイッチと Tang Nano 9K の機能のみで、 - 自由な音程を鳴らす - 鳴らすタイミングの制御 が実装できました。 FPGA でシンセサイザー作り、あなたも始めてみませんか? Copyright© Fixstars Group 44
次回予告 - 音量をデジタル信号だけで変化させ ADSR を実現 - パラメータ入力を取り、よりシンセサイザーらしい動作をさせる 等々を予定 Copyright© Fixstars Group 45
進化を続ける Intel Nios🄬V プロセッサの新機能を試す Copyright© Fixstars Group 46
Who I am Ryuji NISHIDA 写真 西田 竜之 ソリューション第四事業部 リードエンジニア Copyright© Fixstars Group 47
自己紹介 ● 西田竜之 ○ ○ ○ FPGAを用いたシステム開発に従事 ハードウェア開発をメインに担当 略歴 ■ 半導体ベンダ ● サーバー向けASIC開発 ■ 映像事務機メーカー ● 高画質エンジンLSI 映像機器向けFPGA開発 ■ フィックスターズ ● FPGAを用いた高速取引金融システム ● OpenCLによるアプリの高速化 Copyright© Fixstars Group 48
アジェンダ ● 背景 ● Cyclone® 10 デバイスを用いた Nios® V/m システム ● Nios® V/g カスタム命令追加による高速化 Copyright© Fixstars Group 49
背景 ● これまでの Nios® V 紹介例 ○ 実践的!FPGA 開発セミナー Vol.8(2022/3) 「Intel® Nios® V/mを使った組み込みシステム開発」 ○ インテル® FPGA対応 Nios® V プロセッサー・セミナー (2022/9) 「Nios® V/m でオープンソース RTOSを動かす」 Copyright© Fixstars Group 50
背景 ● 進化を続ける Nios® V ○ RiscFree* IDE for Intel® FPGAs ○ Quartus® Prime Standard Edition Nios® V/m 対応 (=ローエンドデバイス対応) ○ Nios® V/g (Cache, Custom Instruction) ○ FreeRTOS™, Zephyr® 実用化フェーズに入っている と言える 今回、アップデートして紹介 参照URL: https://www.intel.com/content/www/us/en/support/programm able/support-resources/support-centers/nios-v-support.html Copyright© Fixstars Group 51
Cyclone® 10 を用いた Nios® V/m システム ● ソフトコア CPU の位置づけ ○ 組み込みシステムにソフトコアプロセッサを用いる構成は、ローエンドデバイス向け ローエンド デバイス ハイエンド デバイス (「Nios® V/m でオープンソース RTOSを動かす」セミナー資料抜粋) Copyright© Fixstars Group 52
Cyclone® 10 を用いた Nios® V/m システム ● 実行&開発環境 ○ 使用ボード: Cyclone® 10 LP FPGA 評価キット(~¥15,000) ■ 外部 RAM コントローラー IP が 3rd Party 製(有償) ※試行ライセンスでは、.sof 書き込み後 10 分までの タイムリミット動作となる ○ OS:Windows 11 ○ Quartus® Prime: Lite Edition Version 22.1.2(無償版) ○ IDE & tool chain: RiscFree IDE for Intel® FPGAs 22.1std (riscv32-unknown-elf-, make, cmake を含む) Copyright© Fixstars Group 参照URL: https://media.digikey.com/Photos/Altera%20Photos /MFG_EK-10CL025U256.jpg 53
Cyclone® 10 を用いた Nios® V/m システム ● 実行フロー ○ ソフトウェアビルドは、従来同様 niosv-bsp, niosv-app, cmake, make ←Nios V Command Shell から起動 などのコマンドベースで実行 ■ ただし Quartus® Prime Standard Edition では BSP Editor が Platform Designer に統合されていない ■ Nios V Command Shell から niosv-bsp-editor コマンドで起動する ⇒ Nios V Command Shell BSP Editor Copyright© Fixstars Group 54
Cyclone® 10 を用いた Nios® V/m システム ● Windows 上でのコマンドライン操作について(参考) ○ Nios V Command Shell から実行する必要がある ■ 適切な環境設定がされたコマンドプロンプトベースのシェル ■ 使い慣れた WSL のシェルを使って、コマンド実行できるように試みたが うまく動作しなかった ● ● ○ パス設定、環境設定を合わせても、make, cmake がエラーになる Nios II Command Shell は WSL ベースに移行されている 改善方法の情報 ■ PowerShell ベースに変更する方法 ● ■ Qiita:Nios V Command Shell を使いやすく変更してみる(Windows Power Shell で起動) RiscFree* IDE にコマンドを登録して実行する方法 ● 株式会社マクニカ アルティマ カンパニー 技術コンテンツ 「Ashling* RiscFree* IDE を使用した Nios®V プロジェクト開発手順 Copyright© Fixstars Group 5-3. 登録推奨コマンド」 55
Cyclone® 10 を用いた Nios® V/m システム ● デモデザイン ○ Simple Socket Server の Example デザインを利用 ■ Nios® V/m で uC/OS-II 上のネットワークスタックを動作させる ■ telnet でアクセスし、リモートで LED を制御する 参照URL: https://www.intel.com/content/www/us/en/design-example/776211/intel-arria-10-fpga-simple-s ocket-server-design-for-nios-v-g-core-processor.html Copyright© Fixstars Group 56
Cyclone® 10 を用いた Nios® V/m システム ● デモデザイン移植方針 ○ 既存の Example デザインとの関係 ■ Cycle® 10 LP 評価キット用のサンプルデザインは、Nios® II の資産が多数ある ■ ハードウェア ⇒ Cycle® 10 LP 評価キット用のデザインをベースに、CPU を Nios® V/m に置き換える ■ ソフトウェア ⇒ Arria® 10 SOC 評価ボードの Nios® V/m 用のコードを流用する Copyright© Fixstars Group 57
Cyclone® 10 を用いた Nios® V/m システム ● デモデザインハードウェア実装 ○ Cyclone® 10 LP 評価キット用デザインを修正 ■ Nios® II/f → Nios® V に差し替え ■ msgDMAC の設定、接続を Arria® 10 用デザインに合わせて修正 Copyright© Fixstars Group 58
Cyclone® 10 を用いた Nios® V/m システム ● デモデザインソフトウェア実装 ○ Arria® 10 SOC 評価ボード Nios® V/m 用コードを利用 ■ BSP 設定は、Arria® 10 SOC 評価ボード用を参考に、ビルドオプションを合わせる ■ インスタンス名で指定する箇所をハードウェアに合わせて修正 [修正前] ■ [修正後] ・main.c ・main.c ・uc_tcp_ip_init.c ・uc_tcp_ip_init.c LED 制御コードは Cyclone® 10 LP 評価ボード用のコードを使用 Copyright© Fixstars Group 59
Cyclone® 10 を用いた Nios® V/m システム ● デモ動作 ○ .sof 焼き込み、.elf ダウンロード ○ telnet でターゲットボードに接続 & コマンド入力で LED を制御する telnet 接続後操作 LED 制御 Copyright© Fixstars Group 60
Nios® V/g カスタム命令追加による高速化 ● Nios® V/g プロセッサ ○ プロセッサ仕様 ■ RV32IMA ■ パイプライン:5ステージ Fetch → Decode → Execute → Memory → Write Back ■ 乗算&除算ユニット内蔵 ■ 命令キャッシュ&データキャッシュ ■ カスタム命令対応 Nios® V/m との差異 参照URL: https://www.intel.com/content/www/us/en/docs/programmable/683632/23-1/processor-architecture-20736.html Copyright© Fixstars Group 61
Nios® V/g カスタム命令追加による高速化 ● Nios® V/g プロセッサ カスタム命令 ○ ユーザーが追加したカスタムロジックを CPU のカスタム命令で呼び出す ■ RISC-V はカスタム命令に対応することが想定されている ■ Nios II でも同じ機能がある(ソフトコアプロセッサの特徴ともいえる) 参照URL: https://www.intel.com/content/www/us/en/docs/programmable/773194/current/processor-custom-instruction-overview.html https://www.intel.com/content/www/us/en/docs/programmable/773194/current/implementing-custom-instruction-logic-block.html Copyright© Fixstars Group 62
Nios® V/g カスタム命令追加による高速化 ● カスタムロジックハードウェア ○ ○ ポート仕様 ■ 3 データ入力(data0, data1, alu_rsult )、1 出力(result) ■ ロジック選択(ctrl) ■ タイミング制御(enable, done) 非常にシンプル → 合計 1161命令が追加可能 ※ ctrl には ALU 選択も含む stall もない (CPU 内の内部モジュールとして扱うイメージ?) 参照URL: https://www.intel.com/content/www/us/en/docs/programmable/773194/current/processor-custom-instruction-overview.html https://www.intel.com/content/www/us/en/docs/programmable/773194/current/implementing-custom-instruction-logic-block.html Copyright© Fixstars Group 63
Nios® V/g カスタム命令追加による高速化 ● カスタム命令ソフトウェアインターフェース ○ カスタムロジックの使い方 ■ 呼び出し用のマクロが自動生成される ● ■ マクロ例 ユーザーが、該当処理の箇所でマクロを呼び出すことで実行される ※コンパイラが自動認識してアセンブリコードを出力するわけではない ● 呼び出し例 参照URL: https://www.intel.com/content/www/us/en/docs/programmable /773194/current/custom-instruction-software-c-macro.html Copyright© Fixstars Group 64
Nios® V/g カスタム命令追加による高速化 ● カスタム命令による高速化デモ ○ 実行環境 ■ 仕様ボード: インテル® Agilex™ Fシリーズ FPGA 開発キット AGFB014R24B2E2V ■ ■ ○ ツール: Quartus® Prime Pro ver 23.2 OS 参照URL: https://www.intel.com/content/www/us/en/products/details/fpga/development-kit s/agilex/f-series.html :CentOS 7.9 ターゲット動作 ■ ベンチマークソフト(CoreMark)内に含まれる crc 演算をカスタム命令化する Copyright© Fixstars Group 65
Nios® V/g カスタム命令追加による高速化 ● CoreMark ベンチマークソフト ○ MPUの評価で使用されるベンチマークソフト ■ ■ ■ Whetstone … 浮動小数点演算性能の評価 Dhrystone … 整数演算性能の評価 CoreMark … 整数演算・制御演算性能の評価 リスト処理、行列操作、ステート マシン、CRC を含む ⇒ カスタム命令化の効果が見込めそうな CRC 演算にあたりをつけて、 CoreMark をターゲットとした ○ CoreMark ソースコード:https://github.com/eembc/coremark ○ プロファイル取得について ■ ■ 本来、プロファイル結果にもとづいて、高速化対象とする機能を抽出する Nios® V/g システムで gprof を用いてプロファイルの取得を実行したが、正常に終了せず ※ Nios® II では gprof でプロファイル取得可能できる情報があるが、Nios® V/g では情報がなく、 対応できていない可能性がある Copyright© Fixstars Group 66
Nios® V/g カスタム命令追加による高速化 ● ハードウェア構成 ○ Intel 提供のExample デザインをベースに構成 Agilex® 7 FPGA - Custom Instruction Design on Nios® V/g Processor ○ カスタムロジック化する CRC 演算は、インテル® HLS コンパイラーを用いて実装する カスタムロジックは 元の C ソースコードから Intel-HLS を用いて実装 Copyright© Fixstars Group 67
Nios® V/g カスタム命令追加による高速化 ● CRC (8bit) 演算カスタムロジック高位合成 ○ C ソースコード 〇 HLS ソースコード 動作モードの指定 start, stall 不要 レイテンシ削減、など インターフェースを 仕様に合わせる ← for 文を unroll Copyright© Fixstars Group 68
Nios® V/g カスタム命令追加による高速化 ● CRC (16bit) 演算カスタムロジック高位合成 ○ C ソースコード 〇 HLS ソースコード crcu8 を 2回呼び出し crcu8 にならって for 文を展開 繰り返し回数のみ 8 → 16 に変更 Copyright© Fixstars Group 69
Nios® V/g カスタム命令追加による高速化 ● CRC 演算カスタムロジック高位合成結果 ○ 高位合成ターゲット ■ ターゲット周波数 100MHz ■ ブロッキングで動作する(パイプライン的に連続入力されない)場合を考慮して、レイテンシを削減 する方向で調整した ○ crcu8 ii = 1, Latency = 3 を達成 ○ crcu16 ii = 1, Latency = 5 を達成 Copyright© Fixstars Group 70
Nios® V/g カスタム命令追加による高速化 ● ベンチマーク結果 ○ オリジナル ○ 高速化後 ⇒ 2K performance run CoreMark Size : Total ticks : Total time (secs): Iterations/Sec : Iterations : parameters for coremark. 666 1121574329 17.945189 11.145048 200 2K performance run CoreMark Size : Total ticks : Total time (secs): Iterations/Sec : Iterations : parameters for coremark. 666 955280270 15.284484 13.085165 200 結果 17 % 程度の高速化を確認できた Copyright© Fixstars Group 71
まとめ ● 進化を続ける Nios® V プロセッサの新機能を利用したデモを通じて、以下2点共有した ● Cyclone® 10 LP 評価キットを用いた Nios® V/m のネットワークシステムの動作を確認した Nios® II システムを流用して、比較的容易に動作を確認することができた ● Nios® V/g のカスタム命令を、CoreMark CRC 演算の高速化を例に共有した 結果、高速化を確認することができた Copyright© Fixstars Group 72
Thank you! お問い合わせ窓口 : [email protected] Copyright © Fixstars Group 73