FPGA MAX10(17)-Nios II マルチコア

前回は、MAX10にNios Ⅱを搭載して動作をさせてみました。Nios IIの周辺機器としてTimerを配置してLEDの点滅回路を構築しました。前回の内容は下記のサイトを参考にしてください。

FPGA MAX10(16)-Nios II

前回、timer_0とtimer_1を用意してtimer_0にfor文をのwait処理を入れました。すると、1秒間隔で点滅していたLED0とLED1が約12秒間隔で点滅するような動作になりました。timer_0で動作しているLED0はともかく、timer_1で動作しているLED1まで約12秒間隔になってしまうのはなぜでしょうか?CPU1個の動作であり、順次処理をしているので、timer0の処理で止まってしまい、timer1にまで影響を及ぼしているためです。では、CPUを2個搭載すればよいのでは?ということで、今回はCPUを2つ搭載して動作させてみたいと思います。機能としては、前回と同様にTimerによるLED点滅回路になります。

それでは、Nios Ⅱを2つ使用したLEDの点滅回路を構築したいと思います。まずは新規プロジェクトを作成します。新規プロジェクトの作成方法、下記のリンクを参照してください。

FPGA MAX10(4)-LEDシフト点灯回路

まずは、Platform Designerを使用して、各コンポーネント(CPUや周辺機器など)を配置、接続します。メニューより「Tools」→「Platform Designer」を選択します。Platform Designerの画面が表示されます。Platform Designerの設定内容方法は、下記のサイトを参考にしてください。

FPGA MAX10(15)-AD変換

System Contentsに下記のように追加されたコンポーネントが表示されています。

FPGA MAX10(16)-Nios II

前回は、MAX10に搭載されているADCを使用してAD変換を行いました。AD変換した電圧の値を7セグメントに表示する機能です。7セグメントに表示する値は、入力電圧を1000倍した値を表示します。前回の内容は下記のサイトを参考にしてください。

FPGA MAX10(15)-AD変換

今回は、MAX10にNios IIを搭載して動作をさせてみたいと思います。Nios IIは、Intel社から提供されているCPUです。Nios IIの周りに周辺機器を配置すればマイコンのような動作をさせることができます。機能としては、Timerを使用したLEDの点滅回路を構築します。

それでは、Nios IIを使用したLEDの点滅回路を構築したいと思います。まずは新規プロジェクトを作成します。新規プロジェクトの作成方法、下記のリンクを参照してください。

FPGA MAX10(4)-LEDシフト点灯回路

まずは、Platform Designerを使用して、各コンポーネント(CPUや周辺機器など)を配置、接続します。メニューより「Tools」→「Platform Designer」を選択します。Platform Designerの画面が表示されます。Platform Designerの使い方は、下記のサイトも参考にしてください。

FPGA MAX10(15)-AD変換

FPGA MAX10(15)-AD変換

前回は、RS232Cの通信ポートを使用したシリアル通信のエコーバック機能を構築しました。受信したデータをそのまま送信する機能になります。bandrateは9600bps、ストップビットは1ビットです。シリアル通信を行う相手側はPC上のTeraTermになります。追加機能として、下記の機能も構築しました。受信したデータは2進数表現でLEDに表示しました。アスキーコードで0~9の値を受信した場合は、7セグメントにその値を表示しました。0~9以外の値を受信した場合は、7セグメントを非表示にしました。前回の内容は下記のサイトを参考にしてください。

FPGA MAX10(14)-RS232Cシリアル通信エコーバック

今回は、MAX10に搭載されているADCを使用してAD変換を行おうと思います。AD変換した電圧の値を7セグメントに表示する機能です。7セグメントに表示する値は、入力電圧を1000倍した値を表示します。

それでは、MAX10に搭載されているADCを使用してAD変換を行う機能を構築したいと思います。まずは新規プロジェクトを作成します。新規プロジェクトの作成方法、下記のリンクを参照してください。

FPGA MAX10(4)-LEDシフト点灯回路

FPGA MAX10(14)-RS232Cシリアル通信エコーバック

前回は、RS232Cの通信ポートを使用してシリアルデータを受信する機能を構築しました。具体的には、アスキーコードの0~9を受信すると、7セグメントに受信した数字を表示する機能になります。0~9以外の値を受信した場合は、7セグメントを非表示にします。データの送信はPC上のTeraTermから行います。前回の内容は下記のサイトを参考にしてください。

FPGA MAX10(13)-RS232Cシリアルデータ受信

今回は、RS232Cの通信ポートを使用したシリアル通信のエコーバック機能を構築したいと思います。受信したデータをそのまま送信する機能になります。bandrateは9600bps、ストップビットは1ビットです。シリアル通信を行う相手側はPC上のTeraTermになります。追加機能として、下記の機能も構築しようと思います。受信したデータは2進数表現でLEDに表示したいと思います。アスキーコードで0~9の値を受信した場合は、7セグメントにその値を表示します。0~9以外の値を受信した場合は、7セグメントを非表示にします。

