FPGAの再論理合成と再書き込み
4-1.サンプルソースコードの機能
現在提供されているGPIOサンプルは、BAR0空間に配置されたレジスタを設定することにより、GPIOポートにデータを出力したり、LEDの点灯状態を変えることができます。
お客様が設計したソースコードを組み入れることにより、特電PCI Expressボードはより高度で意味のある機能を実現することができます。
PCI(やPCI Express)を実現するFPGAに再書き込みを行うと、その内容がクリアされてしまうため、従来はパソコンの再起動が必要でした。ここでは、パソコンを再起動せずに再認識させる方法を紹介します。
4-2.FPGAのソースを変更する
特電PCI Expressコアとサンプルソースは次のような構造となっています。
main.vhd アプリケーション(GPIOとメモリ)を実現している。
+--xio_smpl XIO1100とSpartan3に対応させるためのラッパ。通常は変更不要。
+--inst_syncclk コアに提供するクロックを生成する。
+--pciecore.ngc PCI Expressのコア本体。ネットリストで提供される。
+--inst_clkgen_ddr DDR2メモリ用のクロックジェネレータ
+--inst_ddr2 DDR2メモリのコア
+--inst_dmaint_user DMAと割り込みモジュール
お客様が各種の機能を実現するため変更する必要があるソースファイルは、main.vhdです。
main.vhdは、xio_smplをコンポーネントとして持っています。xiosmplから上がってきた各種の ユーザ回路インタフェース用信号を、お客様の回路と接続してください。
-- ユーザ回路インタフェース用 user_addr_o : out std_logic_vector(31 downto 0); user_length_o : out std_logic_vector(31 downto 0); user_wdata_o : out std_logic_vector(31 downto 0); user_be_o : out std_logic_vector(3 downto 0); user_dvalid_o : out std_logic; user_dreq_o : out std_logic;
-- BAR0 is used for control bar0_wr_o : out std_logic; bar0_rdreq_o : out std_logic; bar0_rdack_i : in std_logic; bar0_rdata_i : in std_logic_vector(31 downto 0);
-- BAR1 is used for memory bar1_wr_o : out std_logic; bar1_rdreq_o : out std_logic; bar1_rdack_i : in std_logic; bar1_rdata_i : in std_logic_vector(31 downto 0);
-- BAR2 is used for DMA bar2_wr_o : out std_logic; bar2_rdreq_o : out std_logic; bar2_rdack_i : in std_logic; bar2_rdata_i : in std_logic_vector(31 downto 0);
-- DMA control port dma_cfg_c : in std_logic_vector(15 downto 0); dma_wr_req_i : in std_logic; dma_rd_req_i : in std_logic; dma_wr_ack_o : out std_logic; dma_rd_ack_o : out std_logic; dma_sysaddr_i : in std_logic_vector(31 downto 0); -- PC内メインメモリの物理アドレス dma_lcladdr_i : in std_logic_vector(31 downto 0); -- ローカル(コア上)のアドレス dma_length_i : in std_logic_vector(9 downto 0); -- DW単位 dma_wr_req_i : in std_logic; -- DMA要求(FPGA->PC) dma_wr_ack_o : out std_logic; -- DMA応答 dma_rd_req_i : in std_logic; -- DMA要求(PC->FPGA) dma_rd_ack_o : out std_logic; -- DMA応答 dma_wrdata_i : in std_logic_vector(31 downto 0); -- 書き込みデータ dma_rddata_o : out std_logic_vector(31 downto 0); -- 読み出しデータ dma_addr_o : out std_logic_vector(31 downto 0); dma_remain_o : out std_logic_vector(31 downto 0); dma_dvalid_o : out std_logic; -- DMA受信データ有効 dma_dreq_o : out std_logic; -- DMA送信データ要求 dma_corebusy_o : out std_logic; dma_userrun_i : in std_logic; dma_pktsize_o : out std_logic_vector(3 downto 0);
-- Interrupt control port int_reqline_i : in std_logic; int_available_o : out std_logic; int_ack_o : out std_logic;
|
具体的な応用例は、後の章で説明する予定です。
4−3.論理合成を行う
ソースコードを変更したら、XILINX WebPackで再度論理合成し、BitStreamファイルを生成してください。
4−4.JTAG経由でFPGAに書き込みをする
生成したBitStreamファイルは、JTAGを経由してFPGAに書き込んでください。
ただし、ここでひとつ問題が生じます。
FPGAは、再コンフィギュレーション(書き込み)すると内部のレジスタ(フリップフロップ)や、ブロックRAMの内容がすべて消去されていしまいます。ここで問題になるのは、PCIコンフィグレジスタのBAR0〜BAR5の値です。
これらのレジスタは、PCIデバイスが、パソコンのメモリマップ上でどのアドレスに配置されたかを示す重要なレジスタで、通常はパソコンの起動時にOSによって設定されます。しかし、FPGAを書き換えるとそのレジスタがクリアされてしまうので、動作を継続することができなくなってしまいます。
よって、FPGAを書き換えた後は、何らかの方法でBAR0などのレジスタを再設定しなければなりません。
一番原始的な方法は、FPGAを書き換えた後はパソコンごと再起動する方法です。しかし、これは時間がかかるのでお奨めではありません。次の節で紹介する方法を用いると、数秒でBARレジスタを再設定できます。
4−5.デバイスマネージャを開く
まず、Windowsパソコンで、デバイスマネージャを起動します。
デバイスマネージャを起動するには、「マイコンピュータ」で右クリックしてプロパティを開くか、Windowsのスタートメニューから、「ファイル名を指定して実行」を起動し、sysdm.cplと入力します。
システムのプロパティ画面が開くので、ハードウェアのタブをクリックします。
「デバイスマネージャ」と書かれたボタンを押します。
デバイスマネージャが開くので、「Tokuden General Purpose FPGA Board」と書かれたクラスを探します。
4−6.再認識させる
まず、特電PCI Expressドライバを使用するアプリケーション(PCIeMan.exe、testapp.exeなど)を終了します。
次に、「NP1025A PCI Express 評価ボード」と表示されたデバイスを右クリックし、「無効」を選択します。
ここで、次のダイアログが表示されますので、「はい(Y)」を選択します。
再び、「NP1025A PCI Express 評価ボード」と表示されたデバイスを右クリックし、今度は「有効」を選択します。
この操作によってFPGA内のBAR空間が適切に設定され、アプリケーションで使用できるようになります。
※ 上記の手順を実行する前に、特電PCI Expressドライバを使用するアプリケーション(PCIeMan.exe、testapp.exeなど)は必ず終了させておいてください。アプリケーションが動作している間にデバイスを無効にすると、パソコンの再起動が求められてしまいます。
Copyright(C) 2009 TokushuDenshiKairo Inc. All rights reserved.
info@tokudenkairo.co.jp