nao-milkの経験ブログ

25年間の半導体エンジニア経験で知り得た内容を記載したブログです。

CPUを含めた回路はFPGAが便利

f:id:nao-milk:20210325165741p:plain

ARMはハードマクロとして物理的に組み込まれているので別ですが、

NIOSやMicroblazeなどのソフトマクロCPUは便利です。

 

私が論理回路からのエンジニアだったので、ソフト処理は極力少なくしようと設計していました。

そんな中、便利だなぁ~と思ったのが、

  1. CPUが何個も配置できる
  2. メモリサイズが変更できる
  3. 内部メモリにそのままプログラムが保存できる

でした。

f:id:nao-milk:20210324202053p:plain

CPUが何個も配置できる

FPGAのリソースもありますが、これは便利でした。

特に、レジスタのリード/ライトや低周期アクセスの通信系はCPU1に任せ、

Etherなど処理を速くするものは、CPU2で専門にさせるなどしていました。

 

メモリサイズが変更できる

CPU1とCPU2のプログラム量に応じてCPUが使用するメモリサイズを変更できるので、空いた分、User Logicで使うことができました。

 

内部メモリにそのままプログラムが保存できる

CPUが使うプログラムメモリを内蔵RAMに指定できることです。

これにより、外部(基板上)にプログラムを格納するFlashが不要になる。

ことでした。

 

Nios IIでは、「Nios II Software Build Tools for Eclipse」からCPU1またはCPU2を選択して書き込みができ、デバッグも容易でした。

 

どのような仕組み?

簡単に言うと、内蔵RAMの初期値ファイルをCPUのプログラムデータとしておく。

ということです。

下がイメージ図です。

f:id:nao-milk:20210325161757p:plain

仕組みイメージ図

① CPU1とCPU2のC言語ソースファイルを作成します。

  「Nios II Software Build Tools for Eclipse」で、CPU1用とCPU2用を作ります。

② それぞれ「Nios II Software Build Tools for Eclipse」でコンパイルします。

  コンパイル後、「Make Targets」で、内蔵RAMの初期値フォーマットに変換します。

③ Quartusを実行し、コンフィグレーションコードを生成します。

  最初の場合、「Make Targets」で作成した「meminit.qip」をそれぞれQuartusに設定します。

 以降は、関連付けされているので、設定する必要はないです。

④ コンフィグレーションコードを基板上のROMに書き込みます。

あとは、電源を投入するとROMの内容がFPGAに書き込まれ、自走します。

 

補足)

 Quartusですでにコンパイルが済んでおり、NIOSのプログラムのみ修正した場合は、

  1.  「Nios II Software Build Tools for Eclipse」でソースをコンパイル
  2.  「Nios II Software Build Tools for Eclipse」で「Make Targets」を実行
  3.  「Quartus」で[Processing] ⇒ [Update Memory Initialization File] を実行
  4.  「Quartus」でAssembler を実行

 の手順でコンフィグレーションコードを生成できます。

 すでに論理合成と配置配線が完了しているので、内蔵RAMの初期値データだけ変更するだけで済み、Quartus実行時間も少なくてすみます。

 

最後に

仕組みを理解すると、手順のイメージが付くと思います。

Niosコードを修正した場合の手順、RTLソースを修正した場合の手順、Platform Designerで構成を修正した場合の手順などの実行イメージが付くと思います。