それでは、RS232Cの通信ポートを使用したシリアル通信のエコーバック機能を構築したいと思います。まずは新規プロジェクトを作成します。新規プロジェクトを作成できたら、IPを使用してPLL回路を追加します。PLLでは50MHzのクロックを入力として、10MHzのクロックを出力します。新規プロジェクトの作成方法、PLLの追加方法は下記のリンクを参照してください。

FPGA MAX10(4)-LEDシフト点灯回路

FPGA MAX10(13)-RS232Cシリアルデータ受信

前回は、RS232Cの通信ポートを使用してシリアルデータを送信する機能を構築しました。具体的には、トグルスイッチを使用して、8ビットのデータ作成して、プッシュスイッチを押すと、シリアルデータとして送信する仕組みを構築しました。送信されたシリアルデータはPC上のTeraTermに表示しました。前回の内容は下記のサイトを参考にしてください。

FPGA MAX10(12)-RS232Cシリアルデータ送信

今回は、RS232Cの通信ポートを使用してシリアルデータを受信する機能を構築したいと思います。具体的には、アスキーコードの0~9を受信すると、7セグメントに受信した数字を表示する機能になります。0~9以外の値を受信した場合は、7セグメントを非表示にします。bandrateは9600bps、ストップビットは1ビットです。データの送信はPC上のTeraTermから行います。

それでは、RS232Cの通信ポートを使用してシリアルデータを受信する機能を構築したいと思います。まずは新規プロジェクトを作成します。新規プロジェクトを作成できたら、IPを使用してPLL回路を追加します。PLLでは50MHzのクロックを入力として、10MHzのクロックを出力します。新規プロジェクトの作成方法、PLLの追加方法は下記のリンクを参照してください。

FPGA MAX10(4)-LEDシフト点灯回路

FPGA MAX10(12)-RS232Cシリアルデータ送信

前回は、Modelsimを使用してシミュレーション評価をしました。

Modelsimを使用してシミュレーションを実行した場合のシミュレーションの流れは下記のサイトを参考にしてください。

FPGA MAX10(10)-ModelSim①

QuartusPrimeからModelsimを起動して、シミュレーションを実行した場合のシミュレーションの流れは下記のサイトを参考にしてください。

FPGA MAX10(11)-ModelSim②

今回は、RS232Cの通信ポートを使用してシリアルデータを送信する機能を構築したいと思います。具体的には、トグルスイッチを使用して、8ビットのデータ作成して、プッシュスイッチを押すと、シリアルデータとして送信する仕組みを構築します。bandrateは9600bps、ストップビットは1ビットです。送信されたシリアルデータはPC上のTeraTermに表示したいと思います。

それでは、RS232Cの通信ポートを使用してシリアルデータを送信する機能を構築したいと思います。まずは新規プロジェクトを作成します。新規プロジェクトを作成できたら、IPを使用してPLL回路を追加します。PLLでは50MHzのクロックを入力として、10MHzのクロックを出力します。新規プロジェクトの作成方法、PLLの追加方法は下記のリンクを参照してください。

FPGA MAX10(4)-LEDシフト点灯回路

次に、VHDLファイルを作成して回路を構築していきます。まずは、プッシュスイッチのポーリング処理とエッジ検出処理機能を構築します。こちらのモジュールの作成方法は、下記のリンクを参照してください。

FPGA MAX10(9)-ポーリング処理とエッジ検出処理

FPGA MAX10(11)-ModelSim②

前回は、Modelsimを使用してシミュレーション評価をしました。前回の内容に関しては、下記のサイトを参考にしてください。

FPGA MAX10(10)-ModelSim①

テストベンチで疑似入出力信号を入出力することで、回路が想定した動きをしているかどうかシミュレーション上で確認することができたと思います

前回は、Modelsim単体を起動して、シミュレーションの実行する流れを行いました。今回は、QuartusPrimeからModelsimを起動して、シミュレーションを実行してみたいと思います。

前回と同様で、プッシュスイッチを押すとトグルスイッチで指定した数値をSPI通信で送信、受信を行い、7セグメントに表示する回路を使用してシミュレーションを行おうと思います。テストベンチも前回と同様のものを使用したいと思います。

それでは、Modelsimを使用してシミュレーションを実行しようと思います。
まずはQuartusPrimeを使用して、Modelsimを実行するための設定を行います。新規プロジェクト作成時、既に設定していればよいのですが、私は設定していなかったので、まずは設定します。

FPGA MAX10(10)-ModelSim①

前々回に、プッシュスイッチを押すとトグルスイッチで指定した数値をSPI通信で送信、受信を行い、7セグメントに表示する機能を作成しました。

FPGA MAX10(8)-SPI通信

ただし、プッシュスイッチを少し押しただけであるが、プッシュスイッチ(SET_N)が押し続けている状態になっています。FPGAとしては、10MHz(100nsec)クロックで動作しているので、スイッチは押し続けていると判定されてしまいます。そのため、一度送信すればよい数値データを繰り返し送信してしまっています。

