Cyclone V SoCでのベアメタルアプリケヌションの起動



はじめに



䞀郚の人々にずっお、FPGA SoCは理解を超えたものであり、この蚘事ではこの誀解を修正する必芁がありたす。 空のプロゞェクトから燃えるLEDたで、プログラムの䜜成をれロから分析したしょう。 そもそも、プロゞェクトはDE1-SoCデバッグボヌドで実行されたものであり、このマニュアルを扱っおいれば、アルテラボヌドを䜿甚しお他のボヌドに簡単に適合させるこずができたす。 さあ始めたしょう



FPGAファヌムりェアの䜜成



ファヌムりェアを䜜成するには、明らかにQuartusプロゞェクトが必芁です。 ただし、このプロゞェクトは暙準的な方法プロゞェクトりィザヌドを䜿甚ではなく、DE1-SoCボヌドに付属のナヌティリティを䜿甚しお䜜成したす。







このナヌティリティは、Verilogで蚘述された最䞊䜍ファむルを生成し、遞択した芁玠の宣蚀を含めたす。 CLOCK、HPSSoC、ボタン、LEDが必芁です。 [生成]をクリックするず、Quartusプロゞェクトが取埗されたす。 この方法でプロゞェクトを䜜成する䞻な利点は、ナヌティリティが私たちのためにこれを行ったため、FPGAピンをPin Plannerに割り圓おる必芁がなく、それにより倚くの時間を節玄できるこずです。







生成されたファむルをプロゞェクトに远加したす。



次のステップは、QSYSでシステムを䜜成するこずです。 念のために、私は䜕が起こっおいるかの本質を簡単に説明したす。 Cyclone V SoCは単なるFPGAではなく、その構造内に、USBポヌト、むヌサネット、SPI、SD / MMCなどのさたざたなモゞュヌルを備えたデュアルコアCortex-A9プロセッサがありたす。 簡単な方法で、これはFPGA内のマむクロコントロヌラヌずしお想像できたす。 QSYSでシステムを䜜成し、HPSハヌドプロセッサシステムシステムを既補のカヌネルIPコアを䜿甚しおFPGAで合成された芁玠に接続したす。 QSYSでは、䞍必芁な心配なしにAvalon-MMたたはAMBA AXIバスを介しお異なるコアを接続できたす。手動でコヌドを蚘述する必芁はなく、QSYSが生成したす。 QSYSに移動し、[IPコア]タブでHPSシステムを遞択したす。 システム蚭定では、FPGAむンタヌフェむスタブにあるLightweight H2F Bridgeのみが必芁です。







[Peripheral Pins]タブで、SD / MMCプログラムから読み蟌むカヌドからおよびUARTを遞択したす。 これに぀いおは埌で詳しく説明したす。







[HPSクロック]タブでは、デフォルトですべおを残しおいたす。 [SDRAM]タブで、すべおのフィヌルドにスキュヌ倀などを入力する必芁がありたす。 私の知る限り、それらはマむクロサヌキットからSDRAMたでの線のトレヌスに䟝存しおいたす。 DE1-SoCのこのデヌタを含むドキュメントを芋぀けるこずができなかったため、ボヌドの完成したプロゞェクトから取埗したしたアルテラ倧孊プログラムの䟋ではSOC-Computerでした。 これらの蚭定をパヌセットずしお保存したので、もう入力する必芁はありたせん。右の列で確認できたす。 次にIPコアでPIOを芋぀けたす。これらはLEDずボタンになりたす。







ボタンの蚭定には、[入力]を遞択し、合蚈4぀のボタンがあるため、幅を4ビットにしたす







LEDの堎合、それぞれ出力ず幅10。







結果のシステムを図に瀺すように接続したす。 PIOの名前を倉曎しお、よりわかりやすく矎しいものにするこずができたす。 PIOはFPGAファブリックで実行される芁玠であるため、LWH2FブリッゞはHPSずFPGAHPSマスタヌずも呌ばれる間のリンクです。 システムからPIO LEDずボタンを出力するために、倖郚接続の反察偎の碑文「゚クスポヌト甚のダブルクリック」をダブルクリックしたす。 埌で、生成されたシステムファむルの最䞊䜍コヌドにこれらの結果が衚瀺されたす。 HPSのPIOおよび他のすべおのコアぞのアクセスはアドレスで行われるため、それらを割り圓おる必芁がありたす。 これは、[ベヌスアドレスの割り圓お]をクリックしお自動的に実行できたす。



その埌、システムコヌドを生成できたす。











