Nios の初体験 - Hello world!


序文

環境:
1. Quartus18.0
2. vscode
3. ボードモデル: Atomic Brother Pioneer 2 (EP4CE10F17C8)
要件:
Nios 経由で Hello world! を出力します。


1. システム設計

1. システムモジュールのブロック図

ここに画像の説明を挿入
ここに画像の説明を挿入

Nios II プロセッサーは、Avalon バスを介して ROM および RAM に接続されており、Avalon バスは命令とデータの送信に使用されます。さらに、Qsys システムは、ユーザーがプログラムをダウンロードしてデバッグするための JTAG インターフェイスも提供します。

2. システムに関与するモジュール

1.時計

clk IP コアの正式名は Clock Source で、ここでシステム全体の動作クロック周波数を設定します。

2、nios2_qsys

これは以前 Qsys を紹介したときにも学んだことですが、これは Qsys 全体のコントロールセンターであり、割り込みの割り当て、アドレスの管理、メモリのスケジューリングなどの主な制御の役割を果たしており、脳の下部に相当します。アヴァロンを通じて外界と通信する。

3. オンチップストレージ (onchip_rom、onchip_ram)

ここでは 2 つのオンチップ メモリ、ROM と RAM を作成しました。これら 2 つのオンチップ メモリは、FPGA のオンチップ ストレージ リソースを使用して実装されており、命令とデータを保存するだけでなく、プログラムの実行領域としても機能します。なお、ROMの実装はFPGA内に専用のROMリソースを持たず、RAMに初期値を代入し、その値を常に保持して読み出し専用にすることでオンチップROM(読み出し専用)を実現します。記憶のみ)。

4. シリアル通信(jtag_uart)

JTAG UART IP コアは、JTAG インターフェイスを使用して、ホスト コンピューターと Qsys システム間のシリアル通信を実装します。JTAG UART IP コアは、ユーザーにAvalon-MM インターフェイス マッピングを提供し、複雑な JTAG インターフェイス プロトコルを保護します。

5、システムID(sysid_qsys)

System ID IP コアは、各 Nios II システムの一意の識別子 (ID) を生成し、それを System ID コアのレジスターに書き込む Avalon インターフェイスを備えた読み取り専用デバイスです。コンパイラとユーザーは、この IP コアを使用して、コンパイルされた実行可能プログラムが FPGA に構成されたハードウェア環境と一致するかどうかを検証できます。実行可能プログラムの ID が FPGA のシステム ID コアに保存されている ID と一致しない場合、プログラムは実行時に失敗する可能性があります。

2. ハードウェア設計

Qsys システム設計を開始する前に、チップモデルに従って Quartus プロジェクトを作成する必要があります。これについてはすでにここで紹介されているため、ここでは繰り返しません。違いは、追加の qsys フォルダーを作成し、その下に新しいハードウェア フォルダーとソフトウェア フォルダーを作成して、qsys デザインのハードウェア部分とソフトウェア部分をそれぞれ保存する必要があることです。次に、Quartus II プロジェクトの IP コアを保存するために、prj フォルダーの下に新しい ipcore フォルダーを作成する必要があります。

1. Qsysの作成

  • 「tools」→「platfrom Desiger」をクリックして、設計インターフェースに入ります。
    ここに画像の説明を挿入
  • クロック周波数を 100M に変更します。
    ここに画像の説明を挿入

100MHZ に変更し、「完了」をクリックして完了します。そうしないと、変更は失敗します。

  • Nios II IP コアを追加します。
    ここに画像の説明を挿入

  • Nios II IP コアをダブルクリックして、設定インターフェイスに入ります。
    ここに画像の説明を挿入

ここでは、「Nios II/f」カーネルのデフォルト選択を保持し、後でエラーを解決します。完了をクリックします。

  • 正常に追加されました:
    ここに画像の説明を挿入
  • オンチップ ストレージ ROM IP コアを追加します。
    ここに画像の説明を挿入
  • また、ダブルクリックして構成インターフェイスに入ります。
    ここに画像の説明を挿入

これを ROM (読み取り専用) として設定し、サイズを 10240 (10KB) に設定する必要があります。残りはデフォルトです。

  • 同様に、RAM を構成します。
    ここに画像の説明を挿入

