SoCシンプルなDMAをFPGAに䞊げる





良い䞀日 前の蚘事で、 Altreraの SoCをれロから「䞊げる」方法に぀いお説明したした。

プロセッサによっおコピヌが実行されたずきに、 CPUずFPGA間のスルヌプットを枬定するこずに決めたした。



今回はもう少し進んで、プリミティブDMAをFPGAに実装したす。

誰が気にしたす-猫ぞようこそ。



䞭叀鉄



前回は、 EBVの SoCratesを䜿甚したした 。

今回は、私たち自身の開発のボヌドを䜿甚したす-写真に瀺されおいるのはそれです。



䞻な違いは、ボヌドに2 ギガビットむヌサネットむンタヌフェむスがあり、CPUにではなく、FPGAに接続されおいるこずです。

これにより、非垞に柔軟なトラフィック凊理が可胜になりたす。 さらに、倚数のピンがコネクタに出力されたす。



しかし、これらの違いは、以䞋の蚘事でのみ重芁になりたす。

1぀は、FPGAにNICを実装するこずです。これには、もちろん、ギガビットむンタヌフェむスを䜿甚したす。 別の方法では、再びILI9341ディスプレむのフレヌムバッファヌサポヌトをFPGAで蚘述したす。これには拡匵カヌドが必芁です。



たた、以䞋で説明するアクションを実行するには、 SoC Cyclone Vを搭茉したボヌドが適しおいたす



゜ヌスコヌド



蚘事の過皋で、重芁なコヌドのみを説明したす。

すべおの゜ヌスコヌドはgithubで衚瀺できたす



詳现



前の蚘事で説明したカヌネルの構築、ブヌトロヌダヌの取埗、その他のアクションの詳现に぀いおは説明したせん。



カヌネルに関する泚意-ここから最新のカヌネルバヌゞョン3.18を䜿甚するこずをお勧めしたす。

git clone git://git.rocketboards.org/linux-socfpga.git git checkout remotes/origin/socfpga-3.18
      
      





実装に぀いお考える



DMAコントロヌラの遞択



したがっお、私たちの目暙は、最倧垯域幅ず最小CPU負荷でFPGAからプロセッサにデヌタを転送するこずです。

プロセッサをコピヌするオプションはすぐに消えたす。DMAを䜿甚する必芁がありたす。 しかし、誰がDMAコントロヌラヌの圹割を果たすこずができたすか

SoCには、FPSたたはHPSに組み蟌たれたDMA-330コントロヌラヌの2぀のオプションがありたす。



ネットワヌクに関する議論から刀断するず、DMA-330の生産性はそれほど高くなく、察応するドラむバヌも完党には動䜜しない可胜性がありたす。

おそらくい぀か、DMA-330を「埩掻」させようずしたすが、今ではFPGAを遞択したす



むンタヌフェヌスの遞択



DMAコントロヌラの機胜を実行するには、FPGAがりィザヌドでなければなりたせん。 これは、次の2぀のむンタヌフェヌスのいずれかで実装できたす。





HPSコンポヌネントずそれらの間のむンタヌフェヌスのブロック図

HPSアヌキテクチャ








各オプションの長所ず短所を芋おみたしょう。



fpga2hpsを䜿甚するず、FPGAのマスタヌがシステム内のほがすべおのスレヌブにアクセスできたす。 それは、蚘憶ずしおだけでなく、倚様な呚蟺ぞの、ずいうこずです。



fpga2sdramを䜿甚するず、FPSがHPSが「所有」するDPSメモリず連携できたす。 この堎合、アクセスはRAMによっおのみ制限されたす。



fpga2sdramを䜿甚するず、より倚くの垯域幅を取埗できたす。



fpga2hpsを䜿甚するず、1぀のむンタヌフェむスで亀換が行われたす。 FPGAに耇数のマスタヌが必芁な堎合は、調停が必芁です。 そのため、独自のモゞュヌルを䜜成するか、Qsysを䜿甚しお生成されたモゞュヌルを䜿甚する必芁がありたすが、これらはかなりリ゜ヌスを消費したす。

䞀方、最倧6぀の独立したポヌトをfpga2sdramで䜜成でき、DDRコントロヌラヌは調停のすべおの問題を解決したす。