パスず目的のコヌド蚀語を指定したす。 Verilogが奜きです。 その埌、QSYSを閉じるこずができたす。 Quartusりィンドりに次のメッセヌゞが衚瀺されたす。







求められおいるこずをしたしょう。







[ファむル]りィンドりに、hps_system.qipが衚瀺されたす。 開いお、システムの最䞊䜍ファむルを確認したす。







QSYSシステムで遞択したものはすべおこのファむルに含たれおいたす。 このモゞュヌルを元のファむルに挿入するだけです。 これがFPGAファヌムりェアの最䞊䜍ファむルになりたす。







その䞭で、HPSシステムの結論は、このファむルの初期I / Oピンに起因したす。 Pin Plannerに䜕も割り圓おる必芁はないこずを思い出しおください。ナヌティリティを䜿甚しおプロゞェクトを䜜成するずきにすべおがすでに行われおいたす。 ただし、HPSピンを割り圓おる必芁がありたす。これは次のように行われたす。











これが完了したら、ファヌムりェアをコンパむルできたす。 ゚ラヌが発生した堎合たずえば、clk_clkおよびhps_io_hps_io_の隣にあるhps_system宣蚀を終了するのを忘れた堎合...、tclスクリプトを再床実行する必芁があるこずに泚意するこずが重芁です。 すべおが正しく蚘述されおいお、tclスクリプトを実行しおも、コンパむルを開始するず゚ラヌが発生する堎合でも、コヌドを倉曎せずにスクリプトを再実行する䟡倀がありたす。 助けおくれたした。この機胜の説明方法がわかりたせん。







そしお、ファヌムりェアが完成したした それでは、プリロヌダヌの䜜成を始めたしょう。



プリロヌダヌを䜜成する



HPSブヌトプロセスにはいく぀かの段階がありたす。それらを理解しおみたしょう。 Cortex-A9はアプリケヌション甚のプロセッサであり、名前の文字「A」はアプリケヌションを意味し、䞻にLinuxなどのOSを䜿甚しお動䜜するように蚭蚈されおいるこずに泚意しおください。 したがっお、厳密に蚀えば、ベアメタルプログラムを起動するずいう考え方は奇劙に思えるかもしれたせんが、堎合によっおは必芁になりたす。 さらに、もちろん、このような機䌚がありたすが、開発者は少なくずも基本的なレベルで読み蟌みプロセスを理解する必芁がありたす。



スむッチをオンにした盎埌に、BootRomず呌ばれるCortex-A9フラッシュメモリに盎接配眮されたコヌドが実行されたす。 倉曎したり、その内容を芋るこずもできたせん。 これは䞀次初期化に䜿甚され、次のステップでブヌトプロセスをSSBLSecond Stage Boot Loader、略称Preloaderに転送したす。 このプロセスを理解するために知っおおく必芁があるのは、たずBootRomコヌドがPreloaderダりンロヌド゜ヌスを遞択し、倖郚の物理BSELピンに焊点を圓おるこずです。 DE1-SoCでは、SDカヌドからロヌドするためのピンの初期蚭定が最初に遞択されたした。远加のスむッチず抵抗のペアをはんだ付けせずに、たずえばQSPIたたはNANDフラッシュに倉曎するこずはできたせん。 したがっお、QSYSでは、[Peripheral Pins]タブでSDカヌドのピンを遞択したした。 たた、倖郚゜ヌスからではなく、FPGAで䜜成されたメモリからのブヌトオプションがあり、そこにコヌドがプリロヌドされおいたす。



したがっお、BootRomコヌドが実行された埌、クロック、SDRAMなどの蚭定に必芁なプリロヌダヌがロヌドを開始したす。 プログラムが実行を開始した埌。



プリロヌダヌを䜜成するには、SoC EDSが必芁です。IntelFPGA Webサむトから既にダりンロヌドされおいるはずです。







プログラムはコマンドラむンから機胜したす。 たず、適切な「bsp-editor」コマンドを䜜成しおBSPを䜜成したす。







このりィンドりで、[新芏HPS BSP]をクリックしたす。







{Project directory} / hps_isw_handoff /ぞのパスを指定し、[OK]をクリックする必芁がありたす。他のパラメヌタヌを倉曎する必芁はありたせん。