[タイプ] オプションを [RAM (書き込み可能)] に設定し、[合計メモリ サイズ] を [20480] (20KB) に変更します。他のオプションはデフォルト設定を維持し、最後に「完了」をクリックします。

  • JTAG UART IP コアを追加します。
    ここに画像の説明を挿入
  • ここではデフォルトのままにしておきます。
    ここに画像の説明を挿入
  • システム ID IP コアを追加します。
    ここに画像の説明を挿入
  • ここではデフォルトのままにして、「完了」をクリックします。
    ここに画像の説明を挿入

2. IP コアと接続の名前を変更します

理解を容易にし、後のソフトウェア プログラムで使用できるように、シンプルでわかりやすい名前に変更するよう努めています。

  • 右クリックし、「名前の変更」をクリックして名前を変更します。
    ここに画像の説明を挿入
  • 変更された名前:
    ここに画像の説明を挿入
  • 接続: IP コアを接続します:

接続する場合は、「接続」列の対応するノードをマウスでクリックすると、接続後、各ノードの白丸が実線になり、対応する接続​​線がライトグレーから黒に変わります。

  • リセット信号とクロック信号を各 IP コアに接続します。
    ここに画像の説明を挿入
  • データ マスター ポート「data_master」と命令マスター ポート「instruction_master」の間の接続:
    ここに画像の説明を挿入
  • 知らせ:

これら 2 つのポートの配線は次の規則に従います。データ マスター ポートはすべてのペリフェラル IP コアに接続され、命令マスター ポートはメモリ IP コアにのみ接続されます。

  • 「jtag_debug_module_reset」信号を接続します。
    ここに画像の説明を挿入
  • 知らせ:

ワイヤを接続した後、jtag_uart IP コアの割り込み信号を「IRQ」列の Nios II プロセッサに接続する必要があります。接続が中断されると、Qsys は自動的にその中断に優先順位を割り当てます。

  • Nios II IP コアをダブルクリックして、リセット アドレスと例外アドレスを設定します。
    ここに画像の説明を挿入

このとき、finishはエラーを報告しますので、まず以下の自動割り当てを設定しましょう

  • ベースアドレスの割り当てを設定します。
    ここに画像の説明を挿入
    設定が完了すると、以前の人気が消え、終了して生成して Qsys システムを生成できます。
  • ビルドプロセス:
    ここに画像の説明を挿入

3. Qsysシステムの統合

  • Qsys によって生成された .qip ファイルをプロジェクトに追加します。
    ここに画像の説明を挿入
  • PLL フェーズ ロック ループの構成:
    ここで、Qsys システムを設計したときの構成は 100Mhz でしたので、ここでは 2 倍の周波数を達成するために PLL IP コアを作成する必要があります。ここで繰り返さないでください。
    IP コアの概要と PLL_IP コアの呼び出し

4. トップレベルのファイルのインスタンス化:

  • Qsys デザイン インターフェイスを開き、Qsys フォルダーで qsys ファイルを見つけて開きます。
    ここに画像の説明を挿入
    ここに画像の説明を挿入
    ここに画像の説明を挿入
  • Qsys システムのインスタンス化コードを自動的に生成します。
    ここに画像の説明を挿入

しかし、なぜここで生成できないのかわからないので、トップレベルのモジュールを自分でインスタンス化し、インスタンス化後に rtl フォルダーに配置し、トップレベルのファイルとしてプロジェクトに追加します。

module qsys_hello_world(
 input sys_clk, //晶振时钟,50Mhz
 input sys_rst_n //按键复位,低电平有效
 );
 
 //wire define
 wire clk_100m; //Qsys 系统时钟,100Mhz
 
 //例化 pll IP 核
 pll u_pll(
 .inclk0 (sys_clk),
 .c0 (clk_100m)
 );

 //例化 Qsys 系统
 hello u_qsys(
 .clk_clk (clk_100m),
 .reset_reset_n (sys_rst_n)
 );

 endmodule

5. コンパイルとダウンロードの操作:

  • 割り当て→デバイス:
    ここに画像の説明を挿入

  • 未使用のピンを高インピーダンス入力として設定します。
    ここに画像の説明を挿入

  • すべての「値」列を「通常の I/O として使用」に設定します。
    ここに画像の説明を挿入

  • 以下は、分析と合成を行ってから、完全なコンパイル用にピンを割り当てる手順です。
    ここに画像の説明を挿入
    ここに画像の説明を挿入

コンパイルが完了すると、次はソフトウェアの設計フェーズになります。

