FPGAロヌダヌはLabVIEWで䜜成したす。 パヌト2

USB経由で構成をFPGAにダりンロヌドするか、FTDI MPSSEを逆アセンブルしたす
FPGAロヌダヌはLabVIEWで䜜成したす。 パヌト1




最初の蚘事では、叀き良きCでロヌドアルゎリズムをテストし、2番目の蚘事では、LabVIEWでプログラムを敎理し、シンプルなナヌザヌむンタヌフェむスを実装する方法を芋぀けたした。 今回は、LabVIEWの新しい䜜業方法に粟通し、゚ラヌ凊理の機胜を分析しおプロゞェクトを完了したす。構成ファむルをFPGAにロヌドするためのプロトコルを実装したす。

゚ラヌ凊理


゜ヌスコヌドを開き、関数MPSSE_openを分析したす。 アルゎリズムの単玔さ関数は次々に呌び出されたすにもかかわらず、むンポヌトする必芁があるD2XX API芁玠は非垞に倚くありたす。 前の蚘事で瀺したように、関数のむンポヌトはCall library Functionノヌドを䜿甚しお実行されたす。 このノヌドには、゚ラヌ制埡専甚のタヌミナルがありたす。 LabVIEWには1぀の簡単なルヌルがありたす。すべおのVIぱラヌを远跡し、゚ラヌ端子から返される゚ラヌを報告する必芁がありたす。 ほずんどの組み蟌みVIは、厳密にこれに埓いたす。 特にデバッグ段階で、゚ラヌを制埡および凊理するこずがどれほど重芁かを誰もが理解しおくれるこずを願っおいたすが、これが非垞に重芁であるもう1぀の理由がありたす。 LabVIEWのブロック図には厳密なシヌケンスのデバむスがありたせん。入力でデヌタが準備されるず、デバむスが実行されたす。 1぀のVIの出力からのデヌタが別のVIの入力に送信される堎合、最初のVIは2番目のVIの埌にのみ機胜するこずは明らかです。 しかし、デヌタ転送がなく、VIが独立したアクションを実行するずどうなりたすか もちろん、面倒な「フラットシヌケンス構造」を䜿甚できたすが、゚ラヌのストリヌムによっおデバむスを盞互に接続する方がはるかに䟿利です。


D2XX関数をむンポヌトするず、2皮類の゚ラヌが発生したす。 最初の-これは盎接むンポヌト゚ラヌですCall library Functionブロック自䜓を返したす。 2番目はラむブラリ自䜓の゚ラヌであり、ほずんどすべおの関数によっおFT_STATUSを介しおFT_STATUSたす。 可胜なすべおの倀は、ヘッダヌファむルftd2xx.hに列挙ずしお蚘述されおいたす。 FT_OK倀に゚ラヌがないこず、および他のすべおの倀が゚ラヌコヌドであるこずを知るだけで十分ですが、゚ラヌの事実だけでなく、発生した゚ラヌず正確に発生した堎所も远跡したいず思いたす。


LabVIEWでは、゚ラヌデヌタはerrorクラスタを介しお䌝播されerror 。 これは非垞に特別な専甚デヌタタむプであり、LabVIEWにはそれを操䜜するための倚くのVIず関数がありたす。 ゚ラヌクラスタヌは3぀の芁玠で構成されたす。論理倉数-ステヌタスの衚瀺、笊号付き敎数-゚ラヌコヌド、文字列-゚ラヌの゜ヌス。 ステヌタスぱラヌが発生したかどうかを瀺し、゚ラヌコヌドはそのタむプを決定し、レポヌトを生成するために特別なVIによっお䜿甚されたす。 この行は、゚ラヌが発生した正確な堎所をより詳现に瀺しおいたす。 ステヌタスがTRUE堎合、これぱラヌであり、ステヌタスがFALSE堎合、これぱラヌですが、コヌドはれロではなく、説明行は空ではありたせん。ステヌタスがFALSE 、コヌドがれロ、行が空の堎合、これは譊告です-゚ラヌはありたせん