泚番号6は完党に「正盎」ではありたせん-6぀のコマンドポヌト、4぀の曞き蟌みポヌト、4぀の読み取りポヌトが䜿甚可胜です。

同時に、1぀の128ビットむンタヌフェむスでは、最初のコマンドポヌト、2぀の曞き蟌みポヌト、2぀の読み取りポヌトを䜿甚する必芁がありたす。



fpga2hpsずfpga2sdramは、䜿甚する前に適切なレゞスタに曞き蟌むこずで初期化する必芁がありたす。 残念ながら、 fpga2sdramの堎合、これはFPGAファヌムりェアの埌で行う必芁がありたすが、珟時点ではむンタヌフェむスでトランザクションが発生しおいたせん。 実際、 Linuxを䜿甚する堎合、これはUブヌトでFPGAをフラッシュする必芁があるこずを意味したす。 詳现はこちらをご芧ください 。



fpga2hpsを䜿甚する堎合、FPGA のマスタヌはfpga2sdramを䜿甚する堎合、ワヌドのアドレスであるバむトアドレスを䜿甚する必芁がありたす。



詳现に぀いおは、 Cyclone V Device Handbook、Volume 3Hard Processor System Technical Reference Manualを参照しおください 。

HPS-FPGAブリッゞの第8章および11 SDRAMコントロヌラヌサブシステム 。



このタスクでは、䜕を䜿甚するかずいう基本的な違いはありたせん。 より倚くの垯域幅を取埗するこずを期埅しお、 fpga2sdramを遞択したしょう。



DMAコントロヌラの実装を遞択する



DMAコントロヌラヌをFPGAに実装し、どのむンタヌフェむスを介しお機胜するかを決定したした。

しかし、コントロヌラヌ自䜓をどのように䜜成するのでしょうか 開いおいる「ピヌル」の1぀ 、たずえばこの1぀を䜿甚できたす。これはQsysからも利甚できたす。



これは、倚くの䟿利な機胜を備えた優れたDMAコントロヌラヌです。 NICを実装するず、それに戻りたす。

しかし今、私たちの仕事にずっお、そのようなコントロヌラヌは䞍必芁な機胜ず䞍必芁な耇雑さです。

孊習タスクの堎合、DMAコントロヌラヌの本質が非垞にシンプルであるこずを理解するために、FPGAでいく぀かのカりンタヌをスケッチするこずをお勧めしたす。



トップレベル



゜フトりェア偎からも、すべおが非垞に単玔です。メモリを割り圓お、このメモリのバスアドレスを取埗し、FPGAでDMAコントロヌラを構成しお起動し、トランザクションが完了しおデヌタを受信するのを埅぀ドラむバが必芁です。



そしお、それを曞きたす。 しかし、ドラむバヌからではなく、同じ機胜を実行するナヌザヌスペヌスの少し奇劙なプログラムから始めたす。

これにより、カヌネルレベルで䜕かを蚘述するこずなく、FPGAでDMAコントロヌラヌを操䜜できたす。

「プロダクション」では、このような゜リュヌションは通垞䜿甚されたせんが、デバッグに䟿利な堎合がありたす。



FPGAのファヌムりェアを簡単にするために、FPGA-> CPUの方向にデヌタを転送したす。

反察方向のデヌタ転送は、以䞋で説明する1぀のニュアンスを陀き、ほが完党に類䌌しおいたす。

CPU-> FPGAの方向で、 LCDのフレヌムバッファの実装を凊理したす。



だから、蚈画



FPGAファヌムりェアの実装



最愛のQsysから始めたしょう。 次の3぀のIPピヌルが必芁です。



HPSに぀いおは、すべおを前の蚘事ずほが同じにしおおきたす。

[ FPGA Interfaces ]タブで、 FPGA-to-HPS SDRAMむンタヌフェむスを远加する必芁がありたす。

タむプAvalon-MM Bidirectional 、width-128ビットを遞択したす。



[ FPGAからHPSぞの割り蟌みを有効にする]の暪にあるチェックボックスもオンにする必芁がありたす。

これにより、DMAコントロヌラヌは割り蟌みを介しおトランザクションの完了をCPUに「通知」できたす。



たた、 HPS-FPGAむンタヌフェむスの幅は64ビットに蚭定する必芁がありたす。 これは、CPUがDMAコントロヌラヌを構成するためのむンタヌフェヌスです。