3. ソフトウェア設計

  • Toos の下の Nios II SBT for Eclipse をクリックします。
    ここに画像の説明を挿入

  • ワークスペースをソフトウェア フォルダーに変更します。
    ここに画像の説明を挿入

  • 「OK」をクリックして入力し、「ファイル」→「新規」→「テンプレートから Nios II アプリケーションと BSP」を選択して、新しい Nios II プロジェクトを作成します。
    ここに画像の説明を挿入

  • Nios II プロジェクトをセットアップします。
    ここに画像の説明を挿入

  • デフォルトでは、システムは BSP (ボード サポート パッケージ) の作成を支援し、デフォルトを維持して [完了] をクリックします。
    ここに画像の説明を挿入

  • 「完了」をクリックすると、左側に 2 つのファイルが追加されたことがわかります。ここに画像の説明を挿入

  • c/c++ の point c ファイルをクリックし、出力内容を変更して保存します。
    ここに画像の説明を挿入

  • hello_world を右クリックし、「プロジェクトのビルド」を選択してコンパイルします。

エラー:
ここに画像の説明を挿入
解決策:
hello_world_bsp を選択して右クリックし、次の操作を実行します。
ここに画像の説明を挿入

  • チェックマークを追加します。
    ここに画像の説明を挿入

Enable_reduced_device_drivers :
BSP はプロセッサのペリフェラル用に 2 つのバージョンのドライバー ライブラリを提供します: 1 つは実行速度が速いがコード量が比較的多いバージョンで、もう 1 つはパッケージが小さいバージョンです。デフォルトではコード量の多いバージョンが使用されますが、ここでは
enable_reduced_device_drivers:オプションを使用してパッケージサイズの小さいバージョンを選択することでコード量を削減しています。enalbe_small_c_library: 完全な ANSI C 標準ライブラリは、通常、組み込みシステムには適していません。BSP は、占有リソースが少ない一連の調整された ANSI C 標準ライブラリを提供します。[enalbe_small_c_library] オプションを使用して、合理化された ANSI C 標準ライブラリを選択できます。

  • チェックを外します:
    ここに画像の説明を挿入

Enable_c_plus_plus:ソフトウェア プログラムの作成には C 言語を使用するため、C++ を有効にする必要はありません。
Enable_clean_exit:このオプションが選択されている場合、メイン関数 main() が返されたときに、システム ライブラリは exit() を呼び出します。exit() が呼び出されると、最初に I/O バッファがクリーンアップされ、次に _exit() が呼び出されます。このオプションが選択されていない場合、システム ライブラリは _exit() のみを呼び出します。これにより、プログラム領域が節約されます。組み込みシステム プログラムの場合、通常は main() から返されないため、このオプションはオフにすることができます。

次に、最初に「生成」をクリックしてから終了します。

  • プロジェクト全体をコンパイルします。
    ここに画像の説明を挿入
  • 正常にコンパイルされました:
    ここに画像の説明を挿入

4. ダウンロードの検証

ここでは 2 つのファイルをダウンロードする必要があります。最初に sof をダウンロードし、次に elf をダウンロードします。ここではelfファイルのダウンロードのみを紹介します。

  • プロジェクト名を右クリックして、[実行形式] > [Nios II Hardware] を選択します。

1 つのステップが成功すると、コンソールは正常に印刷されます。そうでない場合は、次のポップアップ ウィンドウが表示されます。

提示我们找不到与Nios II硬件系统的连接
ここに画像の説明を挿入

この手順が成功すると、コンソールは正常に印刷されます。そうでない場合は、次のポップアップ ウィンドウが表示されます。

ここに画像の説明を挿入

ブロガーは上記の問題を長い間探してきましたが、問題も解決策も見つかりませんでした。数日間破棄しましたが、週末に開いたら再び動作しました。

  • ダウンロードが完了すると、コンソールに対応する情報が出力されます。
    ここに画像の説明を挿入

V. まとめ

要約すると、大ハンマーで豚を殺すという 1 つの文ですが、ここでは、単純な出力を実装するときに手順が少し複雑であることがわかりました。ここでは、その後の表示手順を容易にするために、ブロガーがここでより詳細に書きました。以下の大型プロジェクトでは、ニオスの魅力を味わうことができます。皆さんも、設定するとき、特に接続が行われる場所には注意してください。最近はDHT11の温湿度読み取りやopenvinoによるナンバープレート認識などに取り組んでいますので、ご期待ください。

6. 参考文献

上記の情報は、punctual atom の教育ビデオまたは Pioneer 2 の開発チュートリアルからのものです。atomの公式
ソース コード: https://github.com/no1jiangjiang/Nios_hello

おすすめ

転載: blog.csdn.net/qq_52215423/article/details/132016851