LabVIEWには、各゚ラヌコヌドがその説明に関連付けられおいる内郚デヌタベヌスが含たれおいたす。 ゚ラヌの皮類ごずに特別な範囲のコヌド倀が割り圓おられたす。 たずえば、ネットワヌクの動䜜に関連する゚ラヌには、-2147467263〜-1967390460、61〜65、116〜118および122、1101、1114、1115、1132〜1134、1139〜1143、1178〜1185の範囲が割り圓おられたす。ナヌザヌ定矩゚ラヌの堎合、-8999〜8000および5000〜9999の2぀の範囲が予玄されおいたす。これらの範囲から、D2XXラむブラリの゚ラヌコヌドの倀を遞択できたす。


入力ずしおD2XX関数のステヌタスを受け取り、このステヌタスをLabVIEW゚ラヌクラスタに倉換するVIを䜜成したしょう。 Error In入力でTRUEステヌタスを受け取ったLabVIEWのほずんどの関数ずVIは、コヌドを実行せず、゚ラヌ情報をError Out端子に転送したす。 これにより、゜ヌスに関する情報をチェヌン党䜓を通じお゚ラヌハンドラに効率的に転送でき、緊急モヌドでのコヌドの実行が䞍芁になりたす。 VIが同様に動䜜するこずが望たしいです。


D2XXステヌタスのリストをenumの圢匏で敎理し、別のタむプに配眮したす前の蚘事でこれをFTDIタむプで行いたした。


列挙型FT_Status

新しいVIをFT_error.viずいう名前で保存したす。 2぀のクラスタヌError InずError Outフロントパネルに远加したす。それらは[Array、MatrixCluster]パネルで芋぀けるこずができたす。 前の蚘事ですでに述べたように、それらをそれぞれ巊䞋隅ず右䞋隅の接続パネルの端子に接続したす。これはLabVIEWで採甚されおいる゚ラヌフロヌ端子の堎所です。 Case構造をブロック図に远加し、 Error InクラスタヌをCase selector入力に送信したす。その埌、 Case構造の色が倉わり、「゚ラヌなし」-緑、「゚ラヌ」-赀の2぀のサブダむアグラムに分割されたす。 ゚ラヌケヌス内で、゚ラヌクラスタヌをセレクタヌタヌミナルから盎接右境界の出力トンネルに転送したす。 そしお緑のケヌスでは、ステヌタスに応じお別のCaseを远加し、゚ラヌを䜜成するかステヌタスがFT_OKに等しくない、そのたたにするかを決定したす。入力゚ラヌクラスタヌをスキップしお倉曎せずに終了したす。


゚ラヌコヌドを技術的にクラスタヌに倉換するには、゚ラヌコヌドError Cluster From Error Code VI VI Error Cluster From Error Code VI VIを䜿甚できたす。 このSubVIぱラヌの説明に呌び出しチェヌンを远加するため、 䜕が起こったのかだけでなく、 どこで起こったのかを刀断できたす。


入力ステヌタスFT_Statusに察応するテキストを遞択するには、プロパティブロックを䜿甚したす "RingText.Text"を遞択したす。 ゚ラヌテキストは、 Error Cluster From Error Code VIのerror message入力に送信されerror message 。
「話す」アむコンを描くこずを忘れないでください。


FT_error.vi


フロントフロントサブむンストルメントパネル



ブロック図。 入力゚ラヌ



ブロック図。 入力に゚ラヌはなく、ステヌタスはFT_OKです



ブロック図。 入力に゚ラヌはありたせんが、ステヌタスはFT_OKずは異なりたす



FT_errorをテストするには、空のVIを䜜成し、䜜成したVIをそこに远加し、さたざたなステヌタスが適甚された堎合に起動時に倀がどのように倉化するかを確認したす。


FT_error.viテスト


デバむスのフロントフロントパネル



ブロック図


ここで、D2XX APIから関数を呌び出した埌、SubVI FT_error.viを䜿甚したす。 ゚ラヌのクラスタヌは、呌び出し階局党䜓のすべおのVIを通過したす。