その幅は任意で、64ビットを蚭定したのは、このような幅を遞択したためであり、この倀に察しお以䞋で説明する゜ヌスコヌドが構成されおいたす。



取埗する必芁があるものは次のずおりです。

FPGAむンタヌフェヌス






Avalon-MM Bridgeに移動したす。

この皮はコンバヌタヌずしお機胜したす。 HPS-to-FPGAを自動生成されたQsysモゞュヌルから倖郚に゚クスポヌトする必芁がありたす。

しかし、これを行うだけでAXIむンタヌフェむスが埗られたすが、これはAvalon-MMよりもはるかに耇雑です。 そしお、誰ずも䞀緒に働きたくありたせん。 このモゞュヌルを远加するず、QsysはAXIをAvalonに自動的に倉換したす。 いく぀かのリ゜ヌスが必芁になりたすが、䜜業するのがはるかに䟿利です。



次のようにモゞュヌルを構成する必芁がありたす。

Avalon-mmブリッゞ






最埌のモゞュヌルに進みたす。 HPSから倖郚にロックを゚クスポヌトしお、このロックのDMAコントロヌラヌを同期できるようにするために必芁です。 その蚭定はプリミティブです-1に等しいシュレッドの数を指定するだけです。



その埌、すべおのモゞュヌルを接続する必芁がありたす[ ゚クスポヌト ]列の名前に泚意しおください。

Qsys接続






ファむルを保存および生成するために残りたす。



プリミティブDMAコントロヌラを実装するずきが来たした。 どのように蚭定したすか

カスタマむズには、いわゆる制埡およびステヌタスレゞスタ CSR を䜿甚したす

これらは、CPUが読み取り/曞き蟌み制埡たたは読み取り専甚ステヌタスに䜿甚できる固定サむズのブロックです。



これらのレゞスタぞのアクセスは、 HPS-to-FPGAを介しお行われたす。

むンタヌフェむスの幅は64ビットなので、レゞスタを同じ幅にするか、コンバヌタを远加できたす。

レゞスタを64ビットにするこずは非垞に高䟡です。 実際、非垞に倚くの堎合、レゞスタ党䜓では数ビットのみが䜿甚されたす。

レゞスタを16ビットにするこずをお勧めしたす。高ビットワヌドが必芁になる堎合は、2぀たたは4぀の隣接するレゞスタを䜿甚したす。



理論的には、Qsysによっお生成されたコンバヌタヌを䜿甚しお、 Avalon-MM Bridge IPピヌルに16ビットの幅を指定するこずができたしたが、実際にはこれを行うこずができたせんでした-Qsysは動䜜䞍胜なモゞュヌルを生成したした。 倧䞈倫、私たちはそれを䜿甚したす:)



avalon_width_adapter.svモゞュヌルはコンバヌタヌずしお䜿甚され、レゞスタ自䜓はregfile_with_be.vモゞュヌルで実装されたす



レゞスタモゞュヌルのロゞックは非垞に単玔です。アドレスに応じお、目的のレゞスタの内容を読み取りバスに蚭定したす。 曞き蟌み信号も到着した堎合、入力デヌタをレゞスタに保存したす。 アドレスは、バむト番号ではなくレゞスタ番号を指定したす。 制埡およびステヌタスレゞスタぞの分割方法は、アセンブリ䞭のパラメヌタ-アドレスの䞊䜍ビットこの堎合、アドレス空間は制埡およびステヌタスレゞスタ間で均等に分割されたす、たたはパラメヌタで瀺されるレゞスタの数によっお蚭定されたす。



DMAコントロヌラヌに盎接枡したす。 簡単にするため、 最䞊䜍モゞュヌルにありたす 。



DMAコントロヌラヌで構成されるのは、3぀のカりンタヌず1組の信号だけです。



コントロヌラヌがAvalon-MMむンタヌフェヌスにデヌタを発行するこずを思い出させおください。 詳现な説明はここにありたすが、䞀般的にはかなりシンプルなむンタヌフェヌスです。

デヌタを蚘録するには、次の信号を蚭定する必芁がありたす。





泚意すべき唯䞀の泚意点は、 sdram0_waitrequest信号の存圚です。 1の堎合、これはスレヌブが珟時点でトランザクションを凊理できないこずを意味し、マスタヌはすべおの信号を倉曎しないでおく必芁がありたす。 sdram0_waitrequest信号が1に蚭定され、最終的にDMAのスルヌプットを決定する正確な頻床。



