VHDLwhiz UART テスト インターフェース ジェネレーター
製品情報
仕様:
- 製品名: VHDLレジスタUARTテストインターフェースジェネレータ
- バージョン: 1.0.4
- 日付: 18年2024月XNUMX日
- 著者: ジョナス・ジュリアン・ジェンセン
- 製品 URL: 製品リンク
- 連絡先メールアドレス: jonas@vhdlwhiz.com
説明
この製品を使用すると、UART を使用して FPGA レジスタ値を読み書きするためのカスタム インターフェイスを生成できます。生成された VHDL モジュールと Python スクリプトにより、FPGA 設計内のさまざまなタイプのレジスタと対話できるようになります。
要件
- Python 3 インタープリター
- pyserial パッケージ
プロトコル
この製品は、次の 4 つの制御文字を含むデータ フレーミング プロトコルを使用します。
- 名前: READ_REQ、 価値: 0x0A – ホストからFPGAへのコマンド。書き込みシーケンスを開始し、すべてのレジスタをUART経由で送り返す。
- 名前: START_WRITE、 価値: 0x0B – どちらの方向でも書き込みシーケンスの開始を示す
- 名前: END_WRITE、 価値: 0x0C – どちらの方向でも書き込みシーケンスの終了を示す
- 名前: 逃げる、 価値: 0x0D – 制御語をエスケープするために使用されるエスケープ文字
製品使用説明書
スクリプトの実行
製品を使用するには、Python 3 と Pyserial パッケージがインストールされていることを確認してください。スクリプトを Python 3 インタープリターで実行します。
カスタムインターフェースの生成
gen_uart_regs.pyスクリプトを使用して、FPGAレジスタ値の読み取りと書き込みのためのカスタムインターフェイスを生成します。出力を生成する際に、入力レジスタと出力レジスタの構成とタイプを指定できます。 files.
レジスターとのやり取り
生成された VHDL モジュールと Python スクリプトを使用して、FPGA 設計内の任意の数のレジスタを読み書きできます。アクセス可能なレジスタの型は、std_logic、std_logic_vector、signed、unsigned などです。
ライセンス
- MIT ライセンスには、ソース コードの著作権要件と使用条件が含まれています。 LICENSE.txtを参照してください。 file ジップ内 file 詳細については。
変更履歴
- これらの変更はプロジェクトに関するものです fileこの文書はそれに応じて更新されます
バージョン | 備考 |
1.0.0 | 初回リリース |
1.0.1 | uart_regs.pyをPythonモジュールとしてインポートするときに「self」参照が欠落するバグを修正しました。書き込み失敗のプリントアウトを例外に変更しました。
インポートされたモジュールとして実行しているときにコンソールに出力しないようにします。 |
1.0.2 | 出力モード レジスタがない場合の Vivado [Synth 8-248] エラーを修正しました。 |
1.0.3 | Vivado Linterの警告を修正: レジスタは次のように駆動されます。
同期リセット |
1.0.4 | 最後のバイトとしてエスケープ文字を含む不正な単語を受信する場合のコーナーケースを修正しました。IDLE に戻るときに recv_data_prev_is_escape をクリアしなかったため、次の単語も失われていました。
gen_uart_regs.py スクリプトでは、一意の reg 名のみが許可されるようになりました。 |
説明
- この文書では以下について説明します filesとフォルダ:
- gen_uart_regs.py
- 生成された/uart_regs.vhd
- 生成された/uart_regs.py
- 生成された/インスタンス化テンプレート.vho
- rtl/uart_regs_backend.vhd
- rtl/uart_rx.vhd
- rtl/uart_tx.vhd
- デモ/lattice_icestick/
- デモ/xilinx_arty_a7_35/
- デモ/xilinx_arty_s7_50/
- gen_uart_regs.py スクリプトとサポート VHDL fileこのプロジェクトの を使用すると、UART を使用してさまざまなタイプと幅の FPGA レジスタ値を読み書きするためのカスタム インターフェイスを生成できます。
- 生成された VHDL モジュールと Python スクリプトを使用して、デザイン内の任意の数のレジスタを読み書きできます。UART でアクセス可能なレジスタのタイプは、std_logic、std_logic_vector、signed、unsigned のいずれかです。
- 出力を生成する際に、入力レジスタと出力レジスタの正確な構成とタイプを決定できます。 filegen_uart_regs.py スクリプトを使用します。
- Python スクリプトは、ChatGPT 人工知能ツールの助けを借りて部分的に作成されましたが、VHDL コードは手作業で作成されています。
要件
- このプロジェクト内のスクリプトは、Python 3 インタープリターを介して実行する必要があり、Pyserial パッケージがインストールされている必要があります。
- 次のコマンドを使用して、Pip 経由で pyserial をインストールできます: pip install pyserial
プロトコル
- VHDL filesとPythonスクリプトは4つの制御を持つデータフレーミングプロトコルを使用します
名前 | 価値 | コメント |
読み取り要求 | 0x0A | ホストからFPGAへの書き込み開始コマンド
すべてのレジスタをUART経由で送り返すシーケンス |
START_WRITE | 0x0B | 書き込みシーケンスの開始を示す。
方向 |
END_WRITE | 0x0C | どちらの方向でも書き込みシーケンスの終了をマークします |
逃げる | 0x0D | START_WRITE マーカーと END_WRITE マーカーの間にデータとして表示される場合に、ESCAPE 文字自体を含む制御ワードをエスケープするために使用されるエスケープ文字。 |
FPGA に送信されるエスケープされていない READ_REQ バイトは、UART でアクセス可能なすべてのレジスタ (入力と出力) を UART 経由でホストに送り返す命令です。このコマンドは通常、uart_regs.py スクリプトによってのみ発行されます。
このコマンドを受信すると、FPGA はすべてのレジスタの内容をホストに返送して応答します。最初に入力信号、次に出力信号です。長さの合計が 8 ビットの倍数にならない場合、最後のバイトの下位ビットにゼロが埋め込まれます。
書き込みシーケンスは常に START_WRITE バイトで始まり、END_WRITE バイトで終わります。その間のバイトはすべてデータ バイトとみなされます。データ バイトに制御文字と同じ値がある場合、データ バイトをエスケープする必要があります。つまり、データ バイトの前に追加の ESCAPE 文字を送信して、それが実際にデータであることを示します。
エスケープされていない START_WRITE がバイト ストリームのどこかに到着すると、書き込みシーケンスの開始とみなされます。uart_regs_backend モジュールは、通信が同期しなくなった場合にこの情報を使用して再同期します。
gen_uart_regs.py
- これは、インターフェースを生成するために最初に使用する必要があるスクリプトです。以下は、python gen_uart_regs.py -h を実行して取得できるヘルプ メニューのスクリーンショットです。
- カスタム インターフェイスを生成するには、必要な UART 制御可能レジスタをそれぞれ引数として指定してスクリプトを実行する必要があります。使用可能なタイプは、std_logic、std_logic_vector、unsigned、signed です。
- レジスタの長さが 1 でない限り、デフォルトのモード (方向) は in で、デフォルトのタイプは std_logic_vector です。その場合、デフォルトで std_logic になります。
- したがって、std_logic 入力信号を作成する場合は、次のいずれかの引数を使用できます。
- 私の_sl=1
- my_sl=1: 中
- my_sl=1:in:std_logic
- 上記のすべてのバリエーションでは、スクリプトによって次の UART アクセス可能な信号が生成されます。
- 引数を付けてスクリプトを実行し、方向、長さ、タイプの異なる複数のレジスタを持つインターフェースを生成してみましょう。
生成 files
- gen_uart_regs.pyスクリプトの実行が成功すると、3つの文字列を含むgeneratedという名前の出力フォルダが生成されます。 file以下にリストされているもの。すでに存在する場合は上書きされます。
- 生成された/uart_regs.vhd
- 生成された/uart_regs.py
- 生成された/インスタンス化テンプレート.vho
- uart_regs.vhd
- これはスクリプトによって生成されたカスタム インターフェイス モジュールです。これをデザイン内でインスタンス化し、UART を使用して制御するレジスタにアクセスできるようにする必要があります。
- 「– UART アクセス可能レジスタ」セクションより上のすべてはすべての uart_regs モジュールで同一ですが、その行より下のポート信号の構成は、ジェネレータ スクリプトに渡される引数によって異なります。
- 以下のリストは、生成コマンドexから生成されたuart_regsモジュールのエンティティを示しています。ampgen_uart_regs.py セクションに示されているファイル
- uart_rx 信号は uart_rx モジュールで処理されるため、同期する必要はありません。
- モジュールが読み取り要求を受信すると、現在のクロック サイクル内のすべての入力信号と出力信号の値がキャプチャされます。その後、瞬間スナップショットが UART 経由でホストに送信されます。
- 書き込みが発生すると、すべての出力レジスタが同じクロック サイクル内で新しい値に更新されます。出力信号の値を個別に変更することはできません。
- ただし、uart_regs.py スクリプトを使用すると、最初にすべてのレジスタの現在の値を読み戻すことで、選択した出力のみを更新できます。次に、更新された値を含むすべての値を書き戻します。
- uart_regs.py
- 生成された/uart_regs.py file uart_regs VHDLモジュールと一緒に生成され、カスタムレジスタ情報がヘッダーに含まれます。 fileこのスクリプトを使用すると、カスタム レジスタの読み取りや書き込みを簡単に行うことができます。
ヘルプメニュー
- ヘルプ メニューを印刷するには、python uart_regs.py -h と入力します。
UARTポートの設定
- スクリプトには、-c スイッチを使用して UART ポートを設定するオプションがあります。これは、Windows と Linux で機能します。ヘルプ メニューにリストされている使用可能なポートの 1 つに設定します。デフォルトのポートを設定するには、uart_regs.py スクリプトの UART_PORT 変数を編集することもできます。
レジスタの一覧表示
- レジスタマッピングに関する情報は、gen_uart_regs.py スクリプトによって uart_regs.py スクリプトのヘッダーに配置されます。以下に示すように、-l スイッチを使用して使用可能なレジスタを一覧表示できます。これはローカルコマンドであり、ターゲット FPGA とは対話しません。
レジスタへの書き込み
- -w スイッチを使用すると、出力モード レジスタのいずれかに書き込むことができます。以下に示すように、レジスタ名の後に「=」を付け、2 進数、16 進数、または 10 進数として指定された値を指定します。
- VHDL実装では、スクリプトがすべての出力レジスタを同時に書き込む必要があることに注意してください。したがって、出力レジスタの完全なセットを指定しない場合、スクリプトは最初にターゲットFPGAから読み取りを実行し、次に不足しているレジスタにその値を使用します。その結果、指定されたレジスタのみが変更されます。
- 書き込みを実行すると、指定されたすべてのレジスタは、UART 経由で受信されるとすぐにではなく、同じクロック サイクル中に変更されます。
レジスタの読み取り
- 下図のように、-rスイッチを使用してすべてのレジスタ値を読み取ります。黄色でマークされた値は、前の書き込み例で変更した値です。ample
- 読み取りごとに、すべての入力レジスタと出力レジスタの瞬間スナップショットが表示されます。それらはすべてamp同じクロックサイクル中にリード
デバッグ
通信プロトコルをデバッグする必要がある場合は、他のスイッチと一緒に-dスイッチを使用します。すると、スクリプトは送受信されたすべてのバイトを出力し、 tag 以下に示すように、制御文字の場合はそれらを無視します。
他のPythonスクリプトでインターフェースを使用する
- uart_regs.py スクリプトには、他のカスタム Python スクリプトの通信インターフェイスとして簡単に使用できる UartRegs クラスが含まれています。以下に示すように、クラスをインポートし、そのオブジェクトを作成し、メソッドの使用を開始するだけです。
- メソッドと説明、戻り値の型については、Python コード内の docstring を参照してください。
インスタンス化テンプレート.vho
- 利便性のため、インスタンス化テンプレートは uart_regs モジュールとともに生成されます。コーディング時間を節約するために、モジュールのインスタンス化と信号宣言をデザインにコピーできます。
静的RTL files
- 以下の内容を含める必要があります fileを VHDL プロジェクトに追加して、uart_regs モジュールと同じライブラリにコンパイルされるようにします。
- rtl/uart_regs_backend.vhd
- rtl/uart_rx.vhd
- rtl/uart_tx.vhd
- uart_regs_backend モジュールは、レジスタ データのクロック インとクロック アウトを行う有限ステート マシンを実装します。uart_rx モジュールと uart_tx モジュールを使用して、ホストとの UART 通信を処理します。
デモプロジェクト
- Zipには3つのデモプロジェクトが含まれています fileこれらを使用すると、さまざまなボード上の周辺機器や、いくつかの大きな内部レジスタを制御できます。
- デモフォルダには、事前に生成されたuart_regs.vhdとuart_regs.pyが含まれています。 fileこれらのデザインのために特別に作られています。
ラティスiCEstick
- demo/icecube2_icestick フォルダには、Lattice iCEstick FPGA ボードのレジスタ アクセス デモ実装が含まれています。
- 実装プロセスを実行するには、demo/lattice_icestick/icecube2_proj/uart_regs_sbt.projectを開きます。 file Lattice iCEcube2 設計ソフトウェアで。
- iCEcube2 GUI にプロジェクトをロードした後、[ツール]→[すべて実行]をクリックしてプログラミング ビットマップを生成します。 file.
- Lattice Diamond Programmer Standaloneツールを使用して、生成されたビットマップでFPGAを構成できます。 file。 Diamond Programmer が開いたら、ようこそダイアログ ボックスで [既存のプログラマー プロジェクトを開く] をクリックします。
- プロジェクトを選択 file Zip で見つかった: demo/lattice_icestick/diamond_programmer_project.xcf をクリックし、[OK] をクリックします。
- プロジェクトがロードされたら、 File 上に示すように、名前列。 ビットマップを参照して選択します file iCEcube2で生成したもの
- デモ/lattice_icestick/icecube2_proj/uart_regs_Implmnt/sbt/outputs/bitmap/top_icestick_bitmap.bin
- 最後に、iCEstick ボードをコンピュータの USB ポートに接続した状態で、[Design]→[Program] を選択して SPI フラッシュをプログラムし、FPGA を設定します。
- これで、uart_regs.py セクションで説明されているように、demo/lattice_icestick/uart_regs.py スクリプトを使用してレジスタの読み取りと書き込みに進むことができます。
ザイリンクス ディジレント Arty A7-35T
- Artix-7 35T Arty FPGA 評価キットのデモ実装は、demo/arty_a7_35 フォルダーにあります。
- Vivadoを開き、抽出した file■ GUI インターフェイスの下部にある Tcl コンソールを使用します。 次のコマンドを入力して、デモ プロジェクト フォルダーに移動します。
- CD /デモ/arty_a7_35/vivado_proj/
- create_vivado_proj.tcl Tcl スクリプトを実行して、Vivado プロジェクトを再生成します。
- ソース ./create_vivado_proj.tcl
- サイドバーの「ビットストリームの生成」をクリックして、すべての実装手順を実行し、プログラミング ビットストリームを生成します。 file.
- 最後に、「ハードウェア マネージャーを開く」をクリックし、GUI を通じて FPGA をプログラムします。
- これで、uart_regs.py セクションで説明されているように、demo/arty_a7_35/uart_regs.py スクリプトを使用してレジスタの読み取りと書き込みに進むことができます。
ザイリンクス デジレント Arty S7-50
- Arty S7: Spartan-7 FPGA 開発ボードのデモ実装は、demo/arty_s7_50 フォルダーにあります。
- Vivadoを開き、抽出した file■ GUI インターフェイスの下部にある Tcl コンソールを使用します。 次のコマンドを入力して、デモ プロジェクト フォルダーに移動します。
- CD /デモ/arty_s7_50/vivado_proj/
- create_vivado_proj.tcl Tcl スクリプトを実行して、Vivado プロジェクトを再生成します。
- ソース ./create_vivado_proj.tcl
- サイドバーの「ビットストリームの生成」をクリックして、すべての実装手順を実行し、プログラミング ビットストリームを生成します。 file.
- 最後に、「ハードウェア マネージャーを開く」をクリックし、GUI を通じて FPGA をプログラムします。
- これで、uart_regs.py セクションで説明されているように、demo/arty_s7_50/uart_regs.py スクリプトを使用してレジスタの読み取りと書き込みに進むことができます。
実装
- 特定の実装要件はありません。
制約
- UART インターフェイスは低速であり、非同期インターフェイスとして扱われるため、この設計では特定のタイミング制約は必要ありません。
- uart_regs モジュールへの uart_rx 入力は、uart_rx モジュール内で同期されます。したがって、トップレベル モジュールで同期する必要はありません。
既知の問題
- FPGA アーキテクチャがデフォルトのレジスタ値をサポートしているかどうかに応じて、モジュールを使用する前にリセットする必要がある場合があります。
詳細情報
- 著作権 VHDLwhiz.com
よくある質問
Q: UART テスト インターフェイス ジェネレーターの目的は何ですか?
A: UART テスト インターフェイス ジェネレーターを使用すると、UART 通信を使用して FPGA レジスタ値と対話するためのカスタム インターフェイスを作成できます。
Q: Pyserial パッケージをインストールするにはどうすればよいですか?
A: Pipコマンドを使用してPyserialをインストールできます: pip install pyserial
ドキュメント / リソース
![]() |
VHDLwhiz UART テスト インターフェース ジェネレーター [pdf] ユーザーマニュアル UART テスト インターフェイス ジェネレーター、テスト インターフェイス ジェネレーター、インターフェイス ジェネレーター、ジェネレーター |