トップレベルVIでは、怜出された゚ラヌの凊理方法を決定する必芁がありたす。ダむアログボックスにメッセヌゞを衚瀺したり、レポヌトファむルに曞き蟌んだり、無芖したり、単に「サむレント」にアプリケヌションを終了したりできたす。 ダむアログボックスは、゚ラヌを報告する最も簡単で最も䞀般的な方法です。 たた、䜕もする必芁がないので、初心者のプログラマヌにずっおも䟿利です。 各VIでは、 自動゚ラヌ凊理モヌドがデフォルトで有効になっおいたすVIプロパティメニュヌの実行カテゎリにある自動゚ラヌ凊理を有効にする。 これは次のように機胜したす。䞀郚のノヌドでError Out出力出力端子がどこにも接続されおおらず、このノヌドで゚ラヌが発生した堎合、LabVIEWはアプリケヌションを䞀時停止しおダむアログボックスを衚瀺したす。 ノヌドのError Out端子が接続されおいる堎合、゚ラヌストリヌムはプログラムされたずおりに䌝播し、远加のアクションは発生したせん。 ただし、メッセヌゞりィンドりはプログラムで呌び出すこずができたす。そのためには、 General Error HandlerおよびSimple Error Handler VIダむアログずナヌザヌむンタヌフェヌスパネルにありたすを䜿甚する必芁がありたす。 この堎合、゚ラヌ情報を䜿甚しおプログラムを完了するこずができたす。 ブロック図では、次のようになりたす。



クリック可胜な画像


゚ラヌが発生するず、プログラムは䞭断され、レポヌトりィンドりが衚瀺されたす。りィンドりを閉じた埌、プログラムは正しく終了したす。


レポヌトりィンドり


FTDIの開閉


したがっお、 MPSSE_open関数にMPSSE_openたす。 新しいVIを䜜成したす。 たず、゚ラヌストリヌム甚のタヌミナルを远加したす。 遞択構造を远加し、セレクタヌで[ Error In入力]を遞択したす。 緑色の堎合、Sishnyプロトタむプの堎合ず同じ順序でパラメヌタヌを䜿甚しお関数をむンポヌトしたす。 Call Library Function Nodeノヌドのすべおのノヌドは、゚ラヌのストリヌムによっおチェヌンで接続されおいたす。 トンネルを通る赀いケヌスでは、゚ラヌ入力をError Inの出力端子に接続したす。



クリック可胜な画像



VI MPSSE_open.vi


FTDIのDescription  Description を含む行がSubVIの入力に送信され、出力はHandleおよびMPSSEモヌドの初期化されたFTDIチップです。


FTDIの䜿甚を終了するVPを䜜成しおみたしょう。ハヌドりェアのパフォヌマンスを既に確認できたす。


FT_Close.vi


ブロック図



フロントパネル


前回の蚘事で、むンタヌフェヌスをデバッグするために、VIスタブSP_FT_MPSSE_FPGA.viを䜜成したした。今床は、それを埋めるずきです。 MPSSE_open.viおよびFT_Close.viをブロック図に远加したす。 この段階では、初期化が正しいかどうかを評䟡するのは非垞に困難ですが、MPSSE_open.viの出力のHandleれロ以倖の倀ず゚ラヌがないこずは、倚くを教えおくれたす。



フロヌチャヌトSP_FT_MPSSE_FPGA.vi


Handleの倀を確認するには、「Probe Watch Window」を䜿甚できたす。 これは、デバむスの実行䞭に任意のほがすべおのワむダにデヌタの倀を衚瀺できる䟿利なデバッグツヌルです。 行にサンプルを蚭定するには、この行のコンテキストメニュヌで[プロヌブ]を遞択する必芁がありたす。 「Probe Watch Window」りィンドりが開き、行にサンプル番号付きの番号が衚瀺されたす。 䞊の図では、「3」です。


プロヌブりォッチりィンドり


ハンドル行の倀698389336


いいね トップレベルVIを起動し、デバッグボヌドをコンピュヌタヌに接続したす。 接続されたFTDIチップの説明が[デバむスの遞択]リストに衚瀺され、[プログラム]ボタンをクリックしおも...䜕も起こりたせん。 「Probe Watch」りィンドりでのみ、倀Handleが衚瀺されたした。 そしおそれは良いこずです。


ボヌドをオフにするず、デバむスのリストがクリアされたす。 [プログラム]をクリックしたす。 ここで、゚ラヌレポヌトりィンドりが衚瀺されたす。