そこで、ポーリング処理とエッジ検出機能を追加しました。プッシュスイッチを押すと、一度だけSPI通信を行っており、ポーリング処理とエッジ処理が動作していることがわかります。

前回までは、実機動作やSignalTapを使用して評価をしていましたが、今回は、Modelsimを使用してシミュレーション評価をしてみたいと思います。簡易的な回路であれば、実機動作で作りこんでいくことも可能ですが、複雑な回路になると、Modelsimなどの論理シミュレータを使用してデバッグしていくと作業が効率的です。

今回、下記の2つの流れでModelsimを動作させてみようと思います。どちらも結果としては同じになりますので、使いやすいほうでよいかと思います。

  • Modelsim単体を起動して、シミュレーションの実行。
  • QuartusPrimeからModelsimを起動して、シミュレーションを実行。

それでは、Modelsimを使用してシミュレーションを実行しようと思います。シミュレーションは、前々回のポーリング処理とエッジ検出機能が追加していないバージョンのモデルを使用してシミュレーションを行いたいと思います。今回は、Modelsim単体を起動して、シミュレーションの実行してみたいと思います。まずはテストベンチの作成です。下記のようにテストベンチを作成しました。

FPGA MAX10(9)-ポーリング処理とエッジ検出処理

プッシュスイッチを押すとトグルスイッチで指定した数値をSPI通信で送信、受信を行い、7セグメントに表示することができました。

FPGA MAX10(8)-SPI通信

ただし、今回作成した機能はプッシュスイッチのところに課題があります。シグナルタップアナライザで確認してみると下記のように出力されました。

プッシュスイッチを少し押しただけであるが、プッシュスイッチ(SET_N)が押し続けている状態になっています。FPGAとしては、10MHz(100nsec)クロックで動作しているので、スイッチは押し続けていると判定されてしまいます。そのため、一度送信すればよい数値データを繰り返し送信してしまっています。

そこで、エッジ検出が必要となってきます。今回は、前回作成したSPI通信の機能に、エッジ検出を追加ししたいと思います。合わせてチャタリング除去のためにポーリング処理も追加したいと思います。具体的には下記のようにエッジ検出処理とポーリング処理機能を構築します。

  • プッシュスイッチが100msec毎に押されているかどうか判定する。
  • 2回スイッチが押されていると判定された場合、FF(フリップフロップ)にその情報に「1」を入力する。
  • もう一つFFを用意しておき、こちらには前回の値を保存しておく。
  • 前回の値が「0」、且つ、今回の値が「1」の場合、エッジ検出信号を「1」にする。

エッジ検出処理とポーリング処理機能を構築していきたいと思います。下記のようなモジュールを用意します。

FPGA MAX10(8)-SPI通信

7セグメントの出力部分が、出力先と条件以外はほぼ同じような記述がされているので、この部分をモジュールで作成してトップのVHDLファイルから呼び出すように改良をしました。機能ごとにファイルを分けることで、VHDLファイルが整理できました。

前回の内容は下記を参照してください。

FPGA MAX10(7)-モジュールのインスタンス化

今回は、SPI通信の回路を構築したいと思います。SPI通信は、クロック同期式のシリアル通信です。SPI通信では、下記のような4つのピンを使用します。

  • クロック(SPI CLK、SCLK)
  • チップセレクト(CS)
  • マスタ出力-スレーブ入力(MOSI)
  • マスタ入力-スレーブ出力(MISO)

MOSI、MOSOをSDO、SDIで表記している場合もあります。SPI通信は1つのマスタに対し、複数のスレーブを接続することができます。どのスレーブと通信するかはチップセレクタで選択します。

以前、SPI通信を使用して、RXマイコンでDACを制御しました。

RX(7)-SPI通信によるDAC制御

この時は、MOSIは使用しましたが、MISOは使用していないと思います。このように3ピンのみ使用して通信する場合もあります。

今回は、プッシュスイッチを押すと、トグルスイッチで指定した数値をSPI通信で送信します。受信したら、その数値を7セグメントで表示する機能を構築したいと思います。2つの評価ボードがあれば、通信している感じがあり、よりよいのですが、今回は1つの評価ボード上で、自ら送信を行い、自ら受信する機能を構築します。もう少し具体的に機能を考えると下記のようになります。

  • トグルスイッチを4つ使用して、0~9を指定できるようする。10~16の時は、0として扱います。
  • プッシュスイッチを押すと、トグルスイッチで指定した数値をSPI通信で送信する。
  • SPI通信で送信されたデータを受信する。
  • 受信した数値をを7セグメントに表示する。

それでは、機能を構築していきたいと思います。まずは新規プロジェクトを作成します。新規プロジェクトを作成できたら、IPを使用してPLL回路を追加します。PLLでは50MHzのクロックを入力として、10MHzのクロックを出力します。新規プロジェクトの作成方法、PLLの追加方法は下記のリンクを参照してください。

FPGA MAX10(4)-LEDシフト点灯回路

次に、VHDLファイルに動作内容を記述していきます。まずは、SPI通信の送信機能のモジュールを構築します。この送信機能は今回マスター側にもたせます。