はじめに
本記事は、「はじめてのトランシーバーAgilex™ 5 / Agilex™ 3 編」の基礎編 3 となり、基礎編1、2 で作成したデザイン、テストベンチから実機確認用のデザインを作成し、動作確認をおこなう内容です。
ポイント:基礎編 2 をスキップして本記事から作業する場合は、本記事の末尾に添付されているファイルをご使用ください。 使用ファイル、開始する章は以下をご参照ください。
# |
作業内容 |
使用ファイル |
作業開始となる章 |
1 |
本記事の各種設定をおこなう場合 | xcvr_sample_top_basic_3_start_v251.7z | 1-2. 変更内容の概要 |
2 |
本記事の設定済のファイルを使用し、実機確認のみおこなう場合 | xcvr_sample_top_basic_3_end_v251.7z | 1-9. フルコンパイルの実行 |
作成するデザインのブロック図は以下になります。
1. 実機確認用デザインの準備
1-1. 実機確認用デザイン作成
基礎編 2 で作成したテストベンチを流用して実機確認用のデザインを作成します。
テストベンチは以下のファイルになります。
ファイルパス:(プロジェクトフォルダー)\xcvr_sample_tb\xcvr_sample_tb\sim
ファイル名:xcvr_sample_tb.v
このファイルを編集して実機確認用デザインとします。以下の手順を実行してください。
(1) xcvr_sample_tb.v をプロジェクトフォルダーにコピー
(2) ファイル名を xcvr_sample_top.v に変更
1-2. 変更内容の概要
プロジェクトフォルダーにコピーした、xcvr_sample_top.v を実機確認用に変更します。変更する箇所は、おもに以下の 3 点です。
(1) ファイル名変更に合わせて、モジュール名変更 (xcvr_sample_tb -> xcvr_sample_top)
(2) 入出力ポートの宣言を追加
(3) 不要になった BFM 記述、内部信号を削除
1-3. 入出力ポートの宣言
基礎編(1) で作成したテストベンチに、入出力ポートの宣言を追加します。追加するポートは、クロック、リセット、シリアルポートに加えて、RX パラレルデータも追加します。これは論理合成でデザインが削除されてしまうことを防ぐためで、コンパイル時には Virtual Pin という設定をして実際の出力ピンとはならないようにします。
記述としては以下のようになります。開発キットのリセットは Low Active なので、信号名は reset_reset_n とし、内部で反転して接続します。
module xcvr_sample_top (
input wire clk_100m_clk,
input wire clk_156m_clk,
input wire reset_reset_n,
output wire o_tx_serial_data,
output wire o_tx_serial_data_n,
input wire i_rx_serial_data,
input wire i_rx_serial_data_n,
output wire rcvd_data_valid,
output wire [31:0] rcvd_data_32b_hi,
output wire [31:0] rcvd_data_32b_lo
);
wire reset_reset = ~reset_reset_n; 1-4. 不要な記述の削除
クロック、リセット入力は外部ピンとなりますので、BFM は不要になります。また、内部信号も入出力信号になりますのでコメントアウトします。
加えて、ループバック記述もコメントアウトします。
これでデザイン作成は完了です。
1-5. コンパイルの実行
1-3 で作成したデザインを Quartus Prime でコンパイルします。まずは IP Generation と Analysis & Synthesis を実行します。 実行前に以下をご確認ください。
(1) Project Navigator に "xcvr_sample_top" が選択されている
(2) Project -> Add/Remove Files in Project で以下のように表示されている
(2) で、以下のように "?" が表示されている場合は、これらを削除してください (選択して Remove、その後 Apply をクリック) 。
"?" の表示が無い場合は不要です。
上記確認後、まずは IP Generation、続いて Analysis & Synthesis を実行します。それぞれ以下をクリックして実行できます。
正常に終了すれば、以下のように表示されます。その後、OK をクリックしてください。
1-6. ピン配置、IO Standard、Virtual Pin の設定
Quartus Prime の Assignments -> Assignment Editor から、Assignment Editor を開きます。以下のように設定します。
上記は Assignment Editor で個別に設定することもできますが、以下のテキストを xcvr_sample_top.qsf にコピーすることでも設定できます。
set_location_assignment PIN_BC29 -to clk_156m_clk -comment IOBANK_4A set_instance_assignment -name IO_STANDARD "CURRENT MODE LOGIC (CML)" -to clk_156m_clk -entity xcvr_sample_top set_location_assignment PIN_BK109 -to clk_100m_clk -comment IOBANK_5B set_instance_assignment -name IO_STANDARD "3.3-V LVCMOS" -to clk_100m_clk -entity xcvr_sample_top set_location_assignment PIN_BR112 -to reset_reset_n -comment IOBANK_5B set_instance_assignment -name IO_STANDARD "3.3-V LVCMOS" -to reset_reset_n -entity xcvr_sample_top set_location_assignment PIN_BY7 -to o_tx_serial_data -comment IOBANK_4A set_location_assignment PIN_CB1 -to i_rx_serial_data -comment IOBANK_4A set_location_assignment PIN_BY10 -to o_tx_serial_data_n -comment IOBANK_4A set_location_assignment PIN_CB3 -to i_rx_serial_data_n -comment IOBANK_4A set_instance_assignment -name IO_STANDARD "HIGH SPEED DIFFERENTIAL I/O" -to o_tx_serial_data set_instance_assignment -name IO_STANDARD "HIGH SPEED DIFFERENTIAL I/O" -to i_rx_serial_data set_instance_assignment -name IO_STANDARD "HIGH SPEED DIFFERENTIAL I/O" -to o_tx_serial_data_n set_instance_assignment -name IO_STANDARD "HIGH SPEED DIFFERENTIAL I/O" -to i_rx_serial_data_n set_instance_assignment -name VIRTUAL_PIN ON -to rcvd_* -entity xcvr_sample_top
また、開発キットに合わせて、OSC_CLK 周波数などを qsf ファイルに追記します。以下を xcvr_sample_top.qsf にコピーしてください。
set_global_assignment -name USE_CONF_DONE SDM_IO12
set_global_assignment -name DEVICE_INITIALIZATION_CLOCK OSC_CLK_1_125MHZ
ポイント:Quartus® Prime Pro Edition 25.1.1 以降では、プログラミング・ファイルを生成するために I/O ピンの Location および I/O Standard の指定が必要です。必要な割り当てがおこなわれていない場合、プログラミング・ファイルは生成されません。以下の FAQ もご参照ください。
Quartus® Prime Pro Edition 25.1.1 でコンパイルする際、プログラミング・ファイルが生成されません。
また、必要な割り当てが設定されていない I/O ピンは、コンパイル・レポートの I/O Assignments Warnings で確認できます。
1-7. タイミング制約の設定
つづいてタイミング制約をおこなう sdc ファイルを作成します。今回は、クロック制約と、解析不要なパスの設定のみおこないます。
Quartus の File -> New から、"SDC File (Read by the Timing Analyzer at each fitter stage" を選択します。
開いたファイルに、以下をコピーし、(Files -> Save As...) で xcvr_sample_top.sdc という名称で save してください。
create_clock -name clk_100m -period 10 [get_ports clk_100m_clk]
create_clock -name altera_reserved_tck -period 40 [get_ports altera_reserved_tck]
set_clock_groups -asynchronous -group [get_clocks {altera_reserved_tck}]
set_false_path -from [get_keepers {xcvr_sample_inst|phy|*}] -to [get_keepers {s_xcvr_tx_ready_2r[0]}]
Project -> Add/Remove Files in Project を開き、save した xcvr_sample_top.sdc が追加されていることを確認します。表示の順番として、このファイルが最下段になるように、Down をクリックします。
また、Assignments -> Settings を開き、Timing Analyzer カテゴリーを選択して、xcvr_sample_top.sdc を追加してください。以下は追加後の画面です。追加後、OK をクリックして閉じます。
参考:SDC ファイルの登録順序については、以下をご参照ください。
Quartus® Prime 開発ソフトウェアに登録する SDC ファイルが複数ある場合の登録順序
1-8. SignalTap の設定
内部信号を確認するために、SignalTap の設定をします。 Quartus Prime の Tools -> Signal Tap Logic Analyzer を選択します。デフォルト画面を選択すると、以下の画面が開きます。
ここで、下図のように設定してください。
設定後、名称を設定して save します。デフォルト名称は stp1.stp (以後数字が順次増加)です。 "Do you want to enable Signal Tap File ...." とメッセージが出たら、"Yes" を選択します。
Signal Tap の画面を閉じて、Quartus Prime の Assignments -> Settings を開き、Signal Tap Logic Analyzer をカテゴリーを選択します。
Signal Tap が有効になっていて、作成したファイル名が選択されていることを確認後、OK をクリックして閉じます。
1-9. フルコンパイルの実行
以上で設定は完了です。フルコンパイルを実行してプログラミング・ファイルを生成します。
以下のショートカットでフルコンパイルが実行できます。
正常にコンパイルが終了すると以下のように表示されますので、OK をクリックします。そうすると続いてタイミング解析が実行されます。
タイミング解析が実行されると以下のように表示されます。 Unconstrained Path が残っていますが、今回はトランシーバー部の確認のみを目的としているため、Unconstrained Path は一時的に無視します。
1-10. コンパイル結果の確認
コンパイル後、ピン配置が有効に設定されていることを確認します。プログラミング・ファイルが生成されていることを確認します。以下のショートカットをクリックしてレポートを開きます。
Input Pins、Output Pins をそれぞれ選択して、Pin#、I/O Standard が正しく設定されていることを確認します。
次に、プログラミング・ファイルが生成されていることを確認します。プロジェクト・フォルダーの output フォルダー内に、xcvr_sample_top.sof が生成されていることを確認します。
(ver25.1.1 では、I/O Standard .... sof が生成されませんので、設定を確認してください)(back annotate を実行してください)
2. 実機確認
2-1. 開発キットの準備
アルテラ社の Premium Kit の SMA を、TX1_P/TX1_N と RX1_P/RX1_N を接続します。
2-2. デバイスへのプログラミング
生成されたプログラミング・ファイルを FPGA に書き込みます。今回は SignalTap で書き込むこととします。
開発キットの電源を入れた状態で、Tools -> Signal Tap Logic Analyzer で起動して、以下のように設定してください。
(1) Hardware : Agilex 5E065B Premium DK を選択
Device : @2 : A5E (C065BB32AR0....) を選択
(2) xcvr_sample_top.sof を選択
(3) をクリックしてプログラミングを実行
2-3. SignalTap での波形
プログラミング・ファイル (.sof) を書き込んだのち、以下のショートカットで測定を開始します。
以下のように表示されます。
rcvd_data_32b_hi[31:0]、rcvd_data_32b_lo[31:0] を展開すると、10bit のカウンター波形が確認できます。今回はアライメントをしていないので、カウンターの bit 0 の位置は合っていません。
送信パターンは、 10bit カウンターを縦積みして 64bit にしているので、最上位は 4bit カウンターになります。
以下は、最上位の 4bit カウンターが rcvd_data_32b_lo[23:20] になった場合の例です。
ひとまずカウンターのように表示されれば大丈夫です。ビットズレのアライメント方法などは別記事で準備中です。
参考:送信データは 64 bit で、10 bit カウンターを 6 個と 4 bit カウンターを 1 個配置しています。今回はアライメントをおこなっていないので、64bit のビット0の位置がずれてしまいます。今回の例では、rcvd_data_32b_lo[24] が 64bit データの bit 0 になった波形となりました。
おわりに
本記事は以上で終了となります。引き続き、基礎編 4 -トランシーバーツールキットをご参照ください。(近日公開)
はじめてのトランシーバー Agilex™ 5 / Agilex™ 3 編
おすすめ記事:Altera FPGA の開発フロー
添付ファイル
本記事で生成するファイルのサンプルです。