目次 ramf-vision asapagogo2010 Bach-C言語との比較 †ImpulseCのマニュアルやチュートリアルはassam機のC:\ImpulseC\ImpulseC 日本語資料、ImpulseC 英語資料にあるので、各自参考にしてもらいたい。 以下にImpulseCの基本事項を記す。
ImpulseCの資料の中で重要そうなもの †About 0ImpulseC070608.pdf
〜ここ重要〜
〜ここ重要〜
About Design_Example_60minTimer_3sw7seg_XISE9_s3skit.pdf
Xilinx S3スタータキットボードとの下記事項の差異をチェックして、Impulse Cソースファイルの多少の書き換えが必要です。 ・SWのビット数、SWの入力のアクティブレベル ・7segLEDの桁数とセグメント・ドライブのアクティブレベル ・7segLED のドライブ方式〜ダイナミック/スタチック ・ダイナミックドライブの場合の桁選択のアクティブレベル ・リセットのアクティブレベル〜書き換えではなく、オプション・スイッチの変更
Xilinx S3スタータキットボードとの下記事項の差異をチェックしてISE側の設定変更が必要です。 ・搭載FPGAの違い ・ピン割り当ての違い ・SWリードポートのイネーブルコントロールピンの ・アクティブレベル〜HDL上で簡単に調整 ・FPGAコンフィギュレーション設定の違い ImpulseCの小数点演算に関して †About Fixed-Point_Arithmetic_in_ImpulseC.pdf
ビット幅:8, 16, 32bit マクロと適切なクラスを用いると、変数はそのビット幅そのままでHW化される ただし例外として、割り算と掛け算では、CoBuilerによってそのビット幅の二倍の中間データパスが作られる
マクロは、2 or 3個の変数と1 or 2個のオペランドを持ち、同じ固定小数点形式×2、整数の定数 Each macro takes two or three arguments: one or two operands of the same fixed-point format(a and b) and one constant integer (DW) whose value is the fractional bit width Fabc of the operands and the result. ユーザはオーバーフロー、アンダーフローを防ぐために、前処理としてオペランドのスケーリングをしなければならない。
整数を固定小数点の形式に変換するには、FXCONST8, FXCONST16, FXCONST32, FXCONST64マクロを用いる。 結果は、仮数部のビット幅と同じ符号なしの整数(co_uint8, co_uint16, co_uint32) #define FXCONST64(a,DW) ((uint64)((a)<<DW)) 例: co_int16 a = (co_int16) FXCONST16(96, 7); // 96 in 1s8.7 format == 0x3000
固定小数点から浮動小数点への変換には、FX2REAL64マクロを使う。結果は、単精度浮動小数点(float)このマクロは固定小数点値のデバッグ用である。 浮動小数点はHWプロセスではサポートされていない。シミュレーション字のみ使用可能なマクロであり、型である。 #define FX2REAL64(a,DW) ((double)(a)/(double)(1<<DW) - ((((a)&0x8000000000000000i64)==0) ? 0 : (double)(1<<(64-DW)))) 例: IF_SIM( co_int32 a = 0x000000F4; // 15.25 in 1s11.4 float f = FX2REAL32(a, 4); printf(.int: 0x%x, float: %f\n.); // prints .int: 0xF4, float: 15.250000.
FXADD8, FXADD16, FXADD32, FXADD64マクロは、固定小数点の足し算を行う #define FXADD64(a,b,DW) ((uint64)((a)+(b))) 例: co_int16 a, b, c; a = 0xFF00; // -1.0 in 1s7.8 b = 0x0180; // 1.5 in 1s7.8 c = FXADD16(a, b, 8); // 0x0080 == 0.5 in 1s7.8 co_uint8 x, y, z; x = 0xFD; // 63.25 in 0s6.2 y = 0x02; // 0.5 in 0s6.2 z = FXADD8(x, y, 2); // 0xFF == 63.75 in 0s6.2
FXMUL8, FXMUL16, FXMUL32マクロは、固定小数点掛け算を、表現可能な最も近い値に丸め込んで演算する(RN) #define FXMUL32(a,b,DW) ((int32)(((((int64)((int32)(a))*(int64)((int32)(b)))+((int64)1<<((DW)-1)))>>DW))) FXDIV8,FXDIV16,FXDIV32マクロは、固定小数点割り算を、表現可能な最も近い値に丸め込んで演算する(RN) #define FXDIV32(a,b,DW) ((int32)((((((int64)((int32)(a)))<<((DW)+1))/((int64)((int32)(b)))+(int64)1)>>1))) これらのマクロは、倍精度の中間データパスを介し、下位半分のビットを結果とする もし、64bitの整数演算がターゲットソフトウェアプラットフォームでサポートされていないなら、32bitの固定小数点演算は不能
|