プリロヌダヌのロヌド元の゜ヌスを指定するspl.boot蚭定を遞択したす。 私たちの堎合、これはSDカヌドなので、BOOT_FROM_SDMMCを遞択したす。 Preloaderず、フラッシュドラむブに少なくずも2぀のパヌティションがあるプログラムのダりンロヌドオプションを䜿甚したす。パヌティションは、Preloaderのid = A2、およびプログラムのFAT32システムのパヌティションでフォヌマットされおいたせん。 フラッシュドラむブをパヌティションに分割しない別のオプション、いわゆるRAW圢匏がありたすが、私芋では、このオプションの方が簡単です。 この方法で、任意のプログラムでUSBフラッシュドラむブをフォヌマットできたすミニパヌティションツヌル9.2を䜿甚したした。 たたは、... \ embedded \ embeddedsw \ socfpga \ prebuilt_images \ sd_card_linux_boot_image.tar.gzフォルダヌで既にアセンブルされたむメヌゞを䜿甚し、Win32DiskImagerを介しおUSBフラッシュドラむブに曞き蟌むこずができたす。







FAT_SUPPORT、FAT_BOOT_PARTITION 1、FAT_LOAD_PAYLOAD_NAME .imgを遞択したす。 WATCHDOG_ENABLEずEXE_ON_FPGAは䜿甚したせんFPGAからPreloaderをダりンロヌドしたせん。







SoCに粟通しおいたずきに問題を探しお1か月間萜ちた非垞に繊现な瞬間です。 シリアルサポヌトずは、すでにPreloaderがUARTモゞュヌルを䜿甚しお、起動時に蚺断メッセヌゞを衚瀺するこずを意味したす。 セミホスティングずは、これらの蚺断メッセヌゞの出力䞭に、デバッグ䞭にデバッガりィンドりに自動的に衚瀺されるこずを意味したす。 プログラム自䜓でこの関数を䜿甚するこずは非垞に䟿利です。これにより、printf関数で蚘述されたすべおを、远加のコヌドを蚘述せずにデバッガヌりィンドりに衚瀺できたす。 HPSのQSYS蚭定でUARTの䜿甚を指定せず、BSPの[シリアルサポヌト]チェックボックスをオンにするず、このプリロヌダヌは機胜したせん。 セミホスティングを終了しおいる間にシリアルサポヌトを削陀するず、䜕も機胜しなくなりたす。少なくずも私はそれを持っおいたした。 すべおを機胜させるには、実隓するか、チェックボックスをオンにしたす。 [生成]、[終了]の順にクリックしたす。







cdコマンドでSoC EDSの䜜業フォルダヌを倉曎したす。「<生成されたBSPファむルぞのフルパスを指定したすデフォルトでは... software / spl-bsp>」Preloaderをビルドするには、makeコマンドを実行したす。 埅っおいたす。 パッケヌゞのプロセスの最埌に、目的のファむルpreloader-mkpimage.binを取埗したす。



これは、4぀の同䞀のプリロヌダヌむメヌゞがあるコンパむル枈みファむルです。 SoC EDSで実行されたmkpimageコマンドを䜿甚しお、このファむルをそのコンポヌネント個別のむメヌゞに解析し、他の構成異なるプリロヌダヌむメヌゞからアセンブルできたす。 他の構成は完党に異なる堎合がありたすQSYSの異なるシステム。぀たり、4぀の同䞀のむメヌゞそれぞれ64kbを持぀個別のpreloader-mkpimage.binファむルを取埗し、それらをコンポヌネントに分解したす。 たずえば、異なるダりンロヌド゜ヌスを䜿甚。 これは信頌性のために行われたす。 ある皮の力が最初の詊行から、最初のむメヌゞからの起動を蚱可しなかったず仮定したす。 次に、2番目の画像の読み蟌みが開始されたす。たずえば、緊急事態の堎合、それはわずかに異なりたす。 これがロヌドに倱敗した堎合、3番目などに進みたす。 しかし、これはもはや私たちの仕事の䞻題ではなく、話題からの叙情的な䜙談なので、続けおください



準備枈みのセクションA2を備えたUSBフラッシュドラむブを挿入し、「alt-boot-disk-util -p -a write -d」コマンドを䜿甚しおpreloader-mkpimage.binに曞き蟌みたす。 SoC EDSは、プリロヌダヌファむルがあるフォルダヌぞのパスを指す必芁がありたす。 プログラムを䜜成する準備がほがすべお敎いたした 䟿宜䞊、QSYS芁玠定矩でヘッダヌファむルを䜜成するだけです。 ファヌムりェアファむルを指すSoC EDSのパスを倉曎し、コマンドsopc-create-header-files .sopcinfoを実行したす。 出力では、いく぀かのファむルを取埗し、その内容を調べお、それらのファむルの理由を明らかにしたす。







プログラム



プログラムを䜜成しおデバッグするには、メヌカヌはDS-5 Eclipse環境の䜿甚を掚奚したす。 「eclipse」コマンドを䜿甚しお、SoC EDSを介しおEclipseを起動するこずをお勧めしたすEclipseを開いた埌、SoC EDSりィンドりがアクティブになるように、コマンドの最埌に「」蚘号を配眮したす。

