はじめに
この記事では、Mpression Sulfur Type-A Development Kit(以降、Sulfur)に搭載される CAN (Controller Area Network)周りの構成、FPGA と CAN コントローラー内蔵マイコン(MCU)のインターフェイスについて記載します。また、CAN I/F の検証用に用意したサンプルデザイン(FPGA および MCU)と動作確認の手順についても紹介します。
以下に Sulfur の CAN I/F に関連したパーツとブロック図を示します。
【図 1】Sulfur Type-A の CAN I/F 関連ブロック
参考資料: 詳細な仕様は以下のページからダウンロード可能な各種ドキュメント( Sulfur Type-A キット ユーザーマニュアル Ver.1.1 、他)を参照ください。
Agilex™ 5 E-Series(FPGA)は CAN 非対応のため、CAN に対応した MCU「NXP LPC54616」を実装することで CAN インターフェイスを実現する構成となっています。
MCU に閉じて CAN 通信を行うことも可能ですが、サンプルデザインでは FPGA - MCU 間の SPI インターフェイスを利用して、CAN 送受信データを受け渡す仕組みで動作させています。
1. 機材・開発環境
デザイン・デモを実行するために必要なツール、バージョン、開発マシンの要件(OS)などを記載します。
1-1. 機材
サンプルデザインの動作確認に必要な機材は以下の通りです。
- Sulfur Type-A 開発キット『 Sulfur Type-A Development Kit 』x1
- FPGA ダウンロードケーブル『 Intel® FPGA Download Cable II 』x1
- MCU デバッガー接続ケーブル『 MCU-Link Debug Probe 』x1
- CAN ループバック用ケーブル(汎用ケーブルで対応。CAN バス終端 120Ω は Sulfur に搭載)x1
ポイント: MCU デバッガー接続ケーブルには、UART-USB 変換 IC も搭載されています。JTAG デバッガー接続の他に、MCU のターミナル接続も行えます。比較的安価に入手いただけます。
メモ: CAN ループバック用ケーブルは、弊社では Ethernet CAT5e ケーブルを加工・代用する形で疎通確認しました。ツイストペアの2本を CAN_H, CAN_L(差動信号)の接続に使用しています。
1-2. 開発環境
以下のツールのセットアップが必要です。開発マシンの要件(OSなど)は以下のツールが対応する要件に合わせてご準備ください(こちらでは Windows 10 64bit 22H2 環境で確認実施しました)。
- FPGA 開発ツール(Version 24.3.1 の Windows 版にて動作確認実施)
- MCU 開発ツール [IDE](Version 24.12 の Windows 版にて動作確認実施)
- MCU 開発ツール [SDK](SDK Version 24.12.00 にて動作確認実施。以下のページから「Processors > LPC -> LPC54000 > LPC546xx -> LPC54616J512」を選択して、SDK を生成及びダウンロードしてください)。
- ターミナル・ソフトウェア(TeraTerm、PuTTY など。動作確認に TeraTerm マクロ(.ttl)を使用するため、TeraTerm を推奨)。
ポイント: FPGA 開発ツールは Agilex™ 5 E-Series 向け無償ライセンスが利用できます。また、サンプルデザインに Nios® V/m コアが含まれるため Nios® V の無償ライセンスも取得してください。尚、再コンパイルを行わない場合は Quartus® Programmer のみのインストールで対応可能です。
Agilex™ 5 E 開発向け Quartus® Prime Pro Edition 無償ライセンスファイルを取得する方法
Nios® V プロセッサー IP のライセンスファイルを取得する方法 ポイント: MCU 開発ツールは NXP サイトへのユーザー登録が必要になりますが、無償で利用できます。IDE のセットアップ、SDK のインストールについては以下の記事を参照ください。
[NXP マイコン初心者ガイド 0] MCUXpresso IDE のインストール方法
[NXP マイコン初心者ガイド 1] MCUXpresso IDE でサンプルプロジェクトを作成する方法
2. 提供ファイル
下表に、この記事で紹介するサンプルの実行に必要なファイル、および提供可能なデザインファイルを一覧で示します。
【表 1】提供ファイル一覧
| No. | ファイル名・ダウンロードリンク | 概要 | 更新日/バージョン |
| [1] |
lpcxpresso54616_freertos_generic-_for_sulfur_20240426_v1.11.zip |
MCU ソフトウェア (MCUXpresso プロジェクト) |
2024/4/26 v1.11 |
| [2] | FPGA デザインファイル (Quartus Prime プロジェクト) |
2025/1/29 v1.8 |
|
| [3] |
sulfur_ghrd_top_hps_QP24.3.1_v1.8-_USE_MCUSPI.sof (sdmosc25MHz) sulfur_ghrd_top_hps_QP24.3.1_v1.8-_USE_MCUSPI.jic (sdmosc25MHz) sulfur_ghrd_top_hps_QP24.3.1_v1.8-_USE_MCUSPI_sdmosc125MHz.sof sulfur_ghrd_top_hps_QP24.3.1_v1.8-_USE_MCUSPI_sdmosc125MHz.jic |
FPGA コンフィグレーション・データ (.sof および .jic) |
2025/1/29 v1.8 |
| [4] | sulfur_can-if_test-20240417en.ttl | 動作確認用マクロ(TeraTerm 向け) | 2024/4/27 |
提供ファイルは、MCU ソフトウェア、FPGA デザイン(ビルド済みイメージおよびプロジェクト)、動作確認用マクロの3種類です。Agilex™ 5 の HPS(Hard Processor System)で動作するソフトウェア(ブートローダー等)に対する本サンプルデザイン向けの変更はありません。
ポイント: 上記提供ファイルの他に HPS ブート用の SDカードイメージが必要です。以下のページから Linux SD カードイメージ(sdimage_agilex5_sulfur_QPDS24.3.1_v1.8.zip)を入手してください。
注記: FPGA 関連のファイル [2], [3] は Sulfur Type-A に搭載される SoM のシリアル番号に応じて、適切なファイルを使ってください。SDM OSC の周波数が異なると正常に動作しません。
ポイント: SDM OSC クロックの周波数設定は、SoM のシリアル番号 によって異なります。シリアル番号が A5SOM1E024D0001 ~ A5SOM1E024D0025 の SoM は 125MHz、それ以外の SoM は 25MHz です。
3. サンプルデザインの実行
ここからは、ビルド済みイメージを使用してサンプルデザインを実行する方法について記載します。MCU ソフトウェアについても Sulfur ボード出荷時に書き込み済みの環境で動作確認可能です。
Sulfur ボードの基本的な使い方、FPGA のコンフィグレーション方法、SD カードイメージの書き込み方法については、事前に Getting Started を参照してください。
注記: Sulfur ボード入手後に MCU ソフトウェアを書き換えている場合は、4-1. MCU プロジェクトの開き方、書き込み方法 の手順に従って本サンプルデザイン向けのソフトウェアに書き換えを行ってください。
3-1. 事前準備/ボード・セットアップ
3-1-1. ケーブル接続
電源スイッチ(SW18)が OFF になっている状態で、【図 2】【図 3】の通りにケーブルを接続してください。
特に、MCU CN22 コネクタは 10pin の GPIO ヘッダーとなっていますが、以下の3ピンのみを使用します。MCU-Link と Sulfur の両方の端子を確認した上で間違いが無いように接続してください。
-
- 2番Pin: GND
- 3番Pin: UART_TXD
- 4番Pin: UART_RXD
【図 2】ボード・セットアップ1(ケーブル接続)
【図 3】ボード・セットアップ2(MCU Pin Header 接続イメージ)
3-1-2. DIPSW / スライドスイッチ設定
基本は Getting Started の「4.2.2 DIPSW / スライドスイッチ設定(キャリアボード)」および「4.2.3 DIPSW 設定(SoM)」に記載の設定に合わせてください。
以下、本サンプルデザイン向けに変更する DIPSW/スライドスイッチの設定を記載します。
-
- CAN 終端抵抗スイッチ(SW 5,6)を両方とも ON(終端有効)に設定
- ボード背面の SW 4.2 を OFF(FPGA アクセス Enable)に設定
メモ: SW4.2 は MCU のユーザースイッチとして実装可能ですが、MCU のサンプル・ソフトウェアでは、CAN インターフェイス用の回路を含まない FPGA デザインを使用する場合を想定して、FPGA 側へのアクセス Enable/Disable 切換えの機能を持たせています。
3-1-3. HPS ブート用 SD カードを書き込み&装着
Linux SD カードイメージ(sdimage_agilex5_sulfur_QPDS24.3.1_v1.8.zip)をダウンロードして、SD カードへ書き込んでください。書き込みが完了したら Sulfur ボードの SD カードスロットへ挿し込んでください。
ヒント: SD カードイメージの書き込み方法は、Getting Started の「4.3 Sulfur Type-A 用 SD Boot Disk の作成」を参照ください。
3-1-4. FPGA コンフィグレーション・ファイルの書き込み&MSEL 変更(任意)
ポイント: Sulfur ボードのコンフィグレーション ROM を書き換えたくない場合は、この手順は飛ばしてください。実行時に適時 .sof ファイルを使用してコンフィグレーションします。
2. 提供ファイル の [3] から、適切な .jic ファイルを選択して、ダウンロードおよび書き込みを行ってください。書き込みが完了したら MSEL(SW 1.1, 1.2, 1.3)を AS(Fast)mode(OFF, ON, ON) に変更してください。
ヒント: コンフィグレーション・ファイルの書き込み方法は、Getting Started の「5.3.2 .sof ファイルの書き込み」を参照ください。Change File で指定するファイルを .sof から .jic に読み替えて対応ください。
3-2. デザインの実行/操作手順
3-2-1. ボードの電源投入
電源スイッチ(SW18)を ON に切り替えます。
3-2-2. ターミナル・ソフトウェア(TeraTerm)のセットアップ
ターミナル・ソフトウェアを起動して、FPGA と MCU のシリアルターミナル2系統をセットアップします。2系統ともに「ボーレート:115200、パリティなし、Stop ビット:1、フロー制御なし」の設定で接続を行ってください。
COM ポートは、以下の情報を参考に FPGA、MCU のターミナルを選択してください。
-
- FPGA の接続名: USB Serial Port(COMx)
- MCU の接続名: MCU-Link VCom Port(COMx)
【図 4】ターミナル・ソフトウェア(TeraTerm)のセットアップ
3-2-3. MCU ターミナル表示および MCU ソフトウェア・バージョンの確認
MCU 側のシリアルターミナルには【図 5】のようにバージョン情報が表示されます。
【図 5】MCU ターミナルの初期表示
Version 1.11 および Sulfur ボード入手以前のタイムスタンプが表示されていれば問題ありません。バージョン情報が異なる場合は、4-1. MCU プロジェクトの開き方、書き込み方法 の手順に従って本サンプルデザイン向けのソフトウェアに書き換えを行ってください。
ポイント: 「FPGA is not ready, or SW4.2 is on.」の表示は、FPGA のコンフィグレーションが完了していないか、SW4.2 の状態が正しくないことを示します。
3-2-4. FPGA コンフィグレーション・ファイル(.sof)の書き込み
ポイント: 3-1-4. FPGA コンフィグレーション・ファイルの書き込み & MSEL 変更(任意)を実行している場合は、この手順は不要です。
2. 提供ファイル の [3] から、適切な .sof ファイルを選択して、ダウンロードおよび書き込みを行ってください。
ヒント: コンフィグレーション・ファイルの書き込み方法は、Getting Started の「5.3.2 .sof ファイルの書き込み」を参照ください。
3-2-5. FPGA(HPS)ターミナルの確認および U-Boot プロンプト開始
FPGA コンフィグレーション完了とともに FPGA 用のシリアルターミナルに HPS のブートログの表示が開始されます。「Hit any key to stop autoboot: 」の表示に続けて 5 秒間のカウントダウンが行われるので、5 秒経過前に Enter キーを入力して U-Boot プロンプトの状態にしてください。
【図 6】HPS ターミナルの初期表示および U-Boot プロンプト開始
ポイント: 時間内にキー入力が検出されなかった場合は、Linux のブートが開始してしまいます。その場合は、再度 .sof ファイルの書き込みを行ってください。.jic ファイルを使用の場合は、FPGA_RST ボタン(SW11)を押下するか、電源再投入にてやり直してください。
3-2-6. FPGA - MCU 間インターフェイスの確認
.sof ファイルを使用している場合は、MCU リセットスイッチ(MCU SW7)を押下してください。
MCU 側のシリアルターミナルに「@@ Self Check for SPI I/F: result = SUCCEEDED.」が表示されていることを確認します。
【図 7】FPGA - MCU 間インターフェイスのセルフチェック
ポイント: @@ Self Check for SPI I/F の結果が ”FAILED" になる場合は、FPGA コンフィグレーション・ファイルを間違えている可能性があります。.sof/.jic ファイルを見直したうえで、再度 FPGA のコンフィグレーションを行ってください。
3-2-7. CAN 通信テスト開始
FPGA 用のターミナルからテスト用のマクロ( 2. 提供ファイル の [4] )を実行します。
このマクロでは以下のことを行います。詳細は [4] を開いてご確認ください。
-
- HPS-to-FPGA ブリッジ開放
- 送信データを CAN0 データ FIFO へ格納
- 送信データを CAN1 データ FIFO へ格納
- CAN1 への指示を送信イベント FIFO へ格納
- CAN1 TX → CAN0 RX への折り返し待ち
- CAN1 TX → CAN0 RX への折り返しデータ確認
- CAN0 への指示を送信イベント FIFO へ格納
- CAN0 TX → CAN1 RX への折り返し待ち
- CAN0 TX → CAN1 RX への折り返しデータ確認
- データ照合結果の表示『-- Test Succeeded!! --』or 『XXXX Test Failed. XXXX』
3-2-8. CAN 通信テスト実行&結果確認
テスト用マクロの実行開始後は、CAN1 -> CAN0、CAN0 -> CAN1 の順に FPGA から MCU を介して CAN 通信のループバックが行われます。受信データの照合結果もポップアップ・ウィンドウで表示されます。
【図 8】CAN 通信テストの実行イメージ
サンプルデザインの実行手順は以上です。
4. サンプルデザインの解説・補足情報
ここからは、サンプルデザインの実行以外に必要と思われる各種情報を紹介します。
4-1. MCU プロジェクトの開き方、書き込み方法
MCU ソフトウェアをビルド、デバッグ、ROM 書き込みを行う手順を紹介します。
MCUXpresso IDE および SDK のインストールは完了している前提で説明します。
4-1-1. MCUXpresso の起動
Windows のスタートメニューより「MCUXpresso IDE v24.12.148」を起動します。
スプラッシュ・ウィンドウに続けて、Workspace の指定ダイアログが表示されるので、作業場所を指定して Launch ボタンをクリックしてください。
【図 9】MCUXpresso IDE の起動
4-1-2. MCU プロジェクトのインポート
MCUXpresso IDE の起動が完了したら、【図10】を参考にプロジェクト・ファイル( 2. 提供ファイル の [1] )をインポートしてください。Welcome ウィンドウが表示されている場合は閉じてから作業してください。
ヒント: 【図10】のメニューの他、File メニュー -> Import.. からインポート画面を起動することもできます。
【図10】MCUXpresso プロジェクトのインポート
プロジェクトのインポートを実行すると以下の警告ウィンドウが表示される場合があります。この警告は、プロジェクト作成時に使用していた SDK Version とインポート先の SDK Version が異なる場合に表示されるメッセージになりますが、OK ボタンをクリックして閉じて問題ありません。
【図11】インポート完了後の警告メッセージ
注記: サンプルのプロジェクトは SDK Version 24.12.00 でも動作確認済みです。より新しい SDK Version を使用される場合は問題が生じる可能性があるのでご注意ください。
4-1-3. プレビルド・イメージの書き込み
MCU プロジェクトにはビルド済みの実行ファイル(axf イメージ)と Debug Configuration 設定を同梱しています。
Run メニュー -> Debug Configuration を起動して、設定済みの Debug Configuraion を選択することで、Sulfur 出荷時と同じプログラムを MCU のブート Flash に書き込むことができます。【図12】を参考に GUI Flash Tool の Program タブを選択した状態で Run.. ボタンをクリックしてください。
【図12】プレビルド・イメージの書き込み
以下のメッセージが表示されたら書き込み成功です。OK ボタンをクリック後、Debug Configuration ウィンドウを Close して作業終了してください。
【図13】プレビルド・イメージの書き込み成功
4-1-4. その他の操作(ビルド、デバッグ、他)
その他の操作は、一般的な Eclipse ベースの IDE 環境と同様の操作感で対応できます。
デバッガーの接続設定についても、プロジェクトに含まれる Debug Configuration をそのまま利用できます。Debug Configuration を開いて、Debug ボタンを押すだけでデバッグ開始できます。
その他、詳細情報はツールのドキュメントを参照ください。
参考資料: MCUXpresso IDE for NXP MCUs | Linux, Windows and MacOS | NXP Semiconductors | NXP Semiconductors
参考資料: NXP マイコン初心者ガイドまとめサイト - 半導体事業 - マクニカ
4-2. FPGA - MCU 間インターフェイス
本サンプルデザインに実装される FPGA と MCU 間でデータを受け渡す仕組みについて記載します。
4-2-1. FPGA の回路ブロック & MCU タスク構成
【図14】に FPGA 側の内部構造を示します。
FPGA と MCU 間は SPI バスで接続され、MCU(SPI マスター)から SPI Slave to Avalon-MM Bridge を介して FPGA 内部に Read/Write アクセス可能な構造を採用しています。2 系統ある CAN インターフェイスへの送受信データ受け渡し用に 5 種類の FIFO を実装して対応しています。
-
- CAN 送信データ: MCU が FIFO を定期監視して、FPGA からの送信リクエストを処理
- CAN 受信データ: MCU が受信した全てのデータを FPGA 側の FIFO へ格納
注記: FIFO Full を防ぐため MCU, FPGA 双方で定期的に FIFO を監視する必要があります。
ヒント: 対応可能な CAN 通信の仕様は、MCU 内蔵の CAN コントローラーの仕様に準じます。FPGA - MCU 間の SPI 通信がボトルネックになる可能性も考えられますが、CAN FD にも対応するため SPI バスのクロックは MCU 側の上限(48MHz)で実装しています。
【図14】FPGA - MCU 間インターフェイス(FPGA 内部ブロック)
MCU ソフトウェアの実装については、FPGA 側とのインターフェイス 1 系統と、2系統の CAN インターフェイスを並行して処理させるために FreeRTOS を使用しています。タスク構成およびタスク間のインターフェイスの概略は【図15】に示す通りです。詳細はソースコードを参照ください。
【図15】FPGA - MCU 間インターフェース(MCU 内部タスク構成)
4-3. FPGA 内部 FIFO の仕様
以下の 5 系統の FIFO を用意しています。
-
- 送信イベント FIFO(1 系統): CAN 0,1 選択、データサイズ、各種パラメーターを含め送信イベント通知に使用する。
- 送信データ FIFO(2 系統): CAN フレームに載せるデータ(ペイロード)の受け渡しに使用。Agilex 5 は送信イベントに含めるデータサイズと一致する分だけデータを積む。MCU は送信イベントで指定されたデータサイズ分の FIFO 段数だけデータを読み出す。
- 受信フレーム FIFO(2 系統): 受信した CAN フレームの情報全て(各種パラメーター&ペイロード両方)の受け渡しに使用。MCU は CAN コントローラーから受信した全ての情報を積む。
FPGA 内部の FIFO のアドレスは以下のように設定しています。
図中、青色の接続が FPGA 内部(HPS もしくは Nios V)からのアクセス用、橙色の接続が MCU から SPI 経由でのアクセス用となります。
【図16】CAN I/F 用 FIFO へのバス接続およびベースアドレス
MCU からアクセスする場合は、【図16】の Base の値をそのまま SPI 経由でアクセスする際に指定するアドレス値として使用します。
HPS(lwhps2fpga)から参照する場合は、lwhps2fpga のベースアドレス 0x00_2000_0000 + FIFO を実装するサブシステム(subsys_canif_0)のベースアドレス 0x0000_2000 に対して、【図16】の Base に表示されるアドレス値を加算したアドレスにてアクセスを行います。
以下、サブシステム(subsys_camof_0)のベースアドレスを含む設定画面です。
メモ: サンプルでは未使用ですが、Nios V からもアクセスできるようにバス接続してあります。
【図17】CAN I/F 用 サブシステムへのバス接続およびベースアドレス
4-3-1. 送信イベント FIFO(1 系統:CAN 0,1 共用)のデータ構造
CAN 0,1 識別情報を持たせる必要があるため独自フォーマットで実装しています。
-
- FIFO に格納する情報要素は、MCU 側 CAN コントローラー FIFO のペイロード以外
- MCU 側の event FIFO と buffer FIFO の両方向け
以下、MCU の CAN コントローラーの Tx buffer(FIFO)と Tx event(FIFO)の仕様を転載します。図中の T0, T1, E0, E1 に含まれる情報を扱える内容で独自フォーマットを定義しました。
【図18】MCU CAN コントローラーの 送信用 FIFO 仕様(NXP MCU マニュアルより引用)
【図19】送信イベント FIFO のデータ構造(独自フォーマット)
4-3-2. 送信データ FIFO(2 系統:CAN 0,1 独立)のデータ構造
送信データ用 FIFO のデータの仕様は、MCU 側の CAN コントローラー FIFO の DB フィールドと同一としています。【図18】 の Fig 134. Tx buffer element の T2~Tn に示されるデータ構造をそのまま格納します。
4-3-3. 受信フレーム FIFO(2 系統:CAN 0,1 独立)のデータ構造
受信フレーム用 FIFO のデータの仕様は、MCU 側の CAN コントローラー FIFO と同一としています。下記仕様と同じデータ構造をそのまま FIFO へ格納します。
【図20】MCU CAN コントローラーの 受信用 FIFO 仕様(NXP MCU マニュアルより引用)
4-4. SPI-to-AVMM Bridge のドライバーについて
MCU から SPI 経由で FPGA にアクセスするためには、専用のドライバーの実装が必要です。
以下のページに公開されているサンプルドライバーをベースに、NXP MCU の SPI コントローラー用の API を使用するように変更して使用しています。
参考: SPI Agent to Avalon Host Bridge Design Example | Intel
MCU ソフトウェア・プロジェクトの source/alt_spi_to_avalon_bridge フォルダー以下に、NXP MCU 向けに変更済みのドライバーのソースコード一式が格納されています。より詳細な情報を確認したい場合は、直接ソースコードを参照してみてください。
おわりに
Sulfur ボードの FPGA と MCU を組み合わせて CAN I/F の通信確認を行う手順を紹介しました。
Sulfur ボードには、CAN I/F を実装する目的で MCU が搭載されていますが、MCU 用のソフトウェアをカスタマイズすることで、その他の用途・検証に利用することも可能です。
MCU の使い方については以下のページにて各種情報を公開しています。ぜひご活用ください。
参考資料: NXP マイコン初心者ガイドまとめサイト - 半導体事業 - マクニカ