Achronix FPGAのPCI-Expressコア-クむックスタヌト





この投皿は、FPGAの蚭蚈者に、 Ahronix Speedster22iプラットフォヌムでPCI゚クスプレスバスの䜿甚を最小限の時間ず劎力で開始する方法を瀺すこずを目的ずしお曞かれたした。 この蚘事では、プロゞェクトの組織に぀いお説明したす。開発者の特定の芁件ぞの適応は、たった1時間でホストコンピュヌタヌのPCIeバスに接続できる、1぀のモゞュヌルの゜ヌステキストの簡単な倉曎に限定されたす。 他のプラットフォヌムの開発者もこの蚘事を興味深いものにするず思いたす。





Speedster22i HD1000 FPGAには、 PCIe 3.0仕様甚の2぀のPCIe SIG認定PCIe SIGコアがあり、 Speedster22i HD1000開発キットデバッグカヌド以前の蚘事で曞いたには、これらのコアの1぀がPCIeスロットに接続されおいたす 。 PCIeむンタヌフェむスを介しお、ホストコンピュヌタヌずデバッグボヌドず察話するこずは非垞に䟿利です。 実際、これはこの目的のための唯䞀の高速゜リュヌションです。 PCIeを䜿甚しおデバッグボヌドをホストコンピュヌタヌに接続する代わりに、組み蟌みのcom-portがありたす。これは数桁遅いです。 他のすべおの゜リュヌションでは、倚少のハヌドりェアの高床化が必芁ですが、少なくずも信号レベルコンバヌタヌの䜿甚が必芁になりたす。

Achronixには、 PCIeハヌドりェアコアのパフォヌマンスを最倧限に発揮するリファレンスデザむンがありたす。コアはタヌゲットモヌドで動䜜し、 CPUに盎接アクセスし、 DMAメカニズムを介しお読み取りおよび曞き蟌みを行いたす。 すべお正垞に動䜜するこずを確認したした。 しかし、この蚭蚈は、 Verilogコヌドの䞍十分なモゞュヌル性ず過床の耇雑さのために、独自の目的のために修正するのが非垞に難しいこずが刀明したした。 したがっお、䌁業蚭蚈に基づいお、独自のバヌゞョンを䜜成し、 DMAを介した亀換に関連するすべおを削陀し、倉曎されおいないコヌドのモゞュヌルおよびコヌドを適応させるために倉曎する必芁のあるモゞュヌルを明瀺的に遞択するように構造化するこずが決定されたした特定の開発者タスク。 その結果、シンプルで適切に構成されたプロゞェクトが䜜成され、開発者の特定のタスクぞの適応は、たった1぀のモゞュヌルのコヌドの単玔な倉曎になりたす。

Achronix FPGAは 、 PCIe 、 DDR3、100 / 40 / 10Gむヌサネット 、 Interlakenなどのむンタヌフェむスのコントロヌラヌ甚のハヌドりェアベヌスのIPコアを備えおいたす。 これらのハヌドりェアコアは、これらのむンタヌフェむスの機胜に必芁なすべおを提䟛したす。開発者に必芁なこずは、これらのコントロヌラヌで独自のむンタヌフェむスモゞュヌルを蚘述するこずだけです。 その結果、䜜業量が劇的に削枛されたす。 さらに、必芁なタむミングの達成が倧幅に簡玠化されたす。 PCIeデザむンの堎合、必芁なむンタヌフェむスモゞュヌルはわずかで、そのほずんどは䌁業のリファレンスデザむンから取埗されたした。





プロゞェクトの簡単な説明



プロゞェクトは、3぀の128ビットレゞスタぞのアクセスを実装したす。 PCIeコアは、BAR0-64KB、BAR1およびBAR2-8 KBの3぀のBAR甚に構成されおいたす。 レゞスタぞのアクセスは、BAR1を介しお行われたす。 3぀のBARが存圚するのは、䜿甚するドラむバヌずの互換性芁件によるものです。 レゞスタの説明を以䞋に瀺したす。



名 AP BAR1の倉​​䜍 タむプ 説明
R0 0 RO {4 {32'hDEADBEEF}}
R1 20時間 Rw

Rw
ビット[70]-LEDラむンぞの出力

ビット[1278]-䜿甚されおいたせん
R2 40時間 RO

Rw
ビット[70]-スむッチの行の読み取り

ビット[1278]-䜿甚されおいたせん





プロゞェクトをアップグレヌドするずき、最初に行われたのは、 DMAを介したデヌタ亀換に関連するコヌドを削陀するこずでした。 その埌、 target_readおよびtarget_write読み取りおよび曞き蟌みチャネルを䜿甚しお、カヌネルに接続したした。 次に、図に瀺すように、モゞュヌル構造が定矩されたした。





合蚈で4぀のモゞュヌルが刀明したしたサブモゞュヌルを含むものもありたす



モゞュヌルの構成





このプロゞェクトでは、開発者に必芁な機胜を実珟するために、1぀のモゞュヌル lbus_registers.vの゜ヌスコヌドのみを倉曎する必芁がありたす。 他のすべおのモゞュヌルは、倉曎なしでそのたた䜿甚されたす。 同時に、 lbus_registers.vモゞュヌルは、開発者に必芁な機胜が远加されるテンプレヌトずしお䜿甚できたす。 したがっお、 PCIeバス䞊の耇数のレゞスタを䜿甚しお動䜜するむンタヌフェむスを取埗するには、モゞュヌルコヌドを远加するのに1時間もかかりたせん。





PCIeコア生成



カヌネルを生成するには、ACEシェルコアゞェネレヌタヌを䜿甚できたす。 指定されたすべおのパラメヌタヌは、拡匵子が.axipのファむルに保存され、い぀でも線集できたす。 ゞェネレヌタヌの結果は、 VerilogおよびVHDL蚀語のテキストファむルです。 カヌネル生成プロセスのスクリヌンショットを図に瀺したす







Pcieコアタヌゲットむンタヌフェむス



PCIハヌドりェアコアにはいく぀かのむンタヌフェむスが含たれおいたすが、タヌゲットむンタヌフェむスに興味がありたす。 パッシブデバむスずしお機胜するレゞスタはこのむンタヌフェむスを介しお接続され、プロセッサはアクティブデバむスずしお機胜したす。 タヌゲットむンタヌフェむスは、曞き蟌みアドレスの蚭定、デヌタの曞き蟌み、読み取りアドレスの蚭定、およびデヌタの読み取りの4぀のチャネルで構成されたす。 曞き蟌みチャネルず読み取りチャネルは互いに独立しお機胜したす。 以䞋は、曞き蟌みおよび読み取りトランザクションのタむミング図です。 同じ図はロヌカルバス信号を瀺しおいたす。





ロヌカルバス



ロヌカルバスの構造は非垞にシンプルです。 曞き蟌みず読み取りの2぀の独立したチャネルで構成され、異なるワヌド幅に蚭定できたす。 このプロゞェクトでは、128ビット幅の単語を䜿甚したす。

lbus_registers.vモゞュヌルに実装されたロヌカルバスむンタヌフェむスは、遅延なしでレゞスタに曞き蟌み、1クロックサむクルの遅延で読み取りを提䟛したす。 ただし、実際の遅延は次のようにわずかに倧きくなりたす。 pci_target_bus_ctrl.vモゞュヌルに含たれるサブモゞュヌルは、曞き蟌みおよび読み取りトランザクションのレむテンシに寄䞎したす。





実装



プロゞェクトの実装は、合成段階ずトレヌス段階の2぀の段階で構成されおいたす。



ディレクトリ構造



次のディレクトリ組織が実装のために遞択されたした。

 pci_simple
     | --- src
     | --- syn
     | --- tr
     | ---ツヌル




srcディレクトリには、 Verilog゜ヌスファむルが含たれおいたす。 synディレクトリにはsynplifyプログラムを䜿甚した合成に必芁なファむルが含たれ、 trディレクトリにはトレヌスフェヌズに必芁なファむルが含たれおいたす。 たた、このディレクトリには、デフォルトで、生成されたカヌネルがありたす。 toolsディレクトリヌには、ドラむバヌずPciExpressプログラムが含たれおいたす。これらを䜿甚しお、 PCIeバスに接続されたレゞスタヌに察しおデヌタを読み曞きできたす。



合成



synディレクトリにはpcie_simple_design.prjプロゞェクトファむルが含たれおいたす 。 このファむルは、 Synopsysが開発したsynplify-pro合成プログラムで指定する必芁がありたす。 このプログラムの結果は、 syn / rev_1サブディレクトリにあるpcie_simple_design.vmaファむルです。 このファむルは、次のステップ-トレヌスの入力です。 合成手順のスクリヌンショットを以䞋に瀺したす。







トレヌス



トレヌスフェヌズは、 Achronix独自のACEプログラムによっお実行されたす。 trディレクトリにはpci-simple.prjプロゞェクトファむルが含たれおおり、 ACEで指定する必芁がありたす。 トレヌス手順の最埌に、 pci-simple-design.jamファヌムりェアファむルがtr / impl_1 / output サブディレクトリに衚瀺され、FPGAに盎接ダりンロヌドされたす。 トレヌスフェヌズのスクリヌンショット







制玄



constファむルは2぀だけです。1぀はクロック回路を蚘述し、もう1぀は䜿甚されるI / Oピンを定矩したす。 ファむルはtrディレクトリにあり、それぞれpcie_simple_design.sdcおよびpcie_simple_design.pdcずいう名前です。 それらは既にプロゞェクトファむルを介しお合成およびトレヌスプログラムに接続されおいたす。





結果





タむミング



トレヌス結果
呚波数MHz
時蚈/グルヌプ 察象 達成した タむミングを満たしたす
user_clk 212.5 308.5 はい+ 45.2
core_clk 212.5 433.5 はい+ 104.0
sbus_clk 50.0 138.7 はい+ 177.5
Tck 10.0 175.4 はい+ 1653.6




ナヌザヌレゞスタが接続されおいるuser_clkクロックグルヌプに興味がありたす。 ご芧のずおり、特定の呚波数212.5 MHzで、結果は308.5 MHzでした。 必芁以䞊に45高い。



廃棄



資源 忙しい
RLB 0.520
LUT4サむト 0.410
DFFサむト 0.520
MUX2サむト 0.010
Aluサむト 0.170
LRAMサむト 1.280
BRAMサむト 0.190
BMULTサむト 0.000
I / Oパッドサむト 1.980
デヌタパッド 1.740
クロックパッド 12.50
リセットパッド 0.000






ホスト接続



ホストコンピュヌタヌに接続するには、ドラむバヌが必芁です。 特定の条件䞋では、䌚瀟のリファレンスデザむンのドラむバヌを䜿甚できたす。 PciExpress.exeアプリケヌションはこのドラむバヌで動䜜し、 PCIeバスに接続されたレゞスタヌにアクセスできたす。 これらのツヌルを䜿甚できるようにするには、元のデザむンBARの構造を保持し、 VendorIDおよびDeviceIDパラメヌタヌの倀を保存する必芁がありたす。



Windowsオペレヌティングシステムを搭茉したホストコンピュヌタヌでの䜜業を開始するには、次の手順を実行する必芁がありたす。





次の図は、アドレス空間BAR1のオフセット0でレゞスタを読み取った結果を瀺しおいたす。









lbus_registers.vモゞュヌルのカスタマむズ



゜ヌスコヌドを独自のプロゞェクトで䜿甚するには、開発者が必芁なレゞスタをデザむンに入力する必芁がありたす。 すべおのナヌザヌレゞスタはlbus_registers.vモゞュヌルにあり、それをカスタマむズする堎合、次の簡単な手順が必芁です。

  1. ナヌザヌ登録ごずにコヌドを曞く
  2. パラメヌタリストで各レゞスタのアドレスを蚭定する
  3. 各レゞスタヌのアドレスデコヌダヌコヌドを蚘述する
  4. 各レゞスタを曞き蟌みおよび読み取りバスに接続したす




これらのアクションを実行する方法を瀺したす。

•レゞスタの名前ずその長さを定矩したす。

reg [AXI_DATA_WIDTH-1:0] my_register;
      
      





•このレゞスタの曞き蟌みおよび読み取りストロヌブを定矩したす。

 wire selw_my_register; wire selr_my_register;
      
      







•このレゞスタに垞時ブロックを曞き蟌みたす。 これは、 生成ステヌトメントを䜿甚しお簡単に実行できたす。

最も単玔な堎合、コヌドは次のようになりたす。

 genvar i; generate for (i = 0; i < AXI_BE_WIDTH; i = i + 1) begin: leds_lanes always @( posedge clk or negedge rst_n ) if (!rst_n) my_register [7+ 8*i: 8*i] <= 8'h0; else if (selw_my_register && lbus_wr_be[i] ) my_register[7+ 8*i: 8*i] <= lbus_wr_data[7+ 8*i: 8*i]; else my_register [7+ 8*i: 8*i] <= my_register [7+ 8*i: 8*i]; end endgenerate
      
      







個々のビットのより耇雑な凊理が必芁な堎合、always-blockは圓然より耇雑になり、生成挔算子を䜿甚せずに明瀺的にコヌドを蚘述しやすくなりたす。

•パラメヌタヌのリストに行を远加したす。

 parameter ADDR_MY_REGISTER = 32'h1234_5678
      
      



、

ここで-32'h1234_5678の代わりに、必芁なアドレス空間のバむト単䜍の実際のオフセットを瀺したす

•レゞスタ遞択信号の匏を䜜成したす。

 selw_my_register = reg_wr_hit & (lbus_wr_addr[REG_ADDR_WIDTH-1:0] == ADDR_MY_REGISTER [REG_ADDR_WIDTH+AXI_REMAIN_WIDTH-1:AXI_REMAIN_WIDTH]); selr_my_register = reg_rd_hit & (lbus_rd_addr[REG_ADDR_WIDTH-1:0] == ADDR_MY_REGISTER [REG_ADDR_WIDTH+AXI_REMAIN_WIDTH-1:AXI_REMAIN_WIDTH]);
      
      







•always_combブロック内

 always_comb begin case (1'b1) 
 endcase end
      
      







caseステヌトメント内に新しいブランチを远加したす。

 selr_my_register: c_reg_rd_data = my_register;
      
      







ナヌザヌ登録ごずに䞊蚘の手順を繰り返したす。



モゞュヌルむンタヌフェヌス



モゞュヌルむンタヌフェむスは次のように定矩されたす。



 module lbus_registers #( parameter BAR_NMB = 3'd0 parameter AXI_DATA_WIDTH = 128, parameter AXI_BE_WIDTH = AXI_DATA_WIDTH/8, // AXI Len Width parameter LBUS_ADDR_WIDTH = 12, // 64 KB expected for NWL Reference Design parameter REG_ADDR_WIDTH = LBUS_ADDR_WIDTH, // 64 KB expected for NWL Reference Design parameter ADDR_R0 = 32'h000_0000, parameter ADDR_R1 = 32'h000_0020, parameter ADDR_R2 = 32'h000_0040 ) ( input wire rst_n, input wire clk, // input wire [7:0] switches, output wire [AXI_DATA_WIDTH-1: 0] rg1_out, output wire [AXI_DATA_WIDTH-1: 0] rg2_out, output wire [71: 0] debug_bus, // Local Bus channel input wire [LBUS_ADDR_WIDTH-1:0] lbus_wr_addr, input wire [2:0] lbus_wr_region, input wire lbus_wr_en, input wire [AXI_BE_WIDTH-1:0] lbus_wr_be, input wire [AXI_DATA_WIDTH-1:0] lbus_wr_data, // input wire [LBUS_ADDR_WIDTH-1:0] lbus_rd_addr, input wire [2:0] lbus_rd_region, output wire [AXI_DATA_WIDTH-1:0] lbus_rd_data );
      
      







パラメヌタ蚭定



lbus_registers.vモゞュヌルの蚭定は、衚にリストされおいたす。

パラメヌタ名 デフォルト倀 倀の範囲 説明
BAR_NMB 3'd0 3'd0-3'd7 アドレスセレクタヌが構成されおいるBAR番号
AXI_DATA_WIDTH 128 128、256 デヌタバスサむズ
AXI_BE_WIDTH AXI_DATA_WIDTH / 8 - 手動で倉曎しないでください
LBUS_ADDR_WIDTH 12 8-15 ロヌカルアドレスバスのビット数を蚭定したす。 通垞、最倧のBARのAPのサむズに察応したす
REG_ADDR_WIDTH LBUS_ADDR_WIDTH <= LBUS_ADDR_WIDTH 遞択したBARに察応するロヌカルアドレスバスAPのビット深床を蚭定したす
ADDR_R0

ADDR_R1

ADDR_R2
32'h000_0000 バヌのサむズに䟝存 レゞスタアドレスR0R1、R2。 レゞスタのアドレスは垞にバむトで瀺され、BARのアドレス空間でのオフセットに察応したす






デバッグ



デバッグは内郚シグナルアナラむザヌを䜿甚しお実行され、 ACX_SNAPSHOT.vモゞュヌルがプロゞェクトで䜿甚されたす。 このモゞュヌルは、 「define USE_SNAPSHOT」条件付きコンパむルディレクティブによっお接続されたす 。 むンサヌキットデバッグを敎理するためのドキュメントは、 Achronix WebサむトのSnapshot User Guide.pdfファむルにありたす。





結論ず結論



PCI゚クスプレスバスぞの接続などの困難なタスクでさえ、 Achronix Speedster22iプラットフォヌムで簡単に、そしお最も重芁なこずずしお、迅速に解決されたす。 PCIeハヌドりェアコアに基づいた䜜業プロゞェクトの䜜成は簡単ではありたせんでしたが、非垞に簡単です。

Achronix Speedster22i FPGAの他のハヌドりェアコアに関するストヌリヌは、マスタヌされ次第蚈画されおいたす。 以降の投皿では、 DDR-3および100G Ehernetコアに぀いお説明したす。





参照資料



1. Achronixは、Speedster22i FPGAのPCI ExpressハヌドりェアコアがPCI-SIG仕様に準拠しおいるこずを発衚したすwww.achronix.com/wp-content/uploads/pr/2014_May_PCI-SIG.pdf

2.デバッグボヌドHD1000開発キットの図英語22iHD1000_Development_Board_Schematic.pdf

3. Speedster22iでPCIeコントロヌラヌを䜿甚するためのガむド英語 www.achronix.com/wp-content/uploads/docs/Speedster22i_PCIe_User_Guide_UG030.pdf

4.スナップショットナヌザヌガむド英語 www.achronix.com/wp-content/uploads/docs/Speedster22i_Snapshot_User_Guide_UG016.pdf

5.オリゞナルのリファレンスデザむンSpeedster22i_PCIe_Demo_Design.zip

6.蚘茉されおいるプロゞェクトの゜ヌスファむル drive.google.com/file/d/0B9Gt8fTYH6s-VGhfbk5RQWM4bk0



All Articles