目次

ramf-vision asapagogo2010

Bach-C言語との比較

ImpulseCのマニュアルやチュートリアルはassam機のC:\ImpulseC\ImpulseC 日本語資料、ImpulseC 英語資料にあるので、各自参考にしてもらいたい。

以下にImpulseCの基本事項を記す。

  • データ型
    1. 基本的には、co_intとco_uintのみ。ビット幅は1〜64で指定する
  • ビット幅
    1. 変数宣言時に必ず、ビット幅を指定しなければならない
      co_int1〜co_int64 or co_uint1〜co_uint64
  • ライブラリ関数
       多分ない…
  • ファイル入出力
       …調べ中
    1. シーケンシャルアクセスファイルへの入出力をサポートしている
    2. ファイル入出力はシミュレーション用記述内で有効(回路生成は不可)
    3. ファイル名は動的に指定できない
    4. ファイル記述子の宣言方法 stream_in infile="data.in"; stream_out outfile="result.txt";
  • 並列性の
       多分ない
  • スレッド間の通信
       多分co_streamのこと
  • ImpulseCが使用できないもの
  1. 浮動少数点演算〜Xilinxマクロでサポート(ISE8.1から)整数演算、固定小数点演算はサポート
       See Fixed-Point_Arithmetic_in_ImpulseC.pdf
  2. ポインタ
    1. コンパイル時に確定値を持つポインターのみ
    2. ダイナミック・ポインターの使用禁止
  3. 再帰的な「関数」呼び出しの禁止
  4. 関数の可変長引数???(多分できない)
  5. 構造体の使用可能〜制限あり、型の違うstruct, unionが使えない
  6. union使えない、externは関数呼び出しのみ(多分)、goto(分からん)
  7. sift(<<)のオペランドはconstantのみ
    See Practical FPGA Programming In C 6.8. Language Constraints for Hardware Processes

ImpulseCの資料の中で重要そうなもの

About 0ImpulseC070608.pdf

  • 通信チャネル(ハード化の場合) P.63 プロセス間のデータ転送、制御のプロトコルを実現する要素
  • stream (制御付きFIFO)P.63
    処理スピードの異なる、もしくは一定しないプロセス間の自動ハンドシェークを実現
    クロックの異なるプロセス・モジュール結合の整合
    FIFOバッファによるバッファリングリング
    空のFIFOからは読み込めず、ステートマシンはデータが準備されるまで止まる、満杯への書き込みも同様
  • signal (ready制御付きレジスタ)P.64
    入力に「待ち」が必要な場合の「相手のready信号」を待つ自動ハンドシェークを実現
    「相手のready信号」がクロック同期で来るまでステートマシンは該当ヶ所で止まる
    データの転送だけでなく、同期、排他制御に使用データ幅0~64bit可変
    資源共有にセマフォ(Semaphore)で排他制御
  • register (単純なレジスタ)P.65
    クロック毎に有効データが保障されている場合
    有効性が別手段で確認できる場合
    Register チャネルによるステート・マシンの制御手段は無い
    外部IOに使いやすい
    FanOutを持てる

〜ここ重要〜

  • ハード化プロセスへの制約 P.71
     ・再帰的な「関数」呼び出しの禁止
     ・コンパイル時に確定値を持つポインターのみ
     ・ダイナミック・ポインターの使用禁止
     ・グローバル変数の使用可能〜制限あり
     ・浮動少数点演算〜Xilinxマクロでサポート(ISE8.1から)
     ・構造体の使用可能〜制限あり
  • Impulse Cのモジュール合成 P.75, 76
    	1. 最適化単位ブロック分割:
    	  ソースを走査して制御文に到達する、または制御ブロックから出る毎に、それまでを1つの最適化単位ブロックとする。
    	2. ステージ分割:
    	  最適化単位ブロックには、代入文と演算のみが含まれる。
    	  この1ブロックを最小のクロックで処理するよう分析する。各1クロックでの処理対象をステージと言う。
    	4. 制御構造を抜き出してステートマシン(FSM)となる
    	5. 各ステージ(Stage)は、生成ステートマシン(FSM)の各ステートと1対1の対応
    	6. クロックが入るだけで、C言語ソースの構造を完全に維持

 〜ここ重要〜

  • 3種類の並列化 P.77 See Impulse_C-syn-report-howto-read.ppt
    	1. プロセスレベルの並列化、パイプライン化
    	  設計のCSPモデリングであり設計の一部であり、ユーザに委ねられている
    	2. プロセス内のスケジューリング(ステージ分割)
    	  依存関係の無い処理は一括して1clockでステージ化
    	   ⇒ 依存関係のない、Cのステートメントをなるべく多く、遅延制約にひかからない範囲でまとめて1clockで処理しようとする。
    	     このまとめの単位をステージという。CoBuilder による並列化
    	3. ループ内パイプライン化〜ステージの並列動作化
    	   ⇒ ループ・ブロック内のステージのパイプライン化を試みる。CoBuilder による並列化
  • Unit Delay値 See Impulse_C-syn-report-howto-read.ppt
