インテル® FPGA ビデオ＆画像処理スイートをCyclone® 10 GX FPGAで動かしてみる

#背景
Cyclone® 10 GX FPGA 開発キットで動作するビデオ＆画像処理スイート（VIP Suite）のリファレンスデザインが公開されているが、対応しているインテル® Quartus® Prime開発ソフトウェアのバージョンが18.0と非常に古く、かつそのままデザインを最新バージョンにアップデートしてもエラーが発生して動作しません。
この記事では古いデザインを最新のインテル® Quartus Prime開発ソフトウェアに移植して、動作させることを目的としています。
#動作環境
* Cyclone® 10 GX FPGA 開発キット[Link](https://www.intel.co.jp/content/www/jp/ja/products/details/fpga/development-kits/cyclone/10-gx.html)
* Bitec FMC HDMI ドーターカード (Rev 11) [Link](https://bitec-dsp.com/product/fmc-hdmi-daughter-card-rev-11/)
* HDMI 4K対応 PC
* HDMI 4K対応モニター

# ソフトウェア
今回使用するソフトウェア　Quartus Prime 開発ソフトウェア プロ・エディション Ver.21.3 Build170

# 使用するリファレンスデザイン
Cyclone 10 GX HDMI 4Kp60 with Video and Image Processing Pipeline Reference Design
Revision:2.0
* [コード](
https://fpgacloud.intel.com/devstore/platform/18.0.1/Pro/cyclone-10-gx-hdmi-4kp60-with-video-and-image-processing-pipeline-reference-design/)
* [ユーザーガイド](
https://www.intel.com/content/dam/altera-www/global/en_US/uploads/8/81/C10GX_hdmi_vip_ug.pdf)

コードの対応ソフトウェア　Quartus Prime Software Ver.18.0

デザインは以下のような構成となっていて、HDMIで入力された画像をMIXしてHDMIで出力するというものです。
出力は**3840x2160p60固定**です。入力は**3840x2160p60**の場合そのまま出力され、たとえば入力が1080pの場合は背景のカラーバーとMixされて出力されます。詳細についてはユーザーガイドを参照ください。
![VIP_block.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1971582/275e6e7b-7742-9a92-4712-14d2d288ce05.png)


# 移植の手順
HDMIだけでなく、DisplayPortやSDIのIPを使用しているデザインにおいても同様の手法が適用可能です。

1. 新しいバージョンのインテル® Quartus® Prime ソフトウェアのIP CatalogでHDMIのリファレンスデザインを生成する
2. オリジナルのデザインを新しいバージョンのインテル® Quartus Prime ソフトウェアで解凍およびIPのアップブレードをする
3. 1.で生成したHDMI IPのファイルを2.のプロジェクトフォルダにコピーし、変更されたインターフェイス周りの呼び出しコードを修正する
4. 各種設定ファイルを修正する
5. フルコンパイル

# HDMIのリファレンスデザインを生成する
旧バージョンのデザインでコンパイル時にエラーとなる一つの原因がIPのインターフェイスが変更されていることにあります。それでまずは新しいバージョンでリファレンスデザインを生成します。HDMIのIPはそれ単独ではなく、トランシーバーであるGXB、それを制御するリコンフィグマネージメントIP、PLLなどが絡んでいるため個々のIPのバージョンアップではなく、リファレンスデザインを使用する手法を今回は取ります。
  
詳細な手順は[HDMI Intel Cyclone 10 GX FGPA IP Design Example User Guide](https://www.intel.com/content/www/us/en/programmable/documentation/ezu1511767661589.html)の1.3章に記載があります。
1.インテル® Quartus® Prime ソフトウェア プロ・エディションVer.21.3を起動し、新しいプロジェクトを作成し、インテル® Cyclone® 10GXファミリーを選択します
2.IP Catalogで***HDMI Intel FPGA IP***を選択し、ダブルクリックします
![IPCatalig.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1971582/af95de46-03ef-94b9-8be0-74fb4e27acd0.png)
3.IPの名前を記載します。IPの名前はなんでもかまいません。
4.Createをクリックすると、IP Parameter Editorが開きます
5.IPのパラメータを設定します。***Include I2C Master/Slave***のチェックを外しそれ以外はデフォルトの設定を使用します
6.***Design Example***タブを開き、Cyclone 10 HDMI RX-TX Retransmitを選択
![Exampledesign.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1971582/faf5af10-5524-f86d-9101-50d760ff84d7.jpeg)
7.Design Example Filesとして***Synthesis***を選択
8.Gererated HDL Formatとして***Verilog***を選択
9.Terget Development Kitとして***Cyclone 10 GX FPGA Development Kit***を選択
10.***Generate HDL***をクリック
以上でプロジェクトフォルダ下にhdmi_0_aexample_designといったフォルダが作られ、リファレンスデザインのプロジェクトが生成されます。

# リファレンスデザインの解凍とIPのアップグレード
1.[Link](https://fpgacloud.intel.com/devstore/platform/18.0.1/Pro/cyclone-10-gx-hdmi-4kp60-with-video-and-image-processing-pipeline-reference-design/)のDownloadからデザインをダウンロードします。c10gx_hdmi_vip.parというファイルが入手できます
2．Nios II Command Shellを起動して以下のコマンドを実行します。実行するとqarのあるフォルダに解凍されてるため、必要に応じてフォルダを作成した上で実行してください。
`quartus_sh.exe --platform -name c10gx_hdmi_vip.qar`
3. インテル® Quartus Prime ソフトウェアを起動して、2.で解凍したデザインのプロジェクトファイル***top.qpf***を開きます
4. Launch IP Upgrade Toolアイコンをクリックします
5. 開いたUpgrade IP ComponentsウィンドウでAuto Upgradeアイコンをクリックします
6. IPの更新が終了したら一旦インテル® Quartus Prime ソフトウェアを閉じます

# HDMI関連IPの更新
1. 一番最初に生成したHDMIのリファレンスデザインのrtlフォルダから***gxb, hdmi_rz, hdmi_tx, pll, reconfig_mgmt***フォルダをVIPのリファレンスデザインのフォルダにコピーします。
2. 続いて、トップのデザインhdmi_vip.vを修正します

```hdmi_vip.v

u_hdmi_rx_top
(
   /* I */ .mgmt_clk                      ( mgmt_clk                        ),
//   /* I */ .mgmt_clk_reset                ( mgmt_clk_reset_sync             ),　//コメントアウト
//   /* I */ .hdmi_clk_in                   ( hdmi_clk_in                     ), //コメントアウト
（中略）
   /* I */ .edid_ram_access(rx_edid_ram_access),
   /* I */ .edid_ram_address (rx_edid_ram_address),
   /* I */ .edid_ram_write (rx_edid_ram_write),
   /* I */ .edid_ram_read (rx_edid_ram_read),
   /* O */ .edid_ram_readdata (rx_edid_ram_readdata),
   /* I */ .edid_ram_writedata (rx_edid_ram_writedata),
   /* O */ .edid_ram_waitrequest (rx_edid_ram_waitrequest),

// 以下を追加
   /* I */ .reset (reset),  
   /* I */ .reset_xcvr_powerup(reset),
   /* I */ .fr_clk (refclk_fmc_p),
   /* O */ .aux_error (),
   /* O */ .vid_lock (),
   /* I */ .user_pb_1 (1'b1)
);
（中略）

u_hdmi_tx_top
(
   /* I */ .mgmt_clk                             ( mgmt_clk                              ),
//   /* I */ .mgmt_clk_reset                       ( mgmt_clk_reset_sync                   ),//　コメントアウト
（中略）
   /* O */ .gxb_tx_cal_busy_out                  ( gxb_tx_cal_busy_out             ),
   /* I */ .gxb_reconfig_write                   ( gxb_tx_reconfig_write           ),
   /* I */ .gxb_reconfig_read                    ( gxb_tx_reconfig_read            ),
   /* I */ .gxb_reconfig_address                 ( gxb_tx_reconfig_address         ),
   /* I */ .gxb_reconfig_writedata               ( gxb_tx_reconfig_writedata       ),
   /* O */ .gxb_reconfig_readdata                ( gxb_tx_reconfig_readdata        ),
   /* O */ .gxb_reconfig_waitrequest             ( gxb_tx_reconfig_waitrequest     ),
   /* I */ .gxb_tx_cal_busy_in                   ( gxb_tx_cal_busy_in              ),
	
// 以下を追加
   /* I */ .fr_clk (usb_refclk_p),
   /* I */ .reset (reset)	
); 


``` 

# 設定ファイルの修正
top.qsfファイルをテキストエディタで開いて修正します。
1. set_global_assignment -name QIP_FILE <ファイル名>.qip をコメントアウトします。ツールの仕様が変わったためか同じ名前の.ipファイルと.qipファイルがあるとエラーが発生したためです。

```top.qsf
# set_global_assignment -name QIP_FILE output_buf_i2c/output_buf_i2c.qip
# set_global_assignment -name QIP_FILE pll/pll_hdmi_rx/pll_hdmi_rx.qip
# set_global_assignment -name QIP_FILE pll/pll_hdmi_tx/pll_hdmi_tx.qip
# set_global_assignment -name QIP_FILE qsys_vip_pipeline/qsys_vip_pipeline.qip
# set_global_assignment -name QIP_FILE pll/pll_hdmi_reconfig/pll_hdmi_reconfig.qip
# set_global_assignment -name QIP_FILE hdmi_tx/hdmi_tx/hdmi_tx.qip
# set_global_assignment -name QIP_FILE hdmi_rx/hdmi_rx/hdmi_rx.qip
# set_global_assignment -name QIP_FILE gxb/gxb_tx_reset/gxb_tx_reset.qip
# set_global_assignment -name QIP_FILE gxb/gxb_tx_fpll/gxb_tx_fpll.qip
# set_global_assignment -name QIP_FILE gxb/gxb_tx/gxb_tx.qip
# set_global_assignment -name QIP_FILE gxb/gxb_rx_reset/gxb_rx_reset.qip
# set_global_assignment -name QIP_FILE gxb/gxb_rx/gxb_rx.qip
# set_global_assignment -name QIP_FILE clock_control/clock_control.qip

```

2.以下の設定ををコメントアウトします

```top.qsf
# set_global_assignment -name OUTPUT_IO_TIMING_NEAR_END_VMEAS "HALF VCCIO" -rise
# set_global_assignment -name OUTPUT_IO_TIMING_NEAR_END_VMEAS "HALF VCCIO" -fall
# set_global_assignment -name OUTPUT_IO_TIMING_FAR_END_VMEAS "HALF SIGNAL SWING" -rise
# set_global_assignment -name OUTPUT_IO_TIMING_FAR_END_VMEAS "HALF SIGNAL SWING" -fall
```

3."set_global_assignment -name IP_FILE pll/pll_hdmi.ip" をtop.qsfに追加します
4. Assignment Editorを開きます
5. ***fmc_tx_serial_data[0:3]***および***fmc_rx_serial_data[0:2]***の***VCCR_GXB/VCCT_GXB Voltage***の設定を1.0Vから***0.9V***に変えます。（一応、最新のHDMI Example Designの設定に合わせておきます）
6. もし StatusがOKではなく_Assignment is not valid for current device family_ と表示されている項目がある場合には再度同じパラメータの設定を行うことでエラーが消えます
![AssignmentEditor.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1971582/940eaa65-9e51-e9e4-0421-df65b0cab73a.png)

# プラットフォーム・デザイナー・システムの更新
1. インテル® Quartus® Prime ソフトウェアからプラットフォーム・デザイナーを立ち上げます
2. Platform Designer Systemとしてqsys_vip_pipeline.qsysを選択し、Openします
2. Upgrade がうながされるので、Update Allをクリックします。（以下はUpdate後の例）
![qsys_update.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1971582/03383f65-51f1-7045-22ec-394726e04eaa.png)
4. Update IP Cores画面をCloseします
4. プラットフォーム・デザイナーからGenerate HDL を実行します
4. 確認画面が開くので、内容を確認の上、Generate をクリックします![qsysGen.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1971582/8d013e48-fa8c-7855-f38c-007b58c6a043.png)

4. 生成が終了したらプラットフォーム・デザイナーを閉じます


# コンパイルと実行
1. インテル® Quartus Prime ソフトウェアでコンパイルを行います
2. [インテル® Cyclone® 10 GX FPGA 開発キット](https://www.intel.co.jp/content/www/jp/ja/products/details/fpga/development-kits/cyclone/10-gx.html)のWeb pageにある[キットの配布資料](https://www.intel.co.jp/content/dam/altera-www/global/en_US/support/boards-kits/cyclone10/cyclone-10-gx-kit-collateral.zip)をダウンロードします
3. ダウンロードした ***cyclone-10-gx-kit-collateral.zip***を解凍し、examples\board_test_systemフォルダにある***ClockController.exe***を実行します
4. Connected to the targetと表示されるのを待ってからImportで***U64-Registers.txt***を読み込みます

![clockCnt.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1971582/6e020370-fced-5d78-028f-925c10189e1c.png)
5. OUT1を250㎒に設定します。（もしその他のクロックが異なっているようでしたら、上記を参考に設定してください）
6. Programmerでtop.sofを書き込みます
  ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1971582/55d65002-4c05-de91-248a-0d459c1fc43c.png)
7. Nios II Command Sellを起動して、nios2-terminalを実行します

実際のデザインの詳細や操作方法についてはユーザーガイドをご覧ください。

以上でサンプルデザインの実行はできるのですが、現状コンパイル結果のタイミング割れが解決できておりません。そのためか動作は不安定です。今後改善を図っていきたいと思います。

:::note info
動作確認はビデオ＆画像処理スイートの正式ライセンス下で確認しており、OpenCore Plusでの確認はしておりません。
:::

# Reference
* [HDMI Intel FPGA IP User Guide](https://www.intel.com/content/www/us/en/programmable/documentation/vgo1401099304599.html)
* [HDMI Intel Cyclone 10 GX FGPA IP Design Example User Guide](https://www.intel.com/content/www/us/en/programmable/documentation/ezu1511767661589.html#pgw1476080333866)
* [Cyclone 10 GX HDMI 4Kp60 with Video and Image Processing Pipeline Reference Design User Guide] (https://www.intel.com/content/dam/altera-www/global/en_US/uploads/8/81/C10GX_hdmi_vip_ug.pdf)
* [Video and Image Processing Suite User Guide](https://www.intel.com/content/dam/www/programmable/us/en/pdfs/literature/ug/ug_vip.pdf)
* [Intel® Cyclone® 10 GX FPGA Development Kit User Guide
](https://www.intel.co.jp/content/dam/www/programmable/us/en/pdfs/literature/ug/ug-c10-gx-fpga-devl-kit.pdf) 

# Notices & Disclaimers

Intel technologies may require enabled hardware, software or service activation.
No product or component can be absolutely secure. 
Your costs and results may vary. 

No license (express or implied, by estoppel or otherwise) to any intellectual property rights is granted by this document.​​

© Intel Corporation.  Intel, the Intel logo, and other Intel marks are trademarks of Intel Corporation or its subsidiaries.  Other names and brands may be claimed as the property of others.