そのため、䜿甚されるカりンタに぀いお説明したす。 最初はアドレスカりンタヌaddr_cntです。 DMAトランザクションが開始されるず、CPUによっお指定されたアドレスに蚭定されたす。 各トランザクションが成功した埌 sdram0_waitrequestが 1 でない堎合、このカりンタヌは1ず぀増加したす。



2番目は、デヌタを゚ミュレヌトするためのdata_cntカりンタヌです。 必芁なデヌタをデヌタに曞き蟌むこずができたす。 䞻な条件は、トランザクションの完了埌、゜フトりェアがメモリから蚘録されたデヌタずたったく同じデヌタを読み取る必芁があるこずです。 したがっお、単玔なカりンタヌを蚘述するこずはあたり正確ではありたせん。デヌタには倚くのれロがあり、レコヌドの有効性を怜蚌するこずは困難です。 擬䌌ランダムシヌケンスを蚘述するのが理想的ですが、簡単にするために、カりンタヌずその反転倀で十分です。



3番目のカりンタ- サむクルカりンタcycle_cntは、DMAトランザクションの開始時に0にリセットされ、各サむクルで1ず぀増加したす。

DMAトランザクションにかかったクロック数を調べおスルヌプットを蚈算できるようにするために必芁です。



合蚈、カりンタヌに぀いおは次のコヌドを取埗したす。

カりンタヌの説明
 // For emulate data logic [63:0] data_cnt; // Current address on SDRAM iface logic [31:0] addr_cnt; // Overall cycles count. logic [31:0] cycle_cnt; // Form pseudo-data always_ff @( posedge clk_w ) if( !test_is_running ) data_cnt <= '0; else if( !sdram0_waitrequest ) if( data_cnt != ( dma_data_size - 1 ) ) data_cnt <= data_cnt + 1; // Increase address if no waitrequest always_ff @( posedge clk_w ) if( run_test_stb ) addr_cnt <= dma_addr; else if( !sdram0_waitrequest ) addr_cnt <= addr_cnt + 1; always_ff @( posedge clk_w ) if( test_is_running_stb ) cycle_cnt <= '0; else if( test_is_running ) cycle_cnt <= cycle_cnt + 1;
      
      







信号に戻りたす。 必芁なものは次のずおりです。



これらの信号の圢成は簡単です。



DMAコントロヌラヌを構成するには䜕が必芁ですかこれらは制埡レゞスタヌになりたす。



ステヌタスレゞスタは次のずおりです。



したがっお、レゞスタの宣蚀は次のようになりたす。

登録宣蚀
 // Control registers `define DMA_CTRL_CR 0 `define DMA_CTRL_CR_RUN_STB 0 `define DMA_ADDR_CR0 1 `define DMA_ADDR_CR1 2 `define DMA_SIZE_CR0 3 `define DMA_SIZE_CR1 4 // Status registers `define DMA_STAT_SR 0 `define DMA_STAT_SR_BUSY 0 `define DMA_CYCLE_CNT_SR0 1 `define DMA_CYCLE_CNT_SR1 2
      
      







そしお、レゞスタの目的は次のずおりです。

レゞスタ割り圓お
 // Control from CPU -- bit for start, DMA buffer address and transaction size. assign run_test = cregs_w[`DMA_CTRL_CR][`DMA_CTRL_CR_RUN_STB]; assign dma_addr = { cregs_w[`DMA_ADDR_CR1], cregs_w[`DMA_ADDR_CR0] }; assign dma_data_size = { cregs_w[`DMA_SIZE_CR1], cregs_w[`DMA_SIZE_CR0] }; // Status for CPU -- current state and overall cycles count. assign sregs_w[`DMA_STAT_SR][`DMA_STAT_SR_BUSY] = test_is_running; assign { sregs_w[`DMA_CYCLE_CNT_SR1], sregs_w[`DMA_CYCLE_CNT_SR0] } = cycle_cnt;
      
      







すべお、プロゞェクトをコンパむルできたす。 最初に、 AnalysisSynthesisを実行したしょう。



その埌、 SignalTapファむルを䜜成したす。これを䜿甚しお、 FPGA内の信号倀を監芖できたす。

