ver.1
Silicon Labs 社製クロック・ジェネレータ Si5338
設定用 FPGA デザイン例
Silicon Labs 社製クロック・ジェネレータ Si5338 設定用
FPGA 設計仕様書
目次
はじめに ...4 1. 開発キットおよびハードウェアの概要 ...6 2. クロック・ジェネレータ Si5338 の概要 ... 6 2-1. 開発キットの Si5338 クロック構成について ... 9 2-2. 2-2-1. 開発キットにおけるクロック信号の接続関係 ... 9 2-2-2. 開発キットにおける I2C インタフェースの接続関係 ... 12 FPGA デザインの構成について ... 17 2-3. 2-3-1. ブロック図 ... 17 2-3-2. アドレス・マップ ... 18 2-3-3. ピン・アサイン ... 18 FPGA デザイン例の詳細 ...19 3. トップ階層 ... 19 3-1. Qsys システム ... 20 3-2. Nios II ... 21 3-3. I2C マスタ・コントローラ ... 22 3-4. サンプル・プログラムの概要 ...31 4. 開発環境の準備 ...35 5. アルテラ Quartus Prime 開発ソフトウェアのインストール ... 36 5-1. Silicon Labs ClockBuilder デスクトップ・ソフトウェアのインストール ... 37 5-2.Silicon Labs 社製クロック・ジェネレータ Si5338 設定用
FPGA 設計仕様書
サンプル・プログラム・プロジェクトの作成、ビルドおよび動作確認 ...40 6. 開発キットのセットアップ ... 40 6-1. 6-1-1. 開発キットのボード設定 ... 40 6-1-2. 開発キットへのデザイン(.sof ファイル)書き込み ... 41 Si5338 用レジスタ・マップ・ヘッダファイルの作成と編集 ... 43 6-2. 6-2-1. レジスタ・マップ・ヘッダファイル register_map.h の作成 ... 43 6-2-2. レジスタ・マップ・ヘッダファイルの編集 ... 47 Nios II SBT でのサンプル・プログラム・プロジェクトの作成、ビルドおよび実行 ... 49 6-3. 6-3-1. サンプル・プログラム・プロジェクトの作成 ... 49 6-3-2. サンプル・プログラム・プロジェクトのビルド ... 52 6-3-3. サンプル・プログラム・プロジェクトの実行 ... 53 開発キット上での Si5338 クロック・ジェネレータ出力の確認 ... 54 6-4. 改版履歴 ...56はじめに
1.
この資料は、Silicon Labs 社製のクロック・ジェネレータ Si5338 に対して、アルテラの Straix®
V デバイスに実 装したアルテラの Nios® II プロセッサから、I2C インタフェースを経由して周波数の逓倍・分周を設定する為のデ ザイン例について説明するものです。 このデザイン例は、アルテラの Stratix V アドバンスト・システム開発キット(以下、開発キットと呼びます)にて動 作を確認しています。
Stratix V Advanced System Kit リファレンス・マニュアル
https://www.altera.com/en_US/pdfs/literature/manual/rm_svgx_as_dev_board.pdf Stratix V Advanced System Kit ユーザ・ガイド
https://www.altera.com/en_US/pdfs/literature/ug/ug_svgx_as_dev_kit.pdf
【図 1-1】 Stratix V Advanced System Kit
周波数の逓倍・分周の設定は、Silicon Labs 社の ClockBuilder デスクトップ・ソフトウェアによって作成したレジ スタ・マップ・ヘッダ・ファイルに反映されている各種パラメータ(逓倍/分周率等)を Nios II プロセッサ向けの組込 みソフトウェア・プロジェクトに展開した後、Nios II プロセッサが I2 C インタフェースを経由して、Si5338 クロック・ ジェネレータに内蔵されているレジスタに該当するパラメータを書込むことで実現します。 また、このサンプル・プログラムでは、開発キットに搭載されている 5 つの Si5338 に対して、レジスタ・マップを 定義した 5 種類のヘッダ・ファイルのうち、1 つをメニューから選択して設定できるようにしています。
この資料では、次の内容について説明しています。 (1) 開発キットおよびハードウェアの概要 ① クロック・ジェネレータ Si5338 について ② 開発キットの Si5338 クロック構成について ③ FPGA デザインの構成について (2) FPGA デザインの詳細 ① トップ階層 ② Qsys システム ③ Nios II プロセッサ ④ I2 C マスタ・コントローラ (3) サンプル・プログラムの概要 (4) 開発環境の準備 ① アルテラ Quartus® Prime 開発ソフトウェアのインストール
② Silicon Labs 社 ClockBuilder デスクトップ・ソフトウェアのインストール (5) サンプル・プログラム・プロジェクトの作成、ビルドおよび動作確認
① 開発キットのセットアップ
② Si5338 用レジスタ・マップ・ヘッダ・ファイルの作成と編集
③ Nios II SBT でのサンプル・プログラム・プロジェクトの作成、ビルドおよび実行 ④ 開発キット上での Si5338 クロック・ジェネレータ出力の確認
開発キットおよびハードウェアの概要
2.
この章では、前半で、開発キット上に搭載されている Si5338 クロック・ジェネレータの概要および、開発キット上 でのデフォルトの仕様を説明します。後半で、FPGA デザインの概要を説明します。 クロック・ジェネレータ Si5338 の概要 2-1. 【図 2-1.1】 Si5388 のブロック図 クロック・ジェネレータ Si5338 は、水晶振動子もしくは外部から入力したリファレンス・クロックを、内蔵の PLL にて 所望の周波数に逓倍・分周したクロックを 4 系統に分配し、各々出力ポートから出力します。 逓倍・分周率は出力ポート別に指定することが可能で、逓倍・分周カウンタの値を変更することで実現します。逓倍・ 分周カウンタの値はレジスタに格納されており、ユーザはこのレジスタを I2 C もしくは SM バス経由で書き換えること ができます。逓倍・分周カウンタの他にも、様々な機能モード(例:スベクトラム拡散クロック SSC の生成)をレジスタに て設定することができます。これらレジスタの初期値は、ワン・タイム(OTP)の不揮発性メモリ(NVM)に常駐されており、 電源投入後、不揮発性メモリの値をレジスタにコピーした後に、逓倍・分周率や機能モードのコンフィギュレーションが 行われます。不揮発性メモリとは異なり、レジスタは RAM で構成されている為、コンフィギュレーション終了後のレジ スタ変更は電源が投入されている限り何回でも書き換えが可能です。 リファレンス・クロックは、CMOS だけでなく SSTL や HSTL のような差動信号も入力できます。出力クロックについて も、LVPECL や LVDS、HCSL、CMOS、SSTL、HSTL での出力が可能です。Si5338 D というように、サフィックス ” D ” が付いている場合、0.16 ~ 710 MHz のクロックが出力可能で、且つ、一 部のクロック入力端子(IN3 / IN4)を制御端子 PINC / PDEC として使用できる製品仕様です。この場合、”A” や “B” のように、クロック入力端子(IN4)を制御端子 I2C_LSB として利用することができません。 製品型名の最初のハイフンの後ろに来るサフィックスでは、製品のレビジョン名および標準品かカスタム品かを示しま す。また、二番目のハイフンの後ろに来るサフィックスは温度範囲・パッケージ・梱包形態を表します。 Si5338A-B-GM というように、最初のハイフンの後ろにサフィックス ” B ” が付いている場合、レビジョン B のチップ (ダイ)がパッケージ内に実装されています。レビジョン名の直ぐ後に二番目のハイフンが付く場合、この型名は標準品 であることを意味しています。 開発キットに搭載されている Si5338A-A01449-GM の場合、最初のハイフンの後ろがサフィックス ” A ” なので、レビ ジョン A のチップ(ダイ)がパッケージングされていて、レビジョン名と二番目のハイフンの間に、”01449” のような文 字が付いている場合、この型名はカスタム品であることを意味しています。カスタム品は、製造メーカが工場出荷時に、 ユーザの所望の設定を不揮発性メモリに書き込んで出荷されます。
Si5338 のレジスタ仕様は、Silicon Labs 社の Web サイトにてドキュメントが用意されておりますが、膨大なレジスタお よびフィールド数が記載されている為、直観的に理解することは困難です。その場合、ClockBuilder という専用の GUI ツールを利用して、レジスタ設定値を求めます。
I2C_LSB 端子の使用方法 I2C 規格では 7 ビット(もしくは 10 ビット)のスレーブ・アドレスが定義されており、I2C スレーブ・デバイスは他と重複 しない固有のアドレスを持つ必要があります。 Si5338 では、固有の I2C スレーブ・アドレスがデバイス内部に組み込まれています。 I2C_LSB 端子は Si5338 の I2C スレーブ・アドレスの最下位ビットと接続されており、ピン設定で ’0’ か ’1’ を切り替 えることによって、1 つの Si5338 デバイスで最下位ビットが異なる 2 種類の I2 C スレーブ・アドレスを設定できます。 【図 2-1.3】 Si5338 の I2 C スレーブ・アドレスと I2C_LSB 端子 例えば、I2 C インタフェースに同じ仕様の 2 個の Si5338 デバイスをカスケードで接続するような場合、I2C_LSB 端子 の制御で I2 C スレーブ・アドレスの重複を避けることができます。 下図の場合、2 つの Si5338 デバイスには同じ値の I2 C スレーブ・アドレスとして 0x70 が組み込まれていますが、二 番目の Si5338 デバイスでは I2C_LSB = ‘1’ がアドレス最下位ビットに反映されて、I2
C スレーブ・アドレスは 0x71 と して認識されます。 【図 2-1.4】 I2C_LSB 端子の使用例 I2C マスタ・デバイス I2C スレーブ・デバイス Si5338 = ‘0’ Si5338 = ‘1’ SCL SDA スレーブ ・アドレス 0x70 スレーブ ・アドレス 0x71
開発キットの Si5338 クロック構成について 2-2. 2-2-1. 開発キットにおけるクロック信号の接続関係 下図では、開発キットに搭載されている 2 個の FPGA と接続するクロック信号と、クロック源との接続関係を表してい ます。5 個の Si5338 クロック・ジェネレータについては、赤枠で示しています。 U82 U91 U53 U100 U95
異なる仕様を持つ 4 種類の Si5338 カスタム品が開発キットに実装されております。 U82 と U100 は、同じカスタム品を使用しています。 両者は I2 C スレーブ・アドレスが重複しないように、前述の I2C_LSB 端子の値を互いに別々の値に設定して、アドレ スを区分けしています。 【表 2-2-1.1】 開発キットで使用している Si5338 カスタム品の仕様 項番 型名(カスタム品) ユニット 番号 I2C スレーブ ・アドレス 仕様 1 Si5338A-A01449-GM U82 U100 0x78 0x79 入力:水晶振動子 25MHz 出力: LVDS 100 MHz LVDS100 MHz 1.8V CMOS 100 MHz LVDS 100 MHz 2 Si5338A-A01392-GM U91 0x72 入力:水晶振動子 25MHz 出力: LVDS 100 MHz LVDS 644.53125 MHz LVDS 644.53125 MHz LVDS 100 MHz 3 Si5338A-A01603-GM U95 0x74 入力:水晶振動子 25MHz 出力: LVDS 100 MHz, LVDS 706.25 MHz, LVDS 206.25 MHz, LVDS 206.25 MHz 4 Si5338A-A01604-GM U53 0x76 入力:水晶振動子 25MHz 出力:
次の表は、5 個の Si5338 からの各出力クロックの接続先を示しています。
2-2-2. 開発キットにおける I2C インタフェースの接続関係 開発キットには同じ製品型名の 2 個の FPGA が実装されていますが、この資料における実証では 1 個の FPGA に 対してのみ Nios II プロセッサと I2 C マスタ・コントローラで構成されたデザインを書込みます。 下図のように、アルテラのプログラミング・ツールを使用した際、開発キットに実装されている 3 個の JTAG チェーン・ デバイスが画面上に表示されます。
最初の 2 個のデバイス(5SGXMA7N2F45/ 5SGXMA7N2)が FPGA(Stratix V デバイス)に該当します。 最後のデバイス 5M2210Z は、MAX V デバイスに該当します。 画面上側では 3 個のデバイス・リストが表示され、画面下側の図ではリストの上から順番にカスケードで接続されてい ることを示しています。 リストの一番上がハイライトされていますが、これは top.sof という FPGA 用の書込みファイルを 1 番目のデバイスに 対して書込みを行い、正常に書込めたことを表示しています。 【図 2-2-2.1】 開発キットに対する FPGA デザインの書込み結果
Nios II プロセッサ上で動作するサンプル・ソフトウェア・プログラムは、I2C マスタ・コントローラから I2C インタフェース 経由で各 Si5338 のクロック出力を設定します。 開発キット上のクロック部分のブロック図を以下に示します。黄色で網掛けされた数字は I2 C の 「スレーブ・アドレス」 を示しています。 Nios II プロセッサ上で動作する本サンプル・プログラムは、I2C マスタ・コントローラから I2C インタフェース経由で各 Si5338 のクロック出力を設定します。 尚、開発キットにはボード起動時のマネージメント用途として実装されている MAX V デバイスからも I2 C インタフェ ース経由で、各 Si5338 のクロック出力を制御できるようになっておりますが、この資料では割愛しています。 【図 2-2-2.2】 開発キットにおける Si5338 クロック部分のブロック図 SCL SDA U82 0x78 I2C_LSB = ‘0’ CLK0 CLK1 CLK2 CLK3 U91 0x72 CLK0 CLK1 CLK2 CLK3 U53 0x76 CLK0 CLK1 CLK2 CLK3 U100 0x79 I2C_LSB = ‘1’ CLK0 CLK1 CLK2 CLK3 U95 0x74 CLK0 CLK1 CLK2 CLK3 Nios II I2C マスタ SCL SDA
次に、各 Si5338 デバイスにおける回路接続を、ユニット毎に説明します。
U82 の回路接続
カスタム品として、U100 と同じ Si5338A-A01449-GM を使用しています。クロック源として、水晶振動子が接続され ています。I2C_LSB 端子が Low に設定されているので、I2
C スレーブ・アドレスは 0x78 になります。
【図 2-2-2.3】 U82 の回路接続
U91 の回路接続
カスタム品として、Si5338A-A01392-GM を使用しています。クロック源として、水晶振動子が接続されています。 I2C_LSB 端子が Low に設定されているので、I2C スレーブ・アドレスは 0x72 になります。
U53 の回路接続
カスタム品として、Si5338A-A01604-GM を使用しています。クロック源として、水晶振動子が接続されています。 I2C_LSB 端子が Low に設定されているので、I2C スレーブ・アドレスは 0x76 になります。
【図 2-2-2.5】 U53 の回路接続
U100 の回路接続
カスタム品として、U82 と同じ Si5338A-A01449-GM を使用しています。クロック源として、水晶振動子が接続されて います。I2C_LSB 端子が High に設定されているので、I2
C スレーブ・アドレスは 0x79 になります。
U95 の回路接続
カスタム品として、Si5338A-A01603-GM を使用しています。クロック源として、水晶振動子が接続されています。 I2C_LSB 端子が Low に設定されているので、I2C スレーブ・アドレスは 0x74 になります。
FPGA デザインの構成について 2-3.
2-3-1. ブロック図
Stratix V デバイスのデザイン例では、最上位階層のトップ・モジュール内に、Qsys システム統合ツールという GUI を使用して構築した Qsys システムが内蔵されています。Qsys システム内には、Nios II プロセッサが実装 されており、FPGA 内蔵メモリ(On-Chip Memory というコンポーネント名)上でソフトウェア・プログラムが実行さ れます。JTAG UART というコンポーネントを実装していますので、RS-232-C 等のシリアル・ケーブルの代わり に、アルテラの USB-Blaster™ ダウンロード・ケーブルを使用してコンソールへの入出力を行うことができます。 PLL コンポーネントを Qsys システム内に内蔵することで、ボード上の 125MHz のクロックを 50MHz に分周し、 このクロックをシステム・クロックとして Qsys システム内の他のコンポーネントを動作させています。
Qsys システムでは、I2C マスタ・コントローラとは Wrapper を介してアクセスできるような構成になっています。
【図 2-3-1】 FPGA デザイン例のブロック図 Nios II PLL On-Chip Memory JTAG UART I2C Master Qsys System Top Module
Stratix V GX FPGA
SDA SCL WrapperNios II から見たときの各 Qsys コンポーネントは、下表のようにアドレスがマッピングされています。
【表 2-3-2】 Qsys システムのアドレス・マップ
項番 アドレス範囲 コンポーネント
1 0x0000_0000 - 0x0000_001f OpenCores I2C (I2C Master) 2 0x0000_1000 - 0x0000_17ff Nios II JTAG Debug Module 3 0x0004_0000 - 0x0006_ffff On-Chip Memory 4 0x0000_0020 - 0x0000_0027 JTAG UART 2-3-3. ピン・アサイン この資料で紹介するデザイン例では、下表ようにピン・アサインされています。 【表 2-3-3】 デザイン例のピン・アサイン 項番 信号名 方向 ピン番号 I/O 規格 説明 1 clk 入力 AW35 LVDS クロック入力 (差動信号:正極) 2 i2c_scl 双方向 AR35 2.5 V I2C クロック信号 3 i2c_sda 双方向 AR36 2.5 V I2C データ信号 4 reset_n 入力 AY33 1.5 V リセット入力 5 clk(n) 入力 AY36 LVDS クロック入力 (差動信号:負極) 上記以外のピン(電源端子/ GND 端子/ 専用端子 等)については、FPGA デザイン・プロジェクト内に格納され ている拡張子 .pin ファイルで確認できます。
FPGA デザイン例の詳細
3.
この章では、前章の後半で紹介した FPGA のデザイン例の詳細部分について説明します。
トップ階層 3-1.
最上位階層のトップ・モジュール top.v では、次のように、Qsys システムを定義しています。Qsys システムで定 義された信号は、そのまま FPGA の信号に接続しています。
Qsys システム Qsys システム内の詳細を、ツールの設定画面を用いて説明します。 前述のブロック図で説明したコンポーネントが画面内にリストアップされて、システムとして互いに適切な接続が 行われております。接続している箇所は、黒丸で表示されています。その他、クロック・ドメインや割込み番号の指 定も可能で、アドレス・マップはツールが自動的に割り当てます。 【図 3-2】 Qsys システムおよび、各種コンポーネント
Nios II 3-3.
このデザイン例では、Nios II/e(エコノミー)を使用しています。
また、ブート ROM とワーク・メモリは、FPGA 内蔵メモリ(On-Chip Memory というコンポーネント名)を使用して います。
I
Wrapper を介して、I2C マスタ・コントローラが Qsys システム内に実装されています。この I2C マスタ・コントロ ーラは、後述する OpenCores の Web サイトにて無償で提供される IP コアです。信号を Qsys システムの外部 に信号を出す場合、export という信号タイプを使用します。
このデザイン例では、I2
C インタフェースを Qsys システムの外部にエクスポートさせて、それ以外の信号を Wrapper を介して、Nios II プロセッサ用の内部バス(Avalon-MM インタフェース)に接続しています。
下図では、前述のブロック図と Qsys ツールにて起動した GUI のブロック図における、信号線の相関関係を表 しています。 【図 3-4.1】 I2 C Master コンポーネントの信号線相関図 I2C Master SDA SCL Wrapper
このデザインでは、Wrapper 部分に関しては、Component Editor というサブ・ツールを利用して構築します。以 降は、Component Editor について説明します。 [ Component Type ] タブ 主に、コンポーネント名の指定や、レビジョン管理等の入力に使用します。 【図 3-4.2】 I2 C Master コンポーネントにおけるパラメータ設定画面(その 1)
[ Signals & Interface ] タブ
Nios II プロセッサ用の内部バス(Avalon-MM インタフェース)に接続している信号線や、Qsys システムの外部 にエクスポートする信号の詳細を個別に定義しています。
このデザイン例の場合、Name 列には、 clock, clock_reset, export_0, avalon_slave_0, interrupt_sender の 5 種類 の Interface がリストアップされていることが確認できます。
avalon_slave_0 ( Avalon Memory Mapped Slave )
【図 3-4.3】 I2
clock (Clock Input)
【図 3-4.4】 I2
C Master コンポーネントにおけるパラメータ設定画面(その 3)
interrupt_sender ( Interrupt Sender )
【図 3-4.6】 I2
C Master コンポーネントにおけるパラメータ設定画面(その 5)
[ Files ] タブ
I2C マスタ・コントローラの実体として Wrapper 内に取り込む HDL ファイルを指定します。
下図では、Files タブでリストアップされた Verilog HDL ファイルを Qsys システムに取り込んだ場合、前述のブ ロ ッ ク 図 と の 相 関 関 係 を 表 し て い ま す 。 こ の デ ザ イ ン 例 で は 、 opencores_i2c.v, i2c_master_bit_ctrl.v, i2c_master_byte_ctrl.v, i2c_master_defines.v, i2c_master_top.v の 5 つのファイルが、I2C Master コンポーネントの実 体として使用しています。 【図 3-4.8】 I2 C Master コンポーネントにおけるパラメータ設定画面(その 8) I2C Master SDA SCL Wrapper
このデザイン例で使用する I2 C マスタ・コントローラには、次のようなレジスタが用意されております。ビット・フィ ールド等の詳細は割愛しますが、ソフトウェアからアクセスする場合、レジスタ仕様に基づいて適切に制御する必 要があります。 【表 3-4】 I2 C マスタ・コントローラのレジスタ・マップ 項番 バイト・ アドレス レジスタ名 説明 1 0x00 pre[7:0] クロック・プリスケーラ(下位) 2 0x01 pre[15:8] クロック・プリスケーラ(上位) 3 0x02 ctr[7:0] コントロール・レジスタ 4 0x03 rxr[7:0] / txr[7:0] 受信レジスタ/ 送信レジスタ( ACK イネーブル時 ) 5 0x04 sr[7:0] ステータス・レジスタ 6 0x05 txr[7:0] 送信レジスタ ( ACK ディスエーブル時 ) 7 0x06 cr[7:0] コマンド・レジスタ 8 0x07 reserved[7:0] 予約済(オール・ゼロ) 尚、このデザイン例では、ユーザがレジスタ仕様を個別に把握しなくても、ソフトウェアが記述できるように、これ らのレジスタ仕様を隠蔽した専用の API が関数として用意されています。 例として、I2C_start( ) という API を用いて説明します。 実際のソフトウェア・プログラムでは、次のように、引数を与えて使用しています。 【図 3-4.9】 I2C_start( ) API の使用例 第一引数 I2C_BASE は、Qsys システムにおける I2 C マスタ・コントローラのベース・アドレスが与えられてい ます。第二引数 slave_adrs は、I2 C スレーブ・アドレスが与えられています。第三引数が 1 の場合リード・モード、0 の場合ライト・モードになることを意味します。
【図 3-4.10】 I2 C 規格で定義されるデータ転送の例 I2C_start( ) の実体として、ソースコードでは次のように記述されています。 【図 3-4.11】 I2C_start( ) の実体の一部抜粋 この場合、送信レジスタ → コマンド・レジスタ → ステータス・レジスタの順でアクセスしていることが把握でき ます。このように、ある動作に特化したレジスタ・アクセス・シーケンスを API 内に収めることで、ソフトウェア・エン ジニアは、細かいレジスタ・シーケンスや I2 C 規格で指定された内容を意識しなくても、デバイスを制御することが できるようになります。 この資料の実証は、これらの API を使用したソフトウェア・プログラムを利用して行っています。
/* transmit the address shifted by one and the read/write bit*/
IOWR_I2C_OPENCORES_TXR(base, ((add<<1) + (0x1 & read))); /* set start and write bits which will start the transaction*/
IOWR_I2C_OPENCORES_CR(base, I2C_OPENCORES_CR_STA_MSK | I2C_OPENCORES_CR_WR_MSK ); /* wait for the trnasaction to be over.*/
while( IORD_I2C_OPENCORES_SR(base) & I2C_OPENCORES_SR_TIP_MSK);
送信レジスタにライト コマンド・レジスタにライト
【参考 1】 I2C マスタ・コントローラは、OpenCores の Web サイトで無償公開されている IP コアを使用しています。 http://opencores.org/project,i2c デザインおよびドキュメントを入手する際は、OpenCores への登録が必要となります。 このデザインは、 WISHBONE インタフェース経由でレジスタ・アクセスを行います。 【参考 2】 OpenCores で無償公開されている I2C マスタ・コントローラの IP コアを Qsys システムに内蔵したデザイン例 は、Altera Wiki で無償公開されています。 http://www.alterawiki.com/wiki/I2C_(OpenCores)
このデザインは、WISHBONE インタフェースと Avalon-MM インタフェース(Altera Nios II 用の内部バス)を中 継するブリッジ回路が実装されているので、レジスタ・アクセスは Avalon-MM インタフェース経由で行われます。 また、前述の API も、このデザイン内に含まれています。
【参考 3】
Qsys では、デフォルトで oc_i2c_master というコンポーネントが用意されていますが、その中身は、上記 OpenCores にあるものを使用しています。
サンプル・プログラムの概要
4.
この章では、本サンプル・プログラムの概要として、ファイル構成と機能概要について説明します。 (1) 本サンプル・プログラムのファイル構成は次の表の通りです。 【表 4.1】 サンプル・プログラムのファイル構成 項番 ファイル名 内容 1 main.c メイン・プログラムの C ソース・コード・ファイルです。 ① 「 Si5338 クロック設定メニュー」 を表示し、ユーザがコマンド入力により指定 した “デバイス”(ユニット番号) を選択します。 ② 「レジスタ・マップ・テーブル選択メニュー」 を表示し、ユーザがコマンド入力に より指定した “レジスタ・マップ・テーブル”(設定データ) を選択します。 ③ Init_Si5338() 関数により、ユーザが選択した “デバイス” に対して “レジス タ・マップ・テーブル” のデータを使用して、I2 C インタフェース経由で Si5338 を設定します。 2 I2C_opencores.c I2C インタフェースにアクセスするための関数を含む C ソース・コード・ファイルで す。 I2C_init()、 I2C_start()、 I2C_read()、 I2C_write() 関数があります。3 I2C_opencores.h I2C_opencores.c に付随する、ヘッダ・ファイルです。
4 I2C_opencores_regs.h I2C インタフェースのレジスタ定義とアクセス・マクロを含むヘッダ・ファイルです。 5 reg_map.h Reg_Data 構造体の定義を含むヘッダ・ファイルです。
6 register_map_u53_t1.h デバイス U53 用 レジスタ・マップ・テーブル #1 ヘッダ・ファイルです。
「4.2 Si5338 用レジスタ・マップ・ヘッダファイルの作成と編集」の手順に従って、 Silicon Labs ClockBuilder デスクトップ・ソフトウェア を使用してユーザが任意のクロ ック設定を作成できます (以下の項番 7~30 についても同様)。 7 register_map_u53_t2.h デバイス U53 用 レジスタ・マップ・テーブル #2 ヘッダ・ファイルです。 8 register_map_u53_t3.h デバイス U53 用 レジスタ・マップ・テーブル #3 ヘッダ・ファイルです。 9 register_map_u53_t4.h デバイス U53 用 レジスタ・マップ・テーブル #4 ヘッダ・ファイルです。 10 register_map_u53_t5.h デバイス U53 用 レジスタ・マップ・テーブル #5 ヘッダ・ファイルです。 11 register_map_u82_t1.h デバイス U82 用 レジスタ・マップ・テーブル #1 ヘッダ・ファイルです。 12 register_map_u82_t2.h デバイス U82 用 レジスタ・マップ・テーブル #2 ヘッダ・ファイルです。 13 register_map_u82_t3.h デバイス U82 用 レジスタ・マップ・テーブル #3 ヘッダ・ファイルです。 14 register_map_u82_t4.h デバイス U82 用 レジスタ・マップ・テーブル #4 ヘッダ・ファイルです。 15 register_map_u82_t5.h デバイス U82 用 レジスタ・マップ・テーブル #5 ヘッダ・ファイルです。 16 register_map_u91_t1.h デバイス U91 用 レジスタ・マップ・テーブル #1 ヘッダ・ファイルです。 17 register_map_u91_t2.h デバイス U91 用 レジスタ・マップ・テーブル #2 ヘッダ・ファイルです。 18 register_map_u91_t3.h デバイス U91 用 レジスタ・マップ・テーブル #3 ヘッダ・ファイルです。 19 register_map_u91_t4.h デバイス U91 用 レジスタ・マップ・テーブル #4 ヘッダ・ファイルです。 20 register_map_u91_t5.h デバイス U91 用 レジスタ・マップ・テーブル #5 ヘッダ・ファイルです。 21 register_map_u95_t1.h デバイス U95 用 レジスタ・マップ・テーブル #1 ヘッダ・ファイルです。
29 register_map_u100_t4.h デバイス U100 用 レジスタ・マップ・テーブル #4 ヘッダ・ファイルです。 30 register_map_u100_t5.h デバイス U100 用 レジスタ・マップ・テーブル #5 ヘッダ・ファイルです。
(2) Silicon Labs のフローチャートと、本サンプル・プログラムの Init_Si5338() 関数の対比を下図に示します。 この処理により、I2
C インタフェース経由で Si5338 を設定しています。 int Init_Si5338( unsigned int device_number )
{
unsigned int ret_code = 0x0;
unsigned int counter;
unsigned char curr_chip_val, clear_curr_val, clear_new_val, combined, reg, tmp; Reg_Data curr;
unsigned int slave_adrs = Clock_Info[device_number].slave_address;
//--- // See Si5338 datasheet Figure 9 for more details on this procedure
// delay added to wait for Si5338 to be ready to communicate after turning on counter = 0;
while ( counter < SI5338_DELAY ) {
counter++; }
I2C_start( I2C_BASE, slave_adrs, 0 ); // chip address in write mode I2C_write( I2C_BASE, 230, 0 ); // write to register 230 I2C_write( I2C_BASE, 0x10, 1 ); // OEB_ALL = 1
I2C_start( I2C_BASE, slave_adrs, 0 ); // chip address in write mode I2C_write( I2C_BASE, 241, 0 ); // write to register 241 I2C_write( I2C_BASE, 0x5E, 1 ); // DIS_LOL = 1
// for all the register values in the Reg_Store array get each value and mask and apply it to the Si5338 for ( counter=0; counter<NUM_REGS_MAX; counter++ )
{ curr = Device_Info.set_info[device_number].regmap_table_ptr[counter]; if ( curr.Reg_Mask != 0x00 ) { if ( curr.Reg_Mask == 0xFF ) {
// do a write transaction only since the mask is all ones
I2C_start( I2C_BASE, slave_adrs, 0 ); // chip address in write mode I2C_write( I2C_BASE, curr.Reg_Addr, 0 ); // write register address I2C_write( I2C_BASE, curr.Reg_Val, 1 ); // write register value }
else {
// do a read-modify-write
I2C_start( I2C_BASE, slave_adrs, 0 ); // chip address in write mode I2C_write( I2C_BASE, curr.Reg_Addr, 0 ); // write register address
I2C_start( I2C_BASE, slave_adrs, 1 ); // send start again but this time in read mode curr_chip_val = I2C_read( I2C_BASE, 1 ); // read the input register and send stop
clear_curr_val = curr_chip_val & ~curr.Reg_Mask; clear_new_val = curr.Reg_Val & curr.Reg_Mask; combined = clear_new_val | clear_curr_val;
I2C_start( I2C_BASE, slave_adrs, 0 ); // chip address in write mode I2C_write( I2C_BASE, curr.Reg_Addr, 0 ); // write register address I2C_write( I2C_BASE, combined, 1 ); // write register value }
} }
// check LOS alarm for the xtal input on IN1 and IN2 (and IN3 if necessary) - change this mask if using inputs on IN4, IN5, IN6 I2C_start( I2C_BASE, slave_adrs, 0 ); // chip address in write mode
I2C_write( I2C_BASE, 218, 0 ); // write 218 register address I2C_start( I2C_BASE, slave_adrs, 1 ); // send start again but this time in read mode reg = I2C_read( I2C_BASE, 1 ); // read the register and send stop reg &= LOS_MASK;
while ( reg != 0 ) {
I2C_start( I2C_BASE, slave_adrs, 0 ); // chip address in write mode
I2C_write( I2C_BASE, 218, 0 ); // write 218 register address I2C_start( I2C_BASE, slave_adrs, 1 ); // send start again but this time in read mode reg = I2C_read( I2C_BASE, 1 ); // read the register and send stop reg &= LOS_MASK;
}
I2C_start( I2C_BASE, slave_adrs, 0 ); // chip address in write mode I2C_write( I2C_BASE, 49, 0 ); // write to register 49 I2C_start( I2C_BASE, slave_adrs, 1 ); // send start again but this time in read mode tmp = I2C_read( I2C_BASE, 1 ); // read the register and send stop tmp &= 0x7F;
I2C_start( I2C_BASE, slave_adrs, 0 ); // chip address in write mode I2C_write( I2C_BASE, 49, 0 ); // write to register 49 I2C_write( I2C_BASE, tmp, 1 ); // FCAL_OVRD_EN = 0
I2C_start( I2C_BASE, slave_adrs, 0 ); // chip address in write mode I2C_write( I2C_BASE, 246, 0 ); // write to register 246 I2C_write( I2C_BASE, 2, 1 ); // soft reset
I2C_start( I2C_BASE, slave_adrs, 0 ); // chip address in write mode I2C_write( I2C_BASE, 241, 0 ); // write to register 241 I2C_write( I2C_BASE, 0x65, 1 ); // DIS_LOL = 0
// wait for Si5338 to be ready after calibration (ie, soft reset) counter = 0;
【図 4.1 ②】 フローチャートとサンプル・プログラム
~ 前のページから続く ~
// make sure the device locked by checking PLL_LOL and SYS_CAL I2C_start( I2C_BASE, slave_adrs, 0 ); // chip address in write mode
I2C_write( I2C_BASE, 218, 0 ); // write 218 register address I2C_start( I2C_BASE, slave_adrs, 1 ); // send start again but this time in read mode reg = I2C_read( I2C_BASE, 1 ); // checking PLL_LOL and SYS_CAL reg &= LOCK_MASK;
while ( reg != 0 ) {
I2C_start( I2C_BASE, slave_adrs, 0 ); // chip address in write mode
I2C_write( I2C_BASE, 218, 0 ); // write 218 register address I2C_start( I2C_BASE, slave_adrs, 1 ); // send start again but this time in read mode reg = I2C_read( I2C_BASE, 1 ); // checking PLL_LOL and SYS_CAL reg &= LOCK_MASK;
}
// copy FCAL values
I2C_start( I2C_BASE, slave_adrs, 0 ); // chip address in write mode I2C_write( I2C_BASE, 235, 0 ); // write to register 235 I2C_start( I2C_BASE, slave_adrs, 1 ); // send start again but this time in read mode tmp = I2C_read( I2C_BASE, 1 ); // read the register and send stop I2C_start( I2C_BASE, slave_adrs, 0 ); // chip address in write mode
I2C_write( I2C_BASE, 45, 0 ); // write to register 45 I2C_write( I2C_BASE, tmp, 1 ); // FCAL_OVRD_EN = 0 I2C_start( I2C_BASE, slave_adrs, 0 ); // chip address in write mode
I2C_write( I2C_BASE, 236, 0 ); // write to register 236 I2C_start( I2C_BASE, slave_adrs, 1 ); // send start again but this time in read mode tmp = I2C_read( I2C_BASE, 1 ); // read the register and send stop I2C_start( I2C_BASE, slave_adrs, 0 ); // chip address in write mode
I2C_write( I2C_BASE, 46, 0 ); // write to register 46 I2C_write( I2C_BASE, tmp, 1 ); // FCAL_OVRD_EN = 0
// clear bits 0 and 1 from 47 and combine with bits 0 and 1 from 237 I2C_start( I2C_BASE, slave_adrs, 0 ); // chip address in write mode I2C_write( I2C_BASE, 237, 0 ); // write to register 237 I2C_start( I2C_BASE, slave_adrs, 1 ); // send start again but this time in read mode tmp = I2C_read( I2C_BASE, 1 ); // read the register and send stop I2C_start( I2C_BASE, slave_adrs, 0 ); // chip address in write mode
I2C_write( I2C_BASE, 47, 0 ); // write to register 47 I2C_start( I2C_BASE, slave_adrs, 1 ); // send start again but this time in read mode reg = I2C_read( I2C_BASE, 1 ); // read the register and send stop reg = (reg & 0xFC) | (tmp & 3);
I2C_start( I2C_BASE, slave_adrs, 0 ); // chip address in write mode I2C_write( I2C_BASE, 47, 0 ); // write to register 241 I2C_write( I2C_BASE, reg, 1 ); // write data
I2C_start( I2C_BASE, slave_adrs, 0 ); // chip address in write mode I2C_write( I2C_BASE, 49, 0 ); // write to register 49 I2C_start( I2C_BASE, slave_adrs, 1 ); // send start again but this time in read mode tmp = I2C_read( I2C_BASE, 1 ); // read the register and send stop tmp |= 0x80;
I2C_start( I2C_BASE, slave_adrs, 0 ); // chip address in write mode I2C_write( I2C_BASE, 49, 0 ); // write to register 49 I2C_write( I2C_BASE, tmp, 1 ); // FCAL_OVRD_EN = 1
I2C_start( I2C_BASE, slave_adrs, 0 ); // chip address in write mode I2C_write( I2C_BASE, 230, 0 ); // write to register 230 I2C_write( I2C_BASE, 0x00, 1 ); // OEB_ALL = 0
//---
return ret_code; }
開発環境の準備
5.
この章では、ホスト PC にアルテラ Quartus Prime 開発ソフトウェアをインストールして、開発環境の準備を行う 手順について説明します。
Quartus Prime 開発ソフトウェアには、 Nios II エンベデッド・デザイン・スイート(以下、Nios II EDS と呼びます) が含まれます。この資料で紹介している FPGA のデザイン例では、有償ライセンスが必要になります。
この動作実証で使用した主なホスト PC 環境は次表の通りです。
【表 5.1】 ホスト PC 環境
項番 項目 内容
1 ホスト PC Intel Core i7 2.13GHz, RAM 8GB
2 OS Microsoft Windows 7 Professional Service Pack 1 日本語版 (64bit) 3 アルテラ Quartus Prime 開発ソフ
トウェア
Quartus Prime スタンダード・エディション 15.1(Nios II EDS 15.1 含む)
※ Stratix V デバイスの FPGA 開発を行う場合は、Quartus Prime 開発ソフトウェアの有償 版(スタンダード・エディション)が必要です。
https://www.altera.co.jp
4 Silicon Labs ClockBuilder デスクト ップ・ソフトウェア
Si5338 用、バージョン 6.4
ClockBuilder デスクトップ・ソフトウェアは、下記 Silicon Labs 社の Web サイトからダウンロ ードできます。
アルテラ Quartus Prime 開発ソフトウェアのインストール
アルテラの Web サイト から Quartus Prime 開発ソフトウェアとデバイス・ライブラリをダウンロードして、インス トールしてください。(ダウンロードするには、myAltera へのログインが必要です。myAltera アカウントが未登録で あれば、新規にアカウントを作成してからログインしてください。) この資料では Quartus Prime 開発ソフトウェアのバージョン 15.1 を使用して説明していますので、同じ環境で 試したい場合はバージョン 15.1 をインストールしてください。 【図 5-1.1】 myAltera の Web サイト なお、この資料では Quartus Prime 開発ソフトウェアのスタンダード・エディションを使用する必要があるので、ラ インセンスが必要です。別途、ライセンスを用意してください。
Silicon Labs ClockBuilder デスクトップ・ソフトウェアのインストール 5-2.
(1) Silicon Labs 社の ClockBuilder デスクトップ・ソフトウェアの Web サイトに行きます。 http://www.silabs.com/products/clocksoscillators/pages/timing-software-development-tools.aspx
【図 5-2.1】 Silicon Labs 社 ClockBuilder デスクトップ・ソフトウェアの Web サイト
(2) ソフトウェア・ダウンロードの欄から、“Si5338/35/34/56 ClockBuilder Desktop Software” をクリックします。
【図 5-2.2】 ソフトウェア・ダウンロード
(3) ClockBuilder Desktop Software のインストール用 ClockBuilderDesktopSwInstall.zip ファイルをダウンロード して保存します。
【図 5-2.3】 ClockBuilderDesktopSwInstall.zip ファイルをダウンロードして保存
(4) ClockBuilderDesktopSwInstall.zip ファイルを解凍します。解凍された ClockBuilderDesktopSwInstall.exe フ ァイルをダブルクリックして実行します。
【図 5-2.5】 ClockBuilder デスクトップのインストーラ画面
(6) “I agree with the above terms and conditions” にチェックを入れて、[Next] をクリックします。
【図 5-2.6】 ClockBuilder デスクトップのライセンス同意画面
(8) [Start] をクリックするとインストールが開始します。
【図 5-2.8】 インストール開始画面
(9) インストールが完了したら、[Exit] をクリックします。
サンプル・プログラム・プロジェクトの作成、ビルドおよび動作確認
6.
この章では、サンプル・プログラム・プロジェクトを作成・ビルドして、実際の開発キット上での Si5338 クロック・ ジェネレータ出力確認までの手順について説明します。 開発キットのセットアップ 6-1. 6-1-1. 開発キットのボード設定(1) ボード設定は、Stratix V Advanced System Kit ユーザ・ガイド に記載されている下記のディフォルトの設定 にしてください。
※部品面は、SW1 、SW3 の 2 か所
6-1-2. 開発キットへのデザイン(.sof ファイル)書き込み
アルテラ Quartus Prime 開発ソフトウェアを起動して、開発キットにデザイン(top.sof ファイル)を書き込みます。 (1) PC のデスクトップにある Quartus Prime 15.1 アイコンをダブルクリックします。
【図 6-1-2.1】 Quartus Prime 15.1 アイコン
(2) Quartus Prime の GUI が開きます。Tools メニュー ⇒ Programmer を選択します。
【図 6-1-2.3】 Hardware Setup ボタンをクリック
(4) USB-BlasterII を選択した後、Close をクリックします。
【図 6-1-2.4】 USB-BlasterII を選択
(6) Programmer からどのデバイスがボード上にあるかを尋ねられたら、5SGXEA7N2F コンポーネントを選択 して、OK をクリックします。
(7) 5SGXEA7N2F デバイスを選択して Change File ボタンをクリックします。 (8) 開発キット用デザインの top.sof ファイル を参照して Open をクリックします。
(9) FPGA の “Program/Configure” オプションを有効にし、Start ボタンをクリックするとプログラミング・ファイル が FPGA にダウンロードされます。 (10) 完了すると、プログレス・バーに “100% (successful)” と表示されます。 【図 6-1-2.10】 コンフィギュレーションの完了 (11) Programmer ウィンドウを閉じます。チェインの保存確認プロンプトが表示されますが、[No] をクリックして 保存せずに終了します。 【図 6-1-2.11】 Programmer の終了 Si5338 用レジスタ・マップ・ヘッダファイルの作成と編集 6-2. 6-2-1. レジスタ・マップ・ヘッダファイル register_map.h の作成
(1) Silicon Labs ClockBuilder デスクトップ・ソフトウェア を起動します。Windows のスタート・メニューから す べてのプログラム」 ⇒ Silicon Labs ⇒ Si5338-35-34-56 ClockBuilder Desktop 6.4 ⇒ ClockBuilder Desktop - Si5338-35-34-56 をクリックします。
をクリックします。
【図 6-2-1.2】 デバイス選択画面 “Si5338”
(3) ClockBuilder の Frequency Plan タブにおいて、CLK0 ~ CLK3 に対して、チェック Box にチェックを入 れることでクロックの有効化を行います。また、それぞれのクロックに対して出力周波数を設定します。(こ の例では、CLK0 = 25MHz、CLK1 = 50MHz、CLK2 = 75MHz、CLK3 = 100MHz に設定しています。)設定 したら Create Plan をクリックします。
(4) ClockBuilder の Output Drivers タブでは、CLK0 ~ CLK3 に対して、出力タイプの設定を行います。(こ の例では、CLK0 ~ CLK3 に対して、2.5V LVDS を設定しています。)設定したら Apply Values to Register Map をクリックします。
【図 6-2-1.4】 Output Drivers タブでの設定
(5) ClockBuilder の Power タブでは、“Core VDD” と “I2C Bus Voltage” を設定します。(この例では、Core VDD = 2.5V、I2C Bus Voltage = Use 2.5V or 3.3V を設定しています。)設定したら Apply to Device をクリッ クします。
存先を指定することにより、Si5338 用レジスタ・マップ・ヘッダファイル register_map.h が生成されます。生 成されない場合、再度 Apply to Device をクリックして見てください。
6-2-2. レジスタ・マップ・ヘッダファイルの編集 このサンプル・プログラムはデフォルトでは、開発キットに搭載されている 5 つの Si5338 に対して、それぞれ 5 種類のレジスタ・マップ・ヘッダファイルを持ち、その内 1 つをメニューから選択して設定できるようにしています。 要するに、5 つの Si5338 に対して、それぞれ 5 パターンの出力周波数プリセットを持つことができます。 (1) サンプル・プログラムでは、ユーザが作成した register_map.h をインクルードして使用しますが、前述のと おり開発キットに搭載されている 5 つ(U91、U95、U53、U82、U100)の Si5338 に対して、それぞれ 5 種類 のレジスタ・マップ・ヘッダファイルを持たせる作りとなっていますので、main.c ファイルの中では次のように ファイル名を変更して使用しています。 従って、ユーザにて作成した register_map.h ファイルをサンプル・プログラム・プロジェクトにインクルードし て使用する場合は、以下のファイル名のようにリネームしてください。 【図 6-2-2.1】 レジスタ・マップ・ヘッダファイルのリネーム (2) サンプル・プログラムに含まれている "reg_map.h" ファイルは、register_map.h ファイル内の共通定義であ る以下の 最大レジスタ数(NUM_REGS_MAX)と Reg_Data 構造体を抜粋したものを記述しています。 #include "reg_map.h"
#include "register_map_u91_t1.h" // U91 レジスタ・マップ・テーブル #1 #include "register_map_u91_t2.h" // U91 レジスタ・マップ・テーブル #2 #include "register_map_u91_t3.h" // U91 レジスタ・マップ・テーブル #3 #include "register_map_u91_t4.h" // U91 レジスタ・マップ・テーブル #4 #include "register_map_u91_t5.h" // U91 レジスタ・マップ・テーブル #5 #include "register_map_u95_t1.h" // U95 レジスタ・マップ・テーブル #1 #include "register_map_u95_t2.h" // U95 レジスタ・マップ・テーブル #2 #include "register_map_u95_t3.h" // U95 レジスタ・マップ・テーブル #3 #include "register_map_u95_t4.h" // U95 レジスタ・マップ・テーブル #4 #include "register_map_u95_t5.h" // U95 レジスタ・マップ・テーブル #5 #include "register_map_u53_t1.h" // U53 レジスタ・マップ・テーブル #1 #include "register_map_u53_t2.h" // U53 レジスタ・マップ・テーブル #2 #include "register_map_u53_t3.h" // U53 レジスタ・マップ・テーブル #3 #include "register_map_u53_t4.h" // U53 レジスタ・マップ・テーブル #4 #include "register_map_u53_t5.h" // U53 レジスタ・マップ・テーブル #5 #include "register_map_u82_t1.h" // U82 レジスタ・マップ・テーブル #1 #include "register_map_u82_t2.h" // U82 レジスタ・マップ・テーブル #2 #include "register_map_u82_t3.h" // U82 レジスタ・マップ・テーブル #3 #include "register_map_u82_t4.h" // U82 レジスタ・マップ・テーブル #4 #include "register_map_u82_t5.h" // U82 レジスタ・マップ・テーブル #5 #include "register_map_u100_t1.h" // U100 レジスタ・マップ・テーブル #1 #include "register_map_u100_t2.h" // U100 レジスタ・マップ・テーブル #2 #include "register_map_u100_t3.h" // U100 レジスタ・マップ・テーブル #3 #include "register_map_u100_t4.h" // U100 レジスタ・マップ・テーブル #4 #include "register_map_u100_t5.h" // U100 レジスタ・マップ・テーブル #5
#define NUM_REGS_MAX 350 typedef struct Reg_Data{ unsigned char Reg_Addr;
します。 ① 上記 (2) の通り、 NUM_REGS_MAX と Reg_Data 構造体の定義は、全てのレジスタ・マップ・ヘッ ダファイルで使用する共通定義となるので、個々のレジスタ・マップ・ヘッダファイルからは削除してくだ さい。 ② 作成した register_map.h ファイルでは、通常以下の 【変更前】 のような記述になっています。 これを、リネームしたファイル名にあわせて、次のように変更します。(Nios II SBT の GCC コンパイ ラでコンパイルできるように、“const” を行の先頭に記述し、“code” の記述は削除してください。) 【変更前】
Reg_Data const code Reg_Store[NUM_REGS_MAX] = {
【変更後】 (例: "register_map_u91_t1.h" )
const Reg_Data Reg_Store_U91_T1[NUM_REGS_MAX] = {
③ 変更が終わったらファイルをセーブしてください。
Nios II SBT でのサンプル・プログラム・プロジェクトの作成、ビルドおよび実行 6-3.
6-3-1. サンプル・プログラム・プロジェクトの作成
(1) Nios II SBT を起動します。Windows のスタート・メニューから すべてのプログラム ⇒ Altera 15.1.0.185 ⇒ Nios II EDS 15.1.0.185 ⇒ Nios II 15.1 Software Build Tools for Eclipse をクリックします。
【図 6-3-1.1】 Nios II SBT の起動
(2) ワークスペース・ランチャー ウィンドウが表示されたら、提案されたプロジェクト・フォルダか独自のプロジェ クト ・フォルダ を指定して、プ ロジェク トを構築するワークスペー スを選択します 。(この例では、 D:¥Work¥Nios_SBT_Workspace と指定。)OK ボタンをクリックしてワークスペースを確定します。
【図 6-3-1.2】 ワークスペースの選択 (3) Welcome の画面が出た場合は、Go to the workbench リンクをクリックします。
【図 6-3-1.4】 Nios II SBT の Eclipse
(5) Eclipse プラットフォームの File メニュー ⇒ New ⇒ Nios II Application and BSP from Template を選択し ます。
【図 6-3-1.5】 Nios II Application and BSP from Template の選択
(6) Nios II Application and BSP from Template のウィンドウが開いたら、“SOPC Information File name:” の欄に 開発キット用デザイン(Qsys システム)の .sopcinfo ファイルを参照して 開く をクリックします。
(7) “Project name:” の欄には、任意のプロジェクト名を入力します。(この例では、Clock_Tool )
(8) プロジェクト・テンプレートとして、“Templates” の欄から Blank Project を選択して、Finish をクリックしま す。
(9) 左側にある Project Explorer に “Clock_Tool” と “Clock_Tool_bsp” が追加されているはずです。
【図 6-3-1.8】 追加されたプロジェクト
(10) サンプル・プログラムに含まれる以下のファイルを Project Explorer の “Clock_Tool” にドラッグ & ドロッ プして、ファイルをプロジェクトにコピーします。 【表 6-3-1.1】 プロジェクトにコピーするファイル 項番 ファイル名 1 I2C_opencores.c 2 I2C_opencores.h 3 I2C_opencores_regs.h 4 main.c 5 reg_map.h (11) 前述 「6-2-2. レジスタ・マップ・ヘッダファイルの編集」 でユーザが作成した、以下のレジスタ・マップ・ヘッ ダファイルを Project Explorer の “Clock_Tool” にドラッグ&ドロップして、ファイルをプロジェクトにコピーし ます。
【表 6-3-1.2】 プロジェクトにコピーするファイル ファイル名
register_map_u53_t1.h register_map_u82_t1.h register_map_u91_t1.h register_map_u95_t1.h register_map_u100_t1.h register_map_u53_t2.h register_map_u82_t2.h register_map_u91_t2.h register_map_u95_t2.h register_map_u100_t2.h register_map_u53_t3.h register_map_u82_t3.h register_map_u91_t3.h register_map_u95_t3.h register_map_u100_t3.h register_map_u53_t4.h register_map_u82_t4.h register_map_u91_t4.h register_map_u95_t4.h register_map_u100_t4.h register_map_u53_t5.h register_map_u82_t5.h register_map_u91_t5.h register_map_u95_t5.h register_map_u100_t5.h
(1) “Clock_Tool” を右クリックして、Build Project を実行します。
【図 6-3-2.1】 「Build Project」 の実行
(2) プロジェクトのビルドが完了すると、“Clock_Tool” プロジェクトの下に、Clock_Tool.elf が生成されます。
6-3-3. サンプル・プログラム・プロジェクトの実行
(1) “Clock_Tool” を右クリックして、Run As ⇒ Nios II Hardware を実行します。
【図 6-3-3.1】 プロジェクトの実行
(2) 開発キット上でプログラムが実行されて、Nios II SBT の Console に以下のようなクロック設定メニュー表 示が出ます。
【図 6-3-3.2】 プログラムの実行
--- Stratix V ADS Kit Si5338 クロック設定メニュー
--- 1: U91 i2c-0x72 : Si5338 クロック設定
2: U95 i2c-0x74 : Si5338 クロック設定 3: U53 i2c-0x76 : Si5338 クロック設定 4: U82 i2c-0x78 : Si5338 クロック設定 5: U100 i2c-0x79 : Si5338 クロック設定 q: Exit
--- (1-5)から選択してください: [続けて <Enter> キーを入力]
開発キット上での Si5338 クロック・ジェネレータ出力の確認
(1) 「Stratix V ADS Kit Si5338 クロック設定メニュー」 の表示が出たら、開発キットに搭載されている 5 つの Si5338 の内、どのデバイスに対してクロック設定を行うかを選択します。
選択は、'1' ~ '5' のコマンド番号を入力して行います。 'q' コマンドを入力すると本プログラムを終了しま す。コマンドの後には続けて Enter キーを入力してください。
ここでは、例として下図のようにコマンド番号 '1' を入力して、“U91 I2C-0x72” の Si5338 に対するクロック 設定を選択しています。
【図 6-4.1】 「Stratix V ADS Kit Si5338 クロック設定メニュー」 の表示 (2) 次に、「U91 I2C-0x72 Si5338 レジスタ・マップ・テーブル選択メニュー」 が表示されます。
このメニューでは、前述「3-2-2. レジスタ・マップ・ヘッダファイルの編集」 でユーザが作成した、“U91 I2C-0x72”用 Si5338 の 5 つのレジスタ・マップ・ヘッダファイルの内、どのファイルを使用してクロック設定 を行うかを選択します。 こ こ では 、例と して下図の よ うに コ マン ド番号 '3' を入力して、レジ スタ・マップ・テーブル #3” (register_map_u91_t3.h)を使用してクロック設定を行うように選択しています。 設定が完了し成功した場合は、「*** Si5338 クロック設定 成功 ***」 と表示されます。 「Enter キーを押して続行します...」と表示されたら、Enter キーを入力してください。 --- Stratix V ADS Kit Si5338 クロック設定メニュー
--- 1: U91 i2c-0x72 : Si5338 クロック設定
2: U95 i2c-0x74 : Si5338 クロック設定 3: U53 i2c-0x76 : Si5338 クロック設定 4: U82 i2c-0x78 : Si5338 クロック設定 5: U100 i2c-0x79 : Si5338 クロック設定 q: Exit
--- (1-5)から選択してください: [続けて <Enter> キーを入力]1 ⏎
--- U91 i2c-0x72 Si5338 レジスタ・マップ・テーブル選択メニュー --- 1: Si5338 レジスタ・マップ・テーブル #1 選択 2: Si5338 レジスタ・マップ・テーブル #2 選択 3: Si5338 レジスタ・マップ・テーブル #3 選択 4: Si5338 レジスタ・マップ・テーブル #4 選択 5: Si5338 レジスタ・マップ・テーブル #5 選択 --- (1-5)から選択してください: [続けて <Enter> キーを入力]3 ⏎ レジスタ・マップ・ファイル <register_map_u91_t3.h> を使用するように選択しました。
(3) Enter キーが入力されると、下図のように再度 「Stratix V ADS Kit Si5338 クロック設定メニュー」 の表示に 戻ります。 続けて他のデバイスのクロック設定を行うか、本プログラムを終了します。 ここでは、例として下図のようにコマンド番号 'q' を入力して、本プログラムを終了しています。 【図 6-4.3】 プログラムの終了 (4) 開発キットにオシロ・スコープを接続して、クロック設定により、各 Si5338 デバイスから期待する出力周波 数が出ているかを確認してください。 --- Stratix V ADS Kit Si5338 クロック設定メニュー
--- 1: U91 i2c-0x72 : Si5338 クロック設定
2: U95 i2c-0x74 : Si5338 クロック設定 3: U53 i2c-0x76 : Si5338 クロック設定 4: U82 i2c-0x78 : Si5338 クロック設定 5: U100 i2c-0x79 : Si5338 クロック設定 q: Exit
--- (1-5)から選択してください: [続けて <Enter> キーを入力]q ⏎
免責およびご利用上の注意
改版履歴
Revision 年月 概要