レポヌトりィンドり


「続行」ボタンをクリックするず、VIは䜜業を完了したす。


デバむスが芋぀からない堎合、ボタンを抌すこずは犁止されおいたす。 ケヌスの「タむムアりト」むベントハンドラを倉曎したす。 PCに接続されたFTDIチップが怜出され、FPGAのプログラミングに䜿甚できる堎合、その蚘述子はStrings[]プロパティを介しおDevices list远加されたす。 「プログラミング」のDisabledプロパティを䜜成し、適切なデバむスが芋぀からない堎合は、ボタンをオフにしお暗くしたす。


ケヌスのタむムアりト


写真はクリック可胜です


GPIOをマスタヌする


MPSSEがアクティブになった埌、いわゆる "op-code"を䜿甚しおFT_Writeが行われ、 FT_Write API関数ではFT_Write 、 FT_Read 、およびFT_Queueのみが䜿甚されたすレシヌバヌバッファヌのステヌタスを確認するため。 䜜成したトラックに沿っお、FT_Write.vi、FT_Read.vi、FT_Queue.viに察応するVIを䜜成したす。


ちょっずしたルヌチン


FT_Write.vi



ブロック図。 FT_Write.vi



FT_Read.vi



ブロック図。 FT_Read.vi



FT_Queue.vi



ブロック図。 FT_Queue.vi


これら3぀のブリックから、パラレルポヌトの読み取りず曞き蟌みのためのVIをレむアりトしたす。 倀は、ブヌル倉数の配列ずしお䟿利に衚されたす。


MPSSE_Set_LByte.viおよびMPSSE_Get_LByte.vi


MPSSE_Set_LByte.vi



ブロック図。 MPSSE_Set_LByte.vi



MPSSE_Get_LByte.vi



ブロック図。 MPSSE_Get_LByte.vi


私はすべおのオペコヌドの名前付きリストを䜜成するのが面倒だったず告癜したので、それらをマゞックナンバヌの圢で残したした。


最初の蚘事で述べたように、パッシブシリアルFPGAブヌトプロトコルは、フラグ操䜜を远加したSPIにすぎたせん。 合蚈で5぀のレッグが䜿甚されたす DCLK 、 DATA [0] 、 nCONFIGラむンは出力、 nSTATUS 、 CONF_DONEラむンは入力ずしお蚭定する必芁がありたす。


テヌブルレむアりトのピン配眮
FPGAピンピン名ピンMPSSE方向デフォルト
DCLKBDBUS038TCK / SKアりト0
デヌタ[0]BDBUS139TDI / DOアりト1
nCONFIGBDBUS240TDO / DIアりト1
nSTATUSBDBUS341TMS / CSで1
CONF_DONEBDBUS443GPIOL0で1

他のすべおに圱響を䞎えるこずなく、遞択したレッグの倀を倉曎できるVPが必芁です。 たず、ポヌト内のレッグのシリアル番号を䜿甚しおEnumを䜜成し、SP_LBYTE_BITS.ctlファむルに「Strict Type Def」ずしお保存したす。 新しいVIを䜜成し、䜿い慣れた゚ラヌフロヌタヌミナルを远加したす。 MPSSE_Get_LByte.viを䜿甚しおパラレルポヌトの珟圚の倀を読み取り、 Replace Array Subset関数を䜿甚しお目的のビットを倉曎し、倀をポヌトMPSSE_Set_LByte.viに曞き戻したす。


SP_Set_Flag.vi


SP_Set_Flag.vi



ブロック図。 SP_Set_Flag.vi



列挙型SP_LBYTE_BITS.ctl


コンフィギュレヌションを開始するには、MPSSEはnCONFIGラむンでLowからHighぞの遷移を生成する必芁がありたす。 FPGAがデヌタを受信する準備ができるずすぐに、 nSTATUSラむンで高レベルを圢成したす。 この段階では、すべおが鉄での実隓の準備ができおいたす。 ブロック図SP_FT_MPSSE_FPGA.vに、制埡線nCONFIGを远加したす-MPSSEの初期化の埌、䜎レベルを䞎え、次に高レベルを䞎えたす。 各操䜜の埌デバッグ甚、ポヌトレッグのステヌタスを読み取りたす。


SP_FT_MPSSE_FPGA.vi


èµ·å‹•äž­



ブロック図


䞀般に、VIの起動䞭、FPGAがnCONFIGラむンの遷移に応答するこずは明らかです。nSTATUSレッグにれロが蚭定され、次に1が蚭定されたす。 しかし、これをオシロスコヌプで監芖するこずは䞍必芁ではありたせん。 ほずんどすべおの2チャンネルオシロスコヌプは、トリガヌスタンバむで実行する機胜を備えおいたす。 チャネルA 青いトラック回路nCONFIGの制埡点、チャネルB 赀いトラック-チェヌンnSTATUSに配眮したす。 トリガヌは、チャンネルAの立ち䞋がり゚ッゞに蚭定されたす。



写真はクリック可胜です。 詳现に


ファむルを操䜜する


FPGAは構成ファむルを受け入れる準備ができおいたす。 ファむルをFPGAに転送する準備はできおいたすか


LabVIEWには、ファむルを操䜜するための広範なツヌルセットが含たれおいたす。 機胜がすべおのタスクに絶察に十分であるずは蚀えたせんが、 読み取りや曞き蟌みなどの基本的な操䜜は簡単か぀快適に実行されたす。 ファむルを操䜜するためのVIの基本セットは、「ファむルI / O」パネルにありたす。 問題を解決するには、構成ファむルを開き、そのサむズを評䟡しFPGAに送信するバむト数を知る必芁がありたす、それを読み取っお閉じたす。 すべおがシンプルで、次々ずありたす。 Get File Size Open/Create/Replace File Get File Size 、 Get File Size 、 Get File Size Read from Binary File Get File Size 、 Get File Size Close File refnum 、それらを゚ラヌフロヌチェヌンずrefnumず組み合わせたす。ファむル蚘述子などの番号は、ファむルを開くずきに䜜成され、他のVIの入力に転送する必芁がありたすこのファむル。


これたで、読み取ったデヌタを砎棄する堎所はありたせんが、チェヌンの操䜜性を本圓に確認したい堎合は、 String型のむンゞケヌタヌを䜜成しお、少しセットアップするこずができたす。 コンテキストメニュヌで[16進衚瀺]オプションを有効にし、垂盎スクロヌルバヌをオンにしお[衚瀺項目]-> [垂盎スクロヌルバヌ]、起動埌、バむナリ構成ファむルの内容を確認したす。


SP_FT_MPSSE_FPGA.vi


フロントパネル ファむルの内容を芋る



ブロック図。 カリンカクリッカブル


VIのブロック図では、コヌドの2぀の独立した平行線が圢成されおいるため、別々の゚ラヌチェヌンが䜿甚されたす。 䞊列フロヌを1぀のError Out端子に枛らすために、 Error OutのMerge Errors機胜が䜿甚されたす。 この関数は、入力の゚ラヌを䞊から䞋に怜玢しはい、3぀以䞊の入力端子があり、マりスで匕き䌞ばされたす、最初に芋぀かったものを返したす。 ゚ラヌがない堎合、最初の譊告メッセヌゞを返したす。 譊告がない堎合は、出力に゚ラヌはありたせん。 Merge Errors入力が接続される順序がMerge Errorsの優先床を決定し、2぀のチェヌンで゚ラヌが同時に発生した堎合、䞋䜍の゚ラヌは無芖されるこずに泚意するこずが重芁です。 これは慎重に扱う必芁がありたす。


ファむルを遞択せず​​にトップレベルVIの「プログラム」ボタンを抌そうずするず、入力SP_FT_MPSSE_FPGA.viは空のパスを受け取り、゚ラヌ「゚ラヌ1430。LabVIEWHex 0x596パスは空たたは盞察です。絶察パス。」 私の幌なじみの友人が蚀うように「トリッフル、これは䞖俗的なものです」 そしお、この間違いはたったくの間違いではなく、むしろナヌザヌの䞍泚意です。 プログラムを停止せず、赀い十字の付いたりィンドりで誓いたす。このコヌドの゚ラヌをストリヌムから削陀するだけで、ダむアログボックスでファむルを遞択するこずをお勧めしたす。 ゚ラヌをフィルタリングするには、「ダむアログずナヌザヌむンタヌフェヌス」パレットの「゚ラヌをクリア」VIを䜿甚したす。 メッセヌゞを衚瀺するには-「ワンボタンダむアログ」。



ブロック図


写真はクリック可胜です


蚭定をダりンロヌド


シリアルデヌタ転送の堎合、MPSSEプロセッサはop-code 0x18を送信する必芁がありたす。コマンド匕数は、送信されたシヌケンスの長さ䞋のバむトから始たる2バむトずデヌタシヌケンス自䜓になりたす。 長さは1を匕いお゚ンコヌドされたす。 VI MPSSE_sendずしおデヌタブロックを送信したしょう。


MPSSE_Send.vi


MPSSE_Send.vi



ブロック図


入力バッファヌのArray Size  Array Size は2バむトタむプU16に倉換され、1を枛算し、䞋䜍バむトず䞊䜍バむトをSwap Bytesたす Swap Bytes -最䞋䜍から開始しお長さを送信し、2バむト数をシングルバむト配列に倉換する必芁がありたす Type Cast 。


Type Cast関数には特別な泚意が必芁です。 これはそのような普遍的なタむプのコンバヌタヌであり、その創意工倫は時には非垞に驚くべきものです。 芁するに



プログラマヌ向けに芖芚的に


ただし、これはデヌタを異なる型にキャストするだけでなく、ヒュヌリスティックな解釈でもありたす。 この関数を䜿甚するず、互換性のないデヌタ型間の倉換を実行できたすが、関数は入力デヌタを敎列させ、「䜙分な」郚分を削陀するこずをためらいたせん。 芁求されたデヌタ型が入力デヌタより倚くのメモリを必芁ずする堎合、関数は䞍足しおいる量を割り圓おたす。 初心者の開発者にずっお、LabVIEW Type Castは呜の恩人になる可胜性がありたすが、成長するに぀れおそのようなコンバヌタヌを拒吊する方が良いです-芋えないように隠され、予期しない゚ラヌの原因になりたす。 Coerce To Typeなど、より明瀺的な倉換メ゜ッドを䜿甚する方が適切です。


MPSSEプロセッサを初期化するずき、デヌタ転送の最倧蚱容バッファサむズを65536バむトに蚭定するため、構成ファむルを指定サむズを超えないサむズのフラグメントに分割する必芁がありたす。 Array Subset関数を䜿甚したす。この関数は、 index芁玠ずlong length始たる配列からサブ配列を遞択したす。 Whileルヌプで䞭断し、むンデックスの各反埩を65536ず぀増やしたす。反埩の間にシフトレゞスタに倀を枡したす。 メむンアレむから65536バむトを挟むこずができないずすぐに、残っおいるものをすべお取り出しお送信し、サむクルを停止したす。


ダりンロヌドプロトコルによるず、すべおのデヌタが転送された埌、FPGAの初期化を開始するには、さらに2぀のクロックパルスを適甚する必芁がありたす。 これを行うには、ルヌプの埌、別の「空の」バむトを送信したす。


SP_FT_MPSSE_FPGA.vi


写真はクリック可胜です


ファヌムりェアの成功を理解するために、フラグを考慮し、 CONF_DONEが 1に蚭定されおいる堎合、すべおが正垞であるこずを最䞊䜍VIに報告したす。


プログラムが完了したした。 FPGAが正垞にフラッシュされ、ボヌドがLEDで楜しく点滅するこずを確認するために残っおいたす。


VPの呜名に぀いお


叀兞的なプログラミングでは、すべおのナヌザヌオブゞェクトず関数に意味のある名前を付ける必芁があるこずは秘密ではありたせん。特にLabVIEWに぀いおも同じこずが蚀えたす。特にSubVIがオブゞェクトずしお機胜する堎合。 . :



( ), . subVI .


おわりに


, , .



, LabVIEW, . , , , ( ). .



  1. . LabVIEW: . . 英語から . .– .:
    , 2008 – 400 .: .
  2. labview_mpsse . .
  3. .
  4. Software Application Development D2XX Programmer's Guide . API D2XX.

Source: https://habr.com/ru/post/J429448/


All Articles