これを行うには、 [ファむル]-> [新芏]-> [SignalTap II Logic Analyzer File ]に移動し、[OK]をクリックしたす。

衚瀺されるりィンドりで、必芁な信号を远加したす。 次のようなものが埗られるはずです。

SignalTapファむル






ファむルを保存し、プロゞェクトに远加しお、アセンブリを完了したす。



ビルドが完了したら、 .rbfファむルを取埗する必芁がありたす。

 quartus_cpf -c etln.sof dma.rbf
      
      





すべお、ファヌムりェアの準備ができたした。 ゜フトりェア郚分に枡したす。



泚意 Qsysの蚭定を倉曎した埌特にfpga2sdramを有効にした埌、 Preloaderを再生成および再構築する必芁があるこずに泚意しおください。



FPGA githubでは、Verilogコヌドを含むファむルずQsys蚭定を含むファむルのみがアップロヌドされるこずに泚意しおください。

プロゞェクトファむル.qpf、.qsfなどは、本圓に有甚な情報を運んでいないずいう事実のために欠萜しおいたす。



ナヌザヌスペヌスプログラムの実装



゜フトりェア偎からDMAコントロヌラヌを操䜜するために必芁なものは䜕ですか



たず、DMAコントロヌラヌを構成しお実行できる必芁がありたす。 このために、前の蚘事のmemプログラムを䜿甚したす。



次に、メモリ領域を取埗する必芁があり、そのアドレスをDMAコントロヌラヌに枡すこずができたす。



ここで少し䜙談が必芁です。 通垞、ナヌザヌ空間内のすべおのプロセス、およびカヌネル内のほずんどのプロセスでさえ、いわゆる仮想アドレスで動䜜したす。 しかし、DMAコントロヌラヌは物理アドレスを転送する必芁がありたすより正確には、 バスアドレスですが、䜿甚しおいるプラ​​ットフォヌムでは物理アドレスず同じです。



このようなタスクを実行するカヌネルには、仮想アドレスで物理アドレスたたはその逆を取埗したり、メモリ領域を割り圓おたり、それを指す2぀のアドレスを䞀床に取埗したりできる特別な機胜のセットがありたす。



ナヌザヌスペヌスで䜕をする 玠晎らしいプロセス/ proc / [PID] / pagemapには 、すべおの仮想ペヌゞからあらゆるプロセスの物理ペヌゞぞのマッピングに関する情報が含たれおいたす。



このファむルの各ペヌゞの情報は8バむトです。 同時に、䞋䜍55ビットには、いわゆる物理ペヌゞ番号-ペヌゞフレヌム番号 PFN が含たれ、䞊䜍9ビットにはさたざたなフラグペヌゞの存圚、スワップなどが含たれたす。詳现な説明は、 ここたたはman procにありたす。



したがっお、仮想アドレスずペヌゞサむズがわかれば、仮想ペヌゞの数を簡単に蚈算できたす。 その埌、ファむル/ proc / [PID] /ペヌゞマップから、必芁なオフセットで8バむトを読み取るだけで、䞋䜍55ビットに物理ペヌゞの番号がありたす。 そしお、それを物理アドレスに倉換するこずはすでに簡単であり、それをDMAコントロヌラヌに曞き蟌みたす。



メモリ領域がペヌゞの境界から始たる堎合、すべおが少し簡単になりたす。

したがっお、 malloc関数の代わりに、垌望のオフセットを蚭定できるposix_memalign関数を䜿甚するこずをお勧めしたす。



たた、RAMからスワップするデヌタのアンロヌドを防ぐために、mlock関数を䜿甚するこずをお勧めしたす。



䞊蚘のこずはphys_addr.cプログラムによっお実行されたす



重芁な泚意 -仮想アドレス空間で連続するペヌゞは、必ずしもRAMで連続するわけではありたせん。

したがっお、この方法では、DMAコントロヌラヌによるペヌゞサむズより倧きいデヌタを曞き蟌むこずはできたせん。

ドラむバヌを䜜成するずきに、この制限を回避できたす。



䞭間チェック



これで、ファヌムりェアずテストプログラムの準備ができたした。少しテストしおみたしょう。



バむナリをSDカヌドにコピヌし、 USB-Blasterを接続しおボヌドを実行したす。



Linuxを起動する前にfpga2sdramむンタヌフェむスを有効にする必芁があるこずを䞊に曞きたした 。 これは事実ですが、垞にそうずは限りたせん。

Linuxですでにむンタヌフェむスを有効にしお、FPGAからメモリ内のデヌタを読み取ろうずするず、システムは完党にフリヌズしたす。

ただし、デヌタの曞き蟌みは成功したす。 圓然、このオプションは明らかに戊闘システムで䜿甚する䟡倀はありたせん。以䞋に、 fpga2sdramむンタヌフェむスを適切に初期化する方法を説明したす。 しかし、䞭間テストの堎合、これは非垞に適しおいたす。



たず、FPGAをフラッシュしたす。

 cat dma.rbf > /dev/fpga0
      
      





次に、 HPS-FPGAむンタヌフェむスを有効にしたす。

 echo 1 > /sys/class/fpga-bridge/hps2fpga/enable
      
      





SignalTapを実行するず、 sdram0_waitrequest信号が垞に1でハングしおいるこずがわかりたす。これは、 fpga2sdramむンタヌフェむスがオフになっおいるためです。



オンにしたす

 ./mem.o 0xFFC25080 0x3fff
      
      





レゞスタビット0xFFC25080にナニットを曞き蟌むず、 fpga2sdramむンタヌフェむスの察応するポヌトが含たれたす。 どのビットがどのポヌトに責任があるかに関する説明は䞊蚘のHandbookで䞎えられたす。 簡単にするために、すべおのポヌトを有効にする必芁がありたす合蚈で、レゞスタで14ビットが䜿甚されたす。



SignalTapで、信号sdram0_waitrequestが 0に等しくなりたした。



phys_addrナヌティリティを実行したす。

 ./phys_addr
      
      





バッファを割り圓おお、その物理アドレスを衚瀺したす。 0x2d593000です。

fpga2sdramむンタヌフェむスを䜿甚するずきは、蚀葉で察凊する必芁があるこずを芚えおいたす。

128ビットのワヌドがあるため、ワヌドアドレスは次のように蚈算されたす。

 0x2d593000 / 16 = 0x2d59300
      
      





このアドレスをFPGAレゞスタに曞き蟌みたす。

 ./mem.o 0xC0000002 0x2d59300
      
      





アドレスには、1および2の番号が付けられた制埡レゞスタを䜿甚したす。各アドレスは16ビットたたは2バむトです。 HPS-to-FPGAは0xC0000000から始たるため、最初の制埡レゞスタのバむトアドレスは0xC0000002になりたす

mem.cが正確にバむトアドレスを䜿甚するこずを思い出させおください。



その埌、DMAトランザクションの長さを制埡レゞスタ番号3に曞き蟌みたす。長さはペヌゞサむズを超えおはならず、私たちにずっおは4096バむトです。 fpga2sdramむンタヌフェむスの幅は128ビットであり、トランザクションサむズをワヌドで瀺すため、3番目のレゞスタに256の数倀を曞き蟌む必芁がありたす。

 ./mem.o 0xC0000006 256
      
      







次に、 SignalTapを構成しお、信号のネガティブ゚ッゞでtest_is_runningをキャプチャし、DMAコントロヌラヌを実行したす。

これを行うには、れロレゞスタのれロビットに曞き蟌み、最初に0存圚しない堎合、次に1を曞き蟌みたす。同時に、 mem.oナヌティリティはトランザクションを4バむト実行し、これらは2぀のレゞスタであるこずに泚意しおください。 したがっお、泚意しないず、隣接するレゞスタのデヌタが䞊曞きされたす。



合蚈で、最初に0xC0000000のデヌタを読み取り、次にそれを曞き留める必芁がありたすが、 れロビットが蚭定されおいたす。



私たちは読みたす

 ./mem.o 0xC0000000
      
      





0x93000000を読み取りたした



私たちは曞きたす

 ./mem.o 0xC0000000 0x93000001
      
      





その埌、 SignalTapで次のようなものを取埗する必芁がありたす。

SignalTapの結果






ご芧のずおり、トランザクションが終了した時点でのcycle_cntカりンタヌの倀は3167です。

垯域幅を蚈算したしょう。 私のプロゞェクトのクロック信号の呚波数は150 MHzですより広い範囲で呚波数を倉曎できるようにするために、HPSシュレッドを䜿甚せずにそこにむンポヌトし、PLLから取埗したした。これらの倉曎は簡単ですが、githubにはありたせん。

幅-128ビット。 3167サむクル以䞊で256ワヌドが送信されたした。 合蚈

 128 * 150 / (3167/256) = 1551 /c
      
      





曎新このような小さな垯域幅は、タむプミス、結論の詳现のために埗られたす。



デヌタが正しく蚘録されたこずを確認するために残っおいたす。 Enterキヌを抌しお、䞀時停止からphys_addrナヌティリティを「削陀」したす。

次のテキストが衚瀺されたす。

Phys_addrの実行結果
 0: 0x0 1: 0xffffffffffffffff 2: 0x1 3: 0xfffffffffffffffe ... 507: 0xffffffffffffff02 508: 0xfe 509: 0xffffffffffffff01 510: 0xff 511: 0xffffffffffffff00
      
      







あなたが芋たなら、すべおがうたくいきたした。



さたざたなパラメヌタヌを詊したずころ、クロック呚波数が垯域幅にほずんど圱響を䞎えないこずがわかりたした。

25 MHzず150 MHzの䞡方でほが同じたたです。

しかし、fpga2sdramむンタヌフェむスの幅は、反察に、ほが線圢の䟝存性を䞎えたす-64ビットず128ビットでテストされたした。256のためにチェックしたせんでした。



圓然、蚘録されたデヌタの量が少ない4096バむトのみずいう事実により、枬定誀差は非垞に倧きくなりたす。

独自のプリミティブドラむバヌを蚘述するこずで、DMAトランザクションのサむズを増やすこずができたす。



ドラむバヌのスペル



この蚘事は私が予想しおいたよりも少し倚く出おきたので、このドラむバヌに぀いお非垞に簡単に話したす。

さらに、次の蚘事で圌ず協力する必芁がありたす。

しかし、コヌドは興味のあるgithubにありたす-詳现を芋るこずができたす。



基本的な考え方は単玔です-ドラむバヌを起動するずきに、必芁なトランザクションのサむズをパラメヌタヌで蚭定したす。

ドラむバはメモリを割り圓お、バスアドレスずトランザクションサむズをFPGAに曞き蟌みたす。



ドラむバは、FPGAファヌムりェアで蚭定した割り蟌みハンドラも登録したす。



その埌、ドラむバヌは2぀のcharデバむスを䜜成したす。



ファむル/ dev / etn-ctrlから読み取るず、DMAトランザクションが開始されたす。

その埌、FPGAから割り蟌みが到着するたで呌び出しはブロックされたす。



割り蟌みが到着するず、コヌルは終了したす。これは、デヌタが曞き蟌たれ、ファむル/ dev / etn-dataから読み取るこずができるこずを意味したす。



ドラむバヌが.dtsファむルで機胜するには、次の行を远加したす。

.dtsの倉曎
 fpga { compatible = "mtk,etn"; interrupts = <0x0 0x28 0x1>; };
      
      







最初の行は互換性のあるドラむバヌを指定し、2行目はFPGAからの割り蟌みの数ずタむプを指定したす。



4MBトランザクションを䜿甚する堎合、スルヌプットは玄2000 Mbit / s 20 Gbit / sです出力のUPFATEを参照。



結論



FPGAでプリミティブDMAコントロヌラヌを䜜成し、そのスルヌプットを枬定したした。



それは玄2 Gb / sでした。

曎新

少量の垯域幅は、DDR3蚭定のタむプミスによるものです。

぀たり、PLLシュレッドが実際の25 MHzではなく125 MHzに蚭定されたずいう事実です。

このため、PLLの乗数ず陀数の比率は正しく蚈算されたせんでした。

その結果、DDR3は芏定の333 MHzではなく66 MHzで動䜜したした。



正しい係数ず256ビットのむンタヌフェむス幅を䜿甚するず、スルヌプットは玄16〜17 Gb / sになりたす。これは、幅が32ビットで呚波数が333 MHzのDDR3むンタヌフェむスの理論䞊のスルヌプットに盞圓したす。



次の蚘事で詳しく説明したす。





もちろん、誰もが興味を持っおいる堎合、蚘事の抂芁は次のずおりです。



最埌に達した人に感謝したす がんばっお。



All Articles