各「ステージ」に伴うデータパス演算の遅延値をデータ幅で見積もる
演算遅延値(Unit Delay 値)
& | ^ >> << ~1
&& || + - * == != < > <= >= !  / %ビット幅
※/ % は1クロックで終了できず複数クロック必要 ビット幅分のクロック数
  • リセットとクロッキング P.86
    • リセット
      「hwのみの設計」には、設計者がリセット・レベルを管理
      〜動作合成への明示的な指示
      PSPを使う協調設計では、レベル整合はPSP側(mhs)で行われるデフォールト〜Hi
      信号名:Hiレベル〜 reset / Lowレベル〜 reset_n
      ※この名前を制約設定pin名に使う
  • 非同期リセット
  • クロック
    信号名:clk
    	※「hwのみの設計」には、この名前を制約設定pin名に使う

About Design_Example_60minTimer_3sw7seg_XISE9_s3skit.pdf

  • 第6章:他のボードへの移植 P.44
  • Impulse C側

Xilinx S3スタータキットボードとの下記事項の差異をチェックして、Impulse Cソースファイルの多少の書き換えが必要です。

 ・SWのビット数、SWの入力のアクティブレベル
 ・7segLEDの桁数とセグメント・ドライブのアクティブレベル
 ・7segLED のドライブ方式〜ダイナミック/スタチック
 ・ダイナミックドライブの場合の桁選択のアクティブレベル
 ・リセットのアクティブレベル〜書き換えではなく、オプション・スイッチの変更
  • ISE側

Xilinx S3スタータキットボードとの下記事項の差異をチェックしてISE側の設定変更が必要です。

 ・搭載FPGAの違い
 ・ピン割り当ての違い
 ・SWリードポートのイネーブルコントロールピンの
 ・アクティブレベル〜HDL上で簡単に調整
 ・FPGAコンフィギュレーション設定の違い

ImpulseCの小数点演算に関して

About Fixed-Point_Arithmetic_in_ImpulseC.pdf

  • ImpulseCのサポートする固定小数点演算
ビット幅:8, 16, 32bit
マクロと適切なクラスを用いると、変数はそのビット幅そのままでHW化される
ただし例外として、割り算と掛け算では、CoBuilerによってそのビット幅の二倍の中間データパスが作られる
  • 固定小数点演算マクロはco_math.hで定義されている。
マクロは、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.
ユーザはオーバーフロー、アンダーフローを防ぐために、前処理としてオペランドのスケーリングをしなければならない。
  • Formatting
整数を固定小数点の形式に変換するには、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の固定小数点演算は不能
  • 掛け算の例:
    co_int32 a, b, c;
    a = 0x00002000; // 32.0 in 1s23.8
    b = 0xFFFFFF80; // -0.5 in 1s23.8
    c = FXMUL32(a, b, 8); // 0xFFFFF000 == -16.0 in 1s23.8
  • 割り算の例:
    co_int16 a, b, c;
    a = 0x1000; // 4.0 in 1s5.10
    b = 0x0100; // 0.25 in 1s5.10
    c = FXDIV16(a, b, 10); // 0x4000 == 16.0 in 1s5.10
  • その他
    #define FXCONST8(a,DW) ((uint8)((a)<<DW))
    #define FXCONST8FL(f,DW) ((uint8)((f)*(1<<DW)))
    #define FXADD8(a,b,DW) ((uint8)((a)+(b)))
    #define FXSUB8(a,b,DW) ((uint8)((a)-(b)))
    #define FXMUL8(a,b,DW) ((int8)(((((int16)((int8)(a))*(int16)((int8)(b)))+((int16)1<<((DW)-1)))>>DW)))
    #define FXMUL8U(a,b,DW) ((uint8)(((((uint16)((uint8)(a))*(uint16)((uint8)(b)))+((uint16)1<<((DW)-1)))>>DW)))
    #define FXDIV8(a,b,DW) ((int8)((((((int16)((int8)(a)))<<((DW)+1))/((int16)((int8)(b)))+(int16)1)>>1)))
    #define FXDIV8U(a,b,DW) ((uint8)((((((uint16)((uint8)(a)))<<((DW)+1))/((uint16)((uint8)(b)))+(uint16)1)>>1)))

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2019-08-29 (木) 00:03:49