EZ-FPGAライブラリ 2006.3.3 説明書 1.使用方法 ・C言語とスタティックライブラリによる使用方法  1)プロジェクトにezfpga.cをコンパイル&リンクします。  2)リンク時のライブラリに、Mingw(GCC)の場合はezfpga.aを、    MS-VC6.0の場合はezfpga.libを追加します。  ※旧Verで必要だったリンクオプション"-mrtd"は不要になりました。 ・C言語とDLLによる使用方法  1)ezfpga.h冒頭の、   「#define DLL_NAME "lib\\ezfpga"」   を、DLLを検索するパスに書き換えます。  2)コンパイラのオプションで"EZFPGA_DYNAMIC_LIB"を定義します。   GCC :"-DEZFPGA_DYNAMIC_LIB" MSVC:"/DEZFPGA_DYNAMIC_LIB"  3)プロジェクトにezfpga.cをコンパイル&リンクします。    リンク時のライブラリは不要です。  4)実行時、所定の位置にezfpga.dllが必要です。 ・VisualBasicとDLLによる使用方法  1)eafpga.basを標準モジュールとして組み込む  2)VisualBasic上で使用する場合は、Windowsシステムディレクトリに    ezfpga.dllをコピーする。  ※実際の使用方法は、各種サンプルコードも参考にして下さい。 2.関数説明 ・DWORD ezfpga_init(DWORD port_type)  機能   EZFPGAライブラリの初期化と使用を開始します。   EZFPGAライブラリの関数を使用する前に、必ず呼び出す必要があります。  引数   DWORD port_type    JTAGインターフェースを数値で指定します。    上位16ビットがインターフェースのタイプ、    下位16ビットがインターフェースのマイナー番号です。    インターフェースのタイプ、     1:mini EZ-USB     2:パラレルポート上のXilinx Parallel Cable III互換     DEVICE_USB2([接続順番])やDEVICE_XPAR([I/Oベース])の    マクロで指定できます。     引数に0を指定すると下記の順番に自動検索します。     1)DEVICE_USB2(0)     2)DEVICE_XPAR(0x378)  戻り値   成功の時は0、エラーの時はエラーコードを返します。 ・void ezfpga_unlink(void)  機能   EZFPGAライブラリの使用を終了します。   プログラム終了前に必ず呼び出します。 ・DWORD ezfpga_config(const char *cfg_data,DWORD *remain)  機能   FPGAをコンフィグレーションします。  引数   const char *cfg_data    コンフィグレーションするデータのポインタか、    ビットストリームファイルへのポインタを指定します。    cfg_dataにNULLを指定すると、ノンブロッキングモード時の    エラーを返します。   DWORD *remain    コンフィグレーションデータのバイト数を格納した    DWORD変数の「ポインタ」を渡します。    cfg_dataでビットストリームファイルへのポインタを指定    した場合は、バイト数を0にするか、remain引数にNULLを    指定します。    関数呼び出し前に、バイト数にEZFPGA_NON_BLOCKをOR演算を    しておくと、ノンブロッキングモードになります。     ノンブロッキングモードでは、関数の呼び出し後すぐに呼    び出しもと戻り、転送はバックグラウンドで処理されます。     転送に応じてremainが随時減算されていき0になると終了です。  戻り値   成功の時は0、エラーの時はエラーコードを返します。 ・DWORD ezfpga_check_daisychain(void)  機能   JTAGデージーチェインの有無を調べます。  戻り値   JTAGデージーチェインされているときは1 ・DWORD ezfpga_spi_xfer(BYTE port,BYTE *txbuf,BYTE *rxbuf,DWORD *num_bytes)  機能   jtagspi()モジュールと、データの通信を行います。   コンフィグレーション終了していないと動作しません。  引数   BYTE port    使用するJTAGタップを指定します。    1でUSER1タップ、2でUSER2タップ、    0を指定すると現在開いているタップを強制的に閉じます。   BYTE *txbuf    送信データへのポインタ    NULLを指定すると送信データは不定となります。   BYTE *rxbuf    受信データへのポインタ    NULLを指定すると受信データは受け取りません。   DWORD *num_bytes    送受信するバイト数への「ポインタ」を指定します。    関数呼び出し前に、バイト数にEZFPGA_NON_BLOCKをOR演算を    しておくと、ノンブロッキングモードになります。     ノンブロッキングモードでは、関数の呼び出し後すぐに呼    び出しもと戻り、転送はバックグラウンドで処理されます。     転送に応じてremainが随時減算されていき0になると終了です。  戻り値   成功の時は0、エラーの時はエラーコードを返します。 ・DWORD ezfpga_get_status(DWORD *deviceid,DWORD *status,DWORD *usercode)  機能   FPGAのステータスを取得します  引数   BYTE *deviceid   DWORD *status    FPGAのステータスコードを返します。   DWORD *usercode    FPGAのUSERCODEタップが持つ値を返します。  戻り値   成功の時は0、エラーの時はエラーコードを返します。 ・DWORD ezfpga_shutdown(void)  機能   FPGAをシャットダウンします。  戻り値   成功の時は0、エラーの時はエラーコードを返します。 ・DWORD jmem_write(DWORD address,const BYTE *data,DWORD size)  機能   jtagmem()モジュールにメモリの書き込みを行います。  引数   DWORD address    FPGA側の先頭アドレス   const BYTE *data    書き込むデータへのポインタ   DWORD size    書き込むデータのバイト数  戻り値   成功の時は0、エラーの時はエラーコードを返します。 ・DWORD jmem_read(DWORD address,BYTE *data,DWORD size)  機能   jtagmem()モジュールからメモリの読み込みを行います。  引数   DWORD address    FPGA側の先頭アドレス   const BYTE *data    読み込むデータへのポインタ   DWORD size    読み込むデータのバイト数  戻り値   成功の時は0、エラーの時はエラーコードを返します。 ・DWORD ezfpga_cfgrom_read(BYTE *buf,int addr,int size)  機能   コンフィグROM XCFxxSをリードします。  引数   BYTE *buf    読み込むデータへのポインタ   int addr    リードアドレスの先頭   int size    読み込むデータのバイト数  戻り値   成功の時は0、エラーの時はエラーコードを返します。 ・DWORD ezfpga_cfgrom_program(BYTE *buf,int addr,int size)  機能   コンフィグROM XCFxxSに書き込みます。  引数   BYTE *buf    書き込むデータへのポインタ   int addr    書き込むアドレスの先頭   int size    書き込むデータのバイト数  戻り値   成功の時は0、エラーの時はエラーコードを返します。 ・DWORD ezfpga_cfgrom_erase(void)  機能   コンフィグROM XCFxxSをイレースします。  戻り値   成功の時は0、エラーの時はエラーコードを返します。 3.エラーコード一覧 #define ERR_DRIVER 0x80000000 /* DLL Driver error */ #define ERR_PROBE 0x40000000 /* Probe */ #define ERR_COMMUNI 0x20000000 /* Communication error */ #define ERR_FILE 0x10000000 /* file error */ #define ERR_BUSY 0x08000000 /* driver BUSY */ #define ERR_MEMORY 0x04000000 /* memory allocate error*/ /* Target error */ #define ERR_TARGET 0x00800000 /* no Target found */ #define ERR_POWER 0x00400000 /* targer power down */ /* Data */ #define ERR_FORMAT 0x00008000 /* data/parameter format error */ /* Configration error */ #define ERR_DEVICE 0x00000008 /* Device not match */ #define ERR_SHUTDOWN 0x00000004 /* can't shurdown */ #define ERR_DONE 0x00000002 /* DONE signal inavtive */ #define ERR_CRC 0x00000001 /* CRC error */ 4.FPGA用モジュール説明 ・jtagspi()  機能   JTAG-USER1タップで8ビット送受信を行う  入出力リスト   output SPI_CLK; シリアルクロック,JTAGのTCKに依存 EZ-USBの場合、2MHz   output SPI_DONE; バイト終了信号、SPI_CNTが7の時に1になる。   output [7:0] SPI_DO; バッファ無し受信バイト、SPI_DONE=1のとき、 SPI_CLKの立ち上がりでサンプルします。   input [7:0] SPI_DI; 送信バイトSPI_DONE==1の時、SPI_CLKの立ち上がり              でラッチされます。   output SPI_EN; 送信イネーブル、Lレベルの時は送信しない   output [2:0] SPI_CNT バイトカウンタ、0がスタート、7がエンド ・jtagmem()  機能   JTAGメモリアクセス用モジュール   非同期SRAMに直結できるタイミングです。  パラメータ   parameter AD_DEPTH = 31 アドレス幅をビット数で指定  入出力リスト   output [AD_DEPTH-1:0] JA : アドレス信号   input [7:0] JD_I : リードデータ入力、   output [7:0] JD_O : ライトデータ出力、JWEに対してセットアップ、   output JD_E : アクセスイネーブル信号、アクセス時は1   output JCS : チップセレクト、アクセス時は1   output JOE : 1の時、リード要求となる。                サイクルタイムはTCKx8、アサートタイムはTCKx6                 1->0変化の直前に、JD_Iは取り込まれる。   output JWE : 1の時書き込み要求                サイクルタイムはTCKx8、アサートタイムはTCKx6                 JD_Oは、JWEアサートのTCKx1以前に確定して、                 JWEデアサート後、TCKx1後まで保持される。 ・pll()  機能   PLL分周比較回路、及びvtuneドライブ回路  パラメータ   parameter DIV_R_BITS = 8; // div_rのビット数   parameter DIV_V_BITS = 8; // div_vのビット数   parameter LEAD_UNLOCK = 2; // lead側のロック検出するマージン   parameter LAG_UNLOCK = 2; // lag側のロック検出するマージン  入出力リスト   input reset_n; :0の時、VCOリセット   input clk_r; :リファレンスクロック入力   input [DIV_R_BITS-1:0] div_r; :リファレンスクロック分周値−1   output clkd_r; :リファレンスクロック、分周クロック   input clk_v; :VCOクロック入力   input [DIV_V_BITS-1:0] div_v; :VCOクロック分周値−1   output clkd_v; :VCOクロック、分周クロック   output pfd_lag; :PFD LAG検出信号   output pfd_lead; :PFD LEAD検出信号   output lock; :PLLがロックした時、1になる。   output vtune_l; :VTUNEチャージポンプ、レベル信号   output vtune_t; :VTUNEチャージポンプ、トライステート信号  備考   reset_nを300msec程度0に保つと、VCOを最低周波数にリセットできます。   vtune_l,vtune_tは、無加工でOBUFT_S_2()プリミティブでドライブします。   clkd_r,clk_vは旧版clkd_a,clk_bの1/2の周波数で、デューティー50%に  なっています。reset_nが0でも停止しません。    clkd_r(Hz) = clk_r(Hz) / (div_r+1) / 2    clkd_v(Hz) = clk_v(Hz) / (div_v+1) / 2   具体的な使用例は、ezftest2、ezinvader等にあります。 ・xcf_load()  機能   XCFxxS内のデータから、8bitデータバスのRAMへのデータロード   JTAGのUSER2タップからデータを流し込むと、XCFxxSのエミュレーションが可能  パラメータ   parameter ROM_DEPTH = 18 : XCFxxSのアドレス幅   parameter USER_DEPTH = 18 : メモリバスのアドレス幅  入出力リスト   input reset;   input clk; : 基準クロック入力   output cclk : XCFxxSへのCLK信号、clk入力と同速度   output cce : XCFxxSnセレクト信号   input din; : XCFxxSのDOからのシリアルデータ入力   output BS_DRCK1,BS_SEL1 : JTAG-USER1タップの信号   input BS_TDO1;   output BS_RESET,BS_UPDATE,BS_SHIFT,BS_TDI;   input [`ROM_MSB:0] ROM_START :XCFxxSの開始アドレス   input [`AB_MSB:0] LOCAL_START :メモリバスの開始アドレス   input [`AB_MSB:0] LOCAL_END :メモリバスの終了アドレス   output [`AB_MSB:0] addr : メモリバスのアドレス信号   output [`DB_MSB:0] data : メモリバスの書き込みデータ   output we : メモリバスのライトイネーブル                サイクルタイムはclkx8、アサートタイムはclkx6                 dataは、weアサートのclkx1以前に確定して、                 weデアサート後、clkx1後まで保持される。   output done : データ転送完了信号  備考   JTAGエミュレーションを使う場合、clk==cclkは、TCKの2倍以上の周波数  でなければならない。EZ-USBを使う場合TCK=2MHzなので、clkは4MHz以上   XCFxxSからロードする場合、clk==cclkの上限はXCFxxSの仕様や、DOやCCLK  に入っている抵抗等の回路に依存します。   JTAGエミュレーション時のweのサイクルタイムとアサートタイムは規定より  も長くなります。 ・pll() (2005.11.28旧版)  機能   PLL分周比較回路  パラメータ   parameter CNT_A_BITS = 14 : div_aのビット数   parameter CNT_B_BITS = 16 : div_bのビット数   parameter LOCK_A_CNT = 2 : clk_aのロック検出するマージン   parameter LOCK_B_CNT = 2 : clk_bのロック検出するマージン  入出力リスト   input clk_a; :クロックA入力   input clk_b; :クロックB入力   input [CNT_A_BITS-1:0] div_a; :クロックA分周値−1   input [CNT_B_BITS-1:0] div_b; :クロックB分周値−1   output clkd_a; :クロックA、分周クロック   output clkd_b; :クロックB、分周クロック   output phase_a; :フェーズA検出 (クロックA>クロックB)   output phase_b; :フェーズB検出 (クロックA<クロックB)   output lock; :PLLがロックした時、1になる。  備考   vtuneのドライブ論理によっては、ロックしない場合があります。