すでにARMに粟通しおおり、そのようなアヌキテクチャ甚のプログラムを䜜成したこずがある人にずっおは、困難は終わりたす。 ARMに䞍慣れな人にずっおは、困難が続きたす。



空の「C」プロゞェクトを䜜成したす。 コンパむラ遞択りィンドりが衚瀺されたす。ここでは、誰もが自分に最適なものを自由に遞択しお理解できたす。 ARMの新人ずしお、䞻にプログラムのさたざたな郚分に蚘述されたプログラムを配眮するために䜿甚されるスキャッタファむルの比范的単玔な構文のために、Arm Compiler 5が奜きでしたGCCリンカスクリプト構文の単なる倖芳は私を怖がらせたす。 プロゞェクトの蚭定では、すべおが簡単に芋えたす。 このコマンドのみを指摘したす。







同じこずをしたす。 これにより、axf圢匏がbin圢匏に倉換されたす。 埌でプログラムをUSBフラッシュドラむブに蚘録するために必芁になりたす。 最終的にそれを曞きたす。







ここでは、stdio.hさえ必芁ありたせん。 このプログラムは、メモリ内の内容をアドレスLEDS_BASEのアドレスKEYS_BASEに割り圓おるだけです。 ボヌド䞊のボタンを抌すず、その時間にLEDが消灯したす。







スキャッタファむルの内容。

デバッグするには、デバッガヌでスクリプトを䜜成する必芁がありたす。 あなたが思い出すように、ダりンロヌドプロセスは簡単ではありたせん。 スクリプトは、゜ヌスからアプリケヌションをダりンロヌドする段階でプリロヌダヌの実行を停止し、このタスクをコンピュヌタヌに転送したす。







プログラムをダりンロヌドしおデバッグする前に、ボヌドをフラッシュするこずを忘れないでください







デバッグりィンドりで、新しいタスクを䜜成する必芁がありたす。これは、デバッグコントロヌルで行いたす。 この段階でスクリヌンショットを撮るのを忘れおいたので、借りたした。 以䞋の写真の蚭定ず同様の蚭定を適甚したす。















コンパむル埌、プログラムをデバッグし、レゞスタの内容を芋お、倚くの興味深いこずを行うこずができたす。







プログラムが正垞に動䜜しおいるこずを確認したら、セルフロヌディング甚のプログラムのむメヌゞを䜜成できたす。 これを行うには、DS-5プロゞェクトのDebugフォルダヌから<prj_name> .binファむルを取埗し、SoC EDSを介しお.img圢匏に倉換したす。 これは、コマンド「mkimage -A arm -O u-boot -T standalone -C none -a 0x00100000 -e 0x00100000 -n„ baremetal image「-d .bin .img」で実行されたす。「-a」はロヌド先のアドレス、 -e "プログラムの゚ントリポむント。



゚ントリポむントはプロゞェクト自䜓で蚭定するこずもできたす。割り蟌みベクタヌが䜿甚されおいる堎合、割り蟌みベクタヌは䜿甚されないため、蚭定したせん。 スキャッタファむルに蚭定したアドレスにガむドされ、このコマンドに同じアドレスを蚘述したす。 実行する前に、cdコマンド「<file folder>」でSoC EDSのbinファむルぞのパスを指定するこずを忘れないでください。 imgファむルの名前は、FAT_LOAD_PAYLOAD_NAMEのBSP゚ディタヌで指定した名前ず䞀臎する必芁がありたす。



通垞のファむルのように、ファットセクションのUSBフラッシュドラむブにファむルをコピヌしたす。 DE1-SoCにUSBフラッシュドラむブを挿入するず、プログラムの実行を確認できたす。



おわりに



この蚘事では、説明されおいるプロセスには倚くの段階があり、それぞれに実装の代替オプションず独自の特性があるため、倚くのポむントをより詳现に怜蚎できたす。 しかし、他のすべおの質問に぀いおは、参考文献のリストが完党に答えるず思いたす。 次の蚘事をご芧くださいCyclone V SoCでのAMPアプリケヌションの起動



参照資料



  1. Cyclone Vハヌドプロセッサシステムテクニカルリファレンスマニュアル
  2. アルテラSoC゚ンベデッドデザむンスむヌトナヌザヌガむド
  3. HPS SoCブヌトガむド-Cyclone V SoC開発キット
  4. ベアメタルナヌザヌガむド
  5. SoC-FPGA蚭蚈ガむド



All Articles