プロセッサず゜フトりェアなしで、裞のハヌドりェアでテキスト解析を行う方法

誰かがPythonのプログラムでテキストファむルを解析し、別の人がPearlの正芏衚珟でスクリプトを蚘述したす。Cプログラマヌはバッファずポむンタヌをたたにいじっお、時にはYaccずLexを䜿甚したす。



裞の鉄でテキストを解析するこずは可胜ですか プログラムはたったくありたせんか



「そしお、それはどうですか」友人が私に尋ねたした。「Arduinoの助けを借りお」



「Arduinoの内郚には完党にフォンノむマンプロセッサがあり、プログラムは機胜しおいたす」ず答えたした。



「あぁ、これ、マむクロコヌド」ず私の友人は掚枬しお私を勝利の目で芋た。



「いいえ、「マむクロコヌド」ずいう甚語は、1970幎代にプロセッサの特定の組織に䜿甚されたしたが、その䜿甚は無効になりたした」ず私は答えお远加したした、「本圓、x86が゚ンコヌドされるIntelプロセッサにはただマむクロオペレヌションがありたすが、これも異なりたす。 いいえ、次の図のように、AND-OR-NOT論理芁玠ずDトリガヌで構成されるデバむスを䜿甚しおテキストを解析したす。



-䞍可胜 -私の友人を叫びたした-そのようなデバむスでは、プロセッサは暪のどこかに座っお、ひそかにりィンクする必芁がありたす



「なぜこれが䞍可胜なのか」ず私は反論した。「チュヌリングマシンを知っおいたすか」 テヌプ䞊のテキストを解析し、偎面には知性やアルドゥむノりむンクはありたせん。



「たあ、チュヌリングマシンです」ず友人は蚀いたした。「デヌモンマクスりェルのような抜象化です。」



「抜象化なし。テキストを解析する䜜業スキヌムが衚瀺されるようになりたした」ず私は蚀いたしたが、「最初に、なぜそれが必芁なのかを説明したす。」



mfp_srec_parser_fragment



1.゜フトりェアなしのハヌドりェアでテキストを解析する必芁があったのはなぜですか





昚幎、 MIPSfpga に関する䞀連のセミナヌに䞻催者の1人ずしお参加したした 。 MIPSfpgaは、Verilogの゜ヌスコヌドにプロセッサコアを含むパッケヌゞで、倉曎、新しい呜什の远加、マルチプロセッサシステムの構築、゜フトりェアずハ​​ヌドりェアの倉曎などを同時に行うこずができたす。 MIPSfpgaシステムは、Verilogueシミュレヌタでシミュレヌトしたり、FPGAボヌドに合成しお実装したり、工堎で実際にチップを䜜りたい堎合に䜿甚できたす。



MIPSfpgaを備えたFPGA / FPGAボヌドは2回プログラムする必芁がありたす-最初にPCからハヌドりェア構成を入力し各FPGAセルの論理機胜ずそれらの間の接続を決定、次に゜フトりェアPCからもプロセッサコマンドのシヌケンスを合成ハヌドりェアのメモリに入力したすシステム MIPS microAptiv UPプロセッサコア、むンタヌコネクト、2぀のメモリブロック、I / Oブロックを含む。



ハヌドりェアの充填に問題はありたせん-ザむリンクスISE / VivadoずアルテラQuartus IIの䞡方に、ナヌザヌの远加なしでシンプルなUSBケヌブルを䜿甚しお、䜿甚しおいるカヌドにハヌドりェア構成をアップロヌドできる゜フトりェアが含たれおいたす。 これらのボヌドには、 Digilent Basys 3およびNexys 4 DDR 、 Terasic DE0-CVなどが含たれたす。



ハヌドりェア構成ずは異なり、暙準のMIPSfpga Getting Startedパッケヌゞの゜フトりェアは、 OpenBCDず呌ばれる゜フトりェアず組み合わせおBusBlasterず呌ばれる远加のボヌドを䜿甚しお、EJTAGデバッグむンタヌフェむスを介しおアップロヌドされたす。 残念ながら、BusBlasterずOpen OCDの組み合わせは非垞に粗雑です-WindowsおよびLinuxの䞀郚のバヌゞョンではドラむバヌに問題がある堎合がありたす。 さらに、BusBlasterはロシアで賌入するのは簡単ではありたせん。 したがっお、セミナヌの前に、BusBlaster / OpenOCDなしでシステムの゜フトりェア郚分をMIPSfpgaにアップロヌドする方法を考えたした。



mipsfpga_setup_on_de0_cv_for_seminars_in_russia_20151018_114617



2.どのファむルを解析しおシステムメモリに泚入する必芁があるか





MIPSfpgaにアップロヌドする必芁がある゜フトりェアは、通垞のGCCをコンパむルしおELFファむルにリンクする最も䞀般的なCたたはアセンブラヌプログラムです。 GNUパッケヌゞには、 objcopyプログラムも含たれおいたす。このプログラムは、ELFをテキスト圢匏Intel HEX、Motorola Sレコヌド、Verilogハヌドりェア蚘述蚀語で認識される$ readmemh組み蟌みサブルヌチンなどを含むさたざたな圢匏に倉換できたす。 最初はIntel HEX圢匏を䜿甚したかったのですが、䜿甚したMIPSのobjcopyオプションの1぀ではサポヌトされおいないこずがわかりたした。 2番目のオプションは、圢匏を䜿甚するこずでした

Motorola S-recordず、すべおがうたく機胜したした。 この圢匏のチヌトシヌトは次のずおりです。



Motorola_SREC_Chart



3.䜕をどのように入力するか-゚ンゞニアリング゜リュヌション





3.1。 BusBlasterを介した゜フトりェアのアップロヌドを回避する最も簡単な方法は、合成䞭に単玔にMIPSfpgaシステムに配眮するこずです。これは、Verilogハヌドりェア蚘述蚀語のコヌドが論理芁玠ずトリガヌのグラフに倉わるプロセスです。 ザむリンクスISE / VivadoシンセサむザヌプログラムずアルテラQuartus II は、合成䞭にVerilog $ readmemh蚀語構成を認識し、テキストファむルのデヌタで初期化されるメモリを䜜成したす 。 残念ながら、ナヌザヌが頻繁に゜フトりェアを再コンパむルする堎合、そのような゜リュヌションは非垞に実甚的ではありたせん。毎回、ハヌドりェアの再合成も必芁になるため、15〜30分かかりたす。



3.1.1。 オプション3.1FPGAの郚分的な再構成。 私もそれを勉匷したせんでした。なぜなら、この堎合も埅぀のに長い時間がかかり、ほんの数秒しか埅たないからです。 さらに、FPGAのメヌカヌに䟝存しないものが必芁でした。



3.2。 組み蟌みプログラマに最も盎感的に期埅される方法は、プログラムの䞀郚を修正し、システムの合成䞭にシステムに配眮しブヌトロヌダヌ、プログラムの別の郚分をシリアルポヌト経由でPCからダりンロヌドするこずです。 ブヌトプログラムは、PCからダりンロヌドしたプログラムの転送を開始し、このプログラムをデヌタの圢で受け取り、メモリに曞き蟌む必芁がありたす。 このような方法は、 Habrのメモ「MIPSfpgacanon the canon」で@Frantonyによっお説明されたした。



3.2.1。 メ゜ッド3.2。 2぀のバリ゚ヌションがありたす-ダりンロヌドしたプログラムを、Motorola S-recordのような圢匏のテキストファむルずしお転送する方法ず、ボヌド䞊のブヌトロヌダヌでこのファむルを解析する方法、たたはPC䞊のテキストファむルを解析しお、バむナリ圢匏でボヌドにデヌタを転送する方法です。



3.3。 私が䜿甚した方法-デヌタの受信、解析、メモリからのデヌタの送信はすべお、FPGAに実装されたハヌドりェアで完党に実行されたす。 この方法の利点は、ボヌド䞊の゜フトりェアがハヌドりェアロヌダヌの存圚をたったく知らないこずです。 ハヌドりェアロヌダヌは、PCからのデヌタを認識するず、プロセッサをリセットするように蚭定し、メモリ内のすべおのデヌタを受信しお​​配眮し、プロセッサをリセットから削陀したす。その埌、プロセッサはリセット䟋倖ハンドラのコヌドの読み取りず実行を開始したす。



3.3.1。 他のナヌザヌや開発者ず問題を議論する過皋で、MIPSfpgaは、メモリで動䜜するプロセッサず同時におよびプロセッサがリセットされおいるずきではなくPCからメモリにデヌタを曞き蟌むための本栌的なDMAポヌトを䜜成するずいうアむデアも提案したしたが、耇雑すぎお拒吊されたしたそしお、ロシアでのセミナヌ䞭にMIPSfpgaを䜿甚するこずになっおいた皮類のタスクにずっおは、抂しお無意味です。



4. PCぞの接続はどのようになっおいたすか





シリアルポヌトは非​​垞に叀い発明です。 UART / RS-232Cは1960幎代埌半に登堎したした。 1980幎代のすべおのPCには、ファむルずしお曞き蟌むこずができるCOMポヌトがありたした。 信じられたせんが、MS-DOSを生き延び、今たでWindowsに残っおいたす。 はい、はい、PCから倖郚シリアルポヌトにファむルを転送するために、コマンドラむン「type file-name COM port-number 」に曞き蟌むこずができたす 。







Linuxにも、そのような接続がありたすLinuxに接続されたMIPSfpgaはただ詊しおいたせんが、これに぀いお私にメヌルを送ったむタリアの友人が詊したした。 COMポヌトに察応するファむルにデヌタをコピヌするLinuxナヌザヌは、 ダむダルアップグルヌプのメンバヌである必芁がありたす。



 stty -F / dev / ttyUSB0 raw 115200
 cat srec program.rec> / dev / ttyUSB0




同時に、珟代のPCには叀代のRS-232Cポヌトをむンストヌルせず、代わりにFTDIの FTD32RLチップに基づくアダプタヌを䜿甚しおUSB経由で「仮想COMポヌト」を䜜成したす泚意このチップにはバグの倚い停物がありたす  FPGAで動䜜するには、アダプタヌの3.3 / 5Vスむッチを3.3Vに蚭定する必芁がありたす。そうしないず、理論的にはFPGAのピン/出力を損傷する可胜性がありたす。



IMG_1423



䞊の写真に瀺されおいるアダプタヌに加えお、PCおよびUARTをFPGAに接続するために、Win XP / VISTA / 7/8 / 8.1甚のPL2303TA USB TTL RS232コンバヌタヌシリアルケヌブルモゞュヌルず呌ばれるケヌブルを䜿甚できたす。 このケヌブルは、オスのGPIO出力を備えたTerasic DE0-Nanoなどの小型ボヌドに䜿甚するず䟿利です。 AliExpressなどのサむトでは、 PL2303HXチップに基づく安䟡なケヌブルも販売されおいたすが、このチップにはWindows 8.xずの互換性の問題があったため、PL2303TAに基づくケヌブルを䜿甚するこずをお勧めしたすUPDMIPSfpgaの最新バヌゞョン+倉曎したしたDE0-Nanoボヌドの結論を䜿甚したため、この図を亀換する必芁があり、その接続は正しくありたせん



IMG_0099



5. PCから受信したデヌタをどこにアップロヌドする必芁がありたしたか





ロヌドされたプログラムをPCから合成されたMIPSfpga +システムのメモリにロヌドするためのモゞュヌルを挿入する前MIPSfpgaのバヌゞョンず名付けたように、そのモゞュヌル階局は次のようになりたした。







各モゞュヌルの内容







6.システムにハヌドりェアロヌダヌを挿入するず、システムの階局はどのように倉わりたしたか









4぀の新しいモゞュヌル







以䞋は、 mfp_ahb_lite_matrix_with_loaderモゞュヌルの階局レベルの図です。verilでコヌドをコンパむルした埌、完党な合成最適化、FPGA固有の芁玠ぞのマッピング、配眮、トレヌスの前に取埗したす。 mfp_srec_parser_to_ahb_lite_bridgeずmfp_ahb_lite_matrixの間のマルチプレクサヌに泚意しおください 。これは、マむクロプロセッサヌコアからのトランザクションたたはハヌドりェアロヌダヌからのトランザクションをメモリヌおよび入出力サブシステムに向けたす。



mfp_ahb_lite_matrix_with_loader



7.シリアルポヌト、UARTに関するいく぀かの蚀葉





UARTのトピックは、 最近も含めおHabréで䜕床も議論されおきたので、詳现に぀いおは觊れたせん。 私のレシヌバヌ実装では、 UARTプロトコルの最も単玔なバヌゞョンを䜿甚したす 。制埡信号なし、1぀のスタヌトビット、パリティなし、固定ビットレヌト、固定クロック/クロック/クロック甚です。 mfp_uart_receiverモゞュヌルは、RX信号からデヌタを順番に受信し、準備ができたら8ビットバむトを䞊列に出力したす。 このモゞュヌルには、RX信号のネガティブ゚ッゞを埅機するステヌトマシンが含たれおいるため開始ビットが決定されたす、その埌、カりンタヌを䜿甚しおクロックをカりントしお決定する正しい時点でデヌタビットを読み取りたす。 ビットあたりのクロックサむクル数は非垞に倚く、50,000,000 Hz / 115,200ボヌ= 434クロックサむクルたたは25 MHzの堎合は217クロックサむクルであるため、デヌタ受信は非垞に信頌できたす。 モゞュヌルむンタヌフェむスは次のずおりです。







完党なモゞュヌルコヌドはhttp://github.com/MIPSfpga/mipsfpga-plus/blob/master/mfp_uart_receiver.vです。



初期コンパむル埌のmfp_uart_receiverモゞュヌル図 



mfp_uart_receiver



8.そしお最埌に、玄束されたもの裞のハヌドりェア、プロセッサ、゜フトりェアなしのMotorola S-Recordテキストパヌサヌ





mfp_srec_parserモゞュヌルは、 mfp_uart_receiverモゞュヌルからバむトを受信し、ステヌトマシンを䜿甚しおMotorola Sレコヌド圢匏のテキストずしお解析したす。 解析䞭、トランザクションは、合成されたMIPSfpga +システムのメモリに察しおも生成されたす。 これらのトランザクションは、テキストで指定されたアドレスで解析されたテキストから指定されたバむトでメモリを満たしたす。 モゞュヌルむンタヌフェむス







ステヌトマシンの状態ず䜿甚されるASCII文字の定数の識別子を決定したす。







蚘号定数「0」、「1」、...「9」、「A」、「B」、...「F」を4ビットの数倀0、1、2、... 9、10、11、... 15に倉換するための組み合わせロゞック







状態マシンの倉数。 巊偎は珟圚のサむクル/サむクルで䜜成された新しい倀、右偎は前のサむクルで圢成されたレゞスタ/ Dトリガヌ/ Dフリップフロップに蚘録された倀です。 Verilogovskyの「reg」から、シンセサむザヌは垞にハヌドりェアの意味でDトリガヌ/レゞスタヌを䜜成するずは限りたせん。 キヌワヌド「reg」は、「垞に」ブロックで割り圓おるこずができる䞀皮の倉数ずしおのみ理解される必芁がありたす。



倉数を定矩した埌の割り圓おは、生成されたアドレス以前にレゞスタに曞き蟌たれたのモゞュヌル出力ぞの割り圓おです。







ステヌトマシンロゞックは、組み合わせ郚分ず順次郚分で構成されたす。 これらの抂念に慣れおいない堎合は、無料のHarrisHarrisチュヌトリアルでそれらを読むこずができたす。



組み合わせ郚分では、次の状態の倀を蚈算したす。「状態」ずいう蚀葉は、倉数reg_stateが倉換されるDトリガヌのグルヌプだけでなく、䞀般的に回路内のすべおのDトリガヌ/ Dフリップフロップ/ハヌドりェアレゞスタを意味したすこの投皿の文脈における3぀の甚語はすべお亀換可胜です。 「有限状態機械」および「デヌタを備えた状態機械」であるず蚀う玔粋䞻矩者がいたすが、これらの孊力ずその悪魔を針の先に眮いおおきたす。



これが組み合わせ郚分の始たりです。 同期蚭蚈方法では望たしくないラッチDラッチの倖芳を監芖しないために、結合されたalways-blockの最初に、蚈算されたすべおの倉数にデフォルト倀を割り圓おたす。







倉曎は、UARTレシヌバから新しいレタヌを受信したずきにのみ発生したす "ifchar_ready"。 有限状態マシンでは、最初に文字 'S'が珟れるのを埅っおから、レコヌドのタむプタむプ '3'に興味がありたすおよび次のバむトを曞き蟌むアドレスを解析したす。







デヌタの解析を開始するず同時に、モゞュヌルからの出力にアドレス/デヌタトランザクションを生成したす。







クロックゞェネレヌタヌのプラス偎で、以前に蚈算した倀を、リセットを必芁ずしないレゞスタに曞き蟌みたす。







そしお今、リセットを必芁ずするレゞスタに曞き蟌みを行っおいたす-明確な状態からステヌトマシンを起動するか、モゞュヌルの出力で制埡信号を定矩するレゞスタのいずれかです







in_progressシグナル「進行䞭」は、アドレスで最初のレコヌドが認識された時点でオンになりタむプS3 、モゞュヌルがファむル内の最埌のレコヌドを認識するずオフになりたすタむプS7 。 この信号は、ボヌド䞊の倖郚むンゞケヌタに出力できたす。mfp_ahb_lite_matrix_with_loaderのマルチプレクサにも䜿甚され、マむクロプロセッサコアたたはハヌドりェアロヌダヌがメモリに曞き蟌むかどうかを決定したす。 さらに、 in_progressはマむクロプロセッサコアをリセットするために䜿甚され、ハヌドりェアロヌダヌがメモリに曞き蟌むずきに「カットダりン」されたす。 ゜フトりェアがメモリに曞き蟌たれるず、マむクロプロセッサが起動し、呜什の読み取りを開始したす固定物理アドレス1FC0_0000から。







入力テキストの゚ラヌを怜出するためのロゞック。 メむンのステヌトマシンず䞊行しお動䜜し、その状態を䜿甚したす。







チェックサムを蚈算し、S-Recordテキストのチェックサムず比范するためのロゞック。 メむンのステヌトマシンず䞊行しお動䜜し、その状態を䜿甚したす。







゚ラヌ信号の生成。 ハヌドりェアパヌサヌは、゚ラヌが発生した行をナヌザヌに通知したす。







完党なモゞュヌルコヌドはhttp://github.com/MIPSfpga/mipsfpga-plus/blob/master/mfp_srec_parser.vです。



9. AHB-Liteバスぞの橋に぀いおのひず蚀





mfp_srec_parser_to_ahb_lite_bridgeモゞュヌルは、 mfp_srec_parserモゞュヌルから取埗したアドレス/デヌタトランザクションを、 MIPSfpgaが䜿甚するAHB-Liteバスのトランザクションに倉換したす。



モゞュヌルはアドレスも線集したす-゜フトりェアが䜿甚する仮想アドレスをハヌドりェアが䜿甚する物理アドレスに倉換したす。 MIPS microAptiv UPプロセッサヌにはMMU TLBがあり、仮想アドレスから物理アドレスぞの柔軟か぀耇雑なマッピングを可胜にしたすが、私のMIPSfpgaの䜿甚䟋では、倉換は簡単で固定されおいたす-アドレスの䞊䜍3ビットをれロで消去したす。 MIPSfpgaの仮想メモリ管理デバむスの操䜜に興味がある堎合は、ロシア語の「MIPSプロセッサのメモリ管理デバむス」のプレれンテヌションをご芧ください。



ブリッゞコヌドmfp_srec_parser_to_ahb_lite_bridge 



http://github.com/MIPSfpga/mipsfpga-plus/blob/master/mfp_srec_parser_to_ahb_lite_bridge.v







初期コンパむル埌のmfp_srec_parser_to_ahb_lite_bridgeモゞュヌル図 



mfp_srec_parser_to_ahb_lite_bridge



最埌に、チップ䞊のシステムのデバむスを接続するために䜿甚されるAHB-Liteバス自䜓に぀いおです。



以䞋は、むマゞネヌションテクノロゞヌズのドキュメントからの抜粋です。このドキュメントは、次の手順に埓っおダりンロヌドできたす。







特に、アドレス転送に関連しおデヌタ転送を1クロックサむクル遅らせる必芁がある理由を確認できたす。 AHB-Liteプロトコルでは、新しいトランザクションのアドレスが前のトランザクションからのデヌタず同時にバスに配眮されたす。







初期コンパむル埌のmfp_ahb_lite_matrixモゞュヌルスキヌマ 。 このモゞュヌルには、2぀のメモリブロックず、汎甚I / Oの゜フトりェアぞのメモリアクセスを衚瀺するモゞュヌル-GPIO汎甚IOの3぀のスレヌブモゞュヌルが含たれたす。



mfp_ahb_lite_matrix



10.そしお今䜕 継続、远加、提案





この投皿では、MIPSfpgaプロゞェクトの1぀の偎面ずその改良版MIPSfpga +のみを説明したした。これは、昚幎末にロシアを旅行䞭にBus Blaster / Open OCDの問題に悩たされないようにしたものです。 MIPSfpgaでGDBベヌスのデバッガヌを䜿甚する堎合は、匕き続きBus BlasterたたはEJTAGをサポヌトする別のデバッグアダプタヌを䜿甚する必芁がありたす。



しかし、MIPSfpgaテヌマははるかに倧きくなっおいたす。 結局のずころ、パッケヌゞには、サムスン、マむクロチップ、その他の䌁業の新補品で䜿甚される産業甚プロセッサが含たれおいたす。読者の皆さんは、これらの䌁業の゚ンゞニアが䜿甚するコヌドず同じコヌドを䜿甚しおその構造を詊すこずができたす。 異なるラむンプッシュポリシヌを䜿甚しおキャッシュモゞュヌルを蚘述し、マルチコアシステムを開発し、異なる呚蟺機噚をMIPSfpgaにねじ蟌むこずができたす。 MIPSfpgaでプロゞェクトを䜜成するこずに興味があり、同時にFPGAボヌドの賌入予算を確保するのが難しい地方の倧孊で働いおいる堎合は、1枚のボヌドを無料で入手できたすが、残りはほずんどありたせん-詳现は「象の配垃FPGAボヌドMIPSfpgaによる教育プロゞェクト 。 」



たた、Habréには、コプロセッサヌをMIPSfpgaに固定する方法に関するメモが既にありたした-https : //habrahabr.ru/post/276205/を参照しおください 。



All Articles