... | @@ -6,9 +6,9 @@ FPGAの詳しい中身 |
... | @@ -6,9 +6,9 @@ FPGAの詳しい中身 |
|
つまり、以下のような組み合わせ論理回路はFPGAと相性が良いです(トップレベルの箇条書きは一般論で、ぶら下げている箇条書きは実験で使うFPGAのシリーズに特有の話です)。
|
|
つまり、以下のような組み合わせ論理回路はFPGAと相性が良いです(トップレベルの箇条書きは一般論で、ぶら下げている箇条書きは実験で使うFPGAのシリーズに特有の話です)。
|
|
|
|
|
|
* 一つのLUTに入るような論理回路
|
|
* 一つのLUTに入るような論理回路
|
|
* 6入力以内の、任意の1bit出力論理回路
|
|
* 入力が6bit以内の、任意の1bit出力論理回路
|
|
* 特に、4:1のセレクタ(4入力+選択信号が2bit)が6入力LUT一つで実現できることを覚えておくと便利
|
|
* 特に、4:1のセレクタ(4入力+選択信号が2bit)が6入力LUT一つで実現できることを覚えておくと便利
|
|
* 5入力以内の、任意の2bit出力論理回路
|
|
* 入力が5bit以内の、任意の2bit出力論理回路
|
|
* 二進法で表された二数の加減算および大小比較演算[^4]
|
|
* 二進法で表された二数の加減算および大小比較演算[^4]
|
|
* LUTでちょっとした論理演算をした後、その結果を加算器に通す場合(スライス内で完結するので高速)
|
|
* LUTでちょっとした論理演算をした後、その結果を加算器に通す場合(スライス内で完結するので高速)
|
|
* LUTでnotを取ることで、減算ができる
|
|
* LUTでnotを取ることで、減算ができる
|
... | @@ -26,7 +26,7 @@ FPGAの詳しい中身 |
... | @@ -26,7 +26,7 @@ FPGAの詳しい中身 |
|
とりあえず、FPGAの場合になぜ効率が悪いのかを書いておきます(トップレベルの箇条書きは一般論で、ぶら下げている箇条書きは実験で使うFPGAのシリーズに特有の話です)。
|
|
とりあえず、FPGAの場合になぜ効率が悪いのかを書いておきます(トップレベルの箇条書きは一般論で、ぶら下げている箇条書きは実験で使うFPGAのシリーズに特有の話です)。
|
|
|
|
|
|
* 多数の入力を持つ複雑な論理回路[^6]
|
|
* 多数の入力を持つ複雑な論理回路[^6]
|
|
* 9入力以上[^7]になると論理回路の複雑さが資源消費量に影響し、最悪の場合指数的に大きくなっていく
|
|
* 入力が9bit以上[^7]になると論理回路の複雑さが資源消費量に影響し、最悪の場合指数的に大きくなっていく
|
|
* 大量にある入力の中から、一つを選択する論理回路
|
|
* 大量にある入力の中から、一つを選択する論理回路
|
|
* レジスタファイルをフリップフロップで作ろうとしたり、データメモリを分散RAMで作ろうとした場合など
|
|
* レジスタファイルをフリップフロップで作ろうとしたり、データメモリを分散RAMで作ろうとした場合など
|
|
* 素直に[分散RAMやブロックRAM](FPGARAM)を使おう
|
|
* 素直に[分散RAMやブロックRAM](FPGARAM)を使おう
|
... | @@ -45,4 +45,4 @@ FPGAの詳しい中身 |
... | @@ -45,4 +45,4 @@ FPGAの詳しい中身 |
|
[^4]: 4bit加算器の最上位のキャリー出力は、隣のブロック(スライス二つまとまりのことをブロックと呼ぶ)の4bit加算器のキャリー入力に専用線でつながっているので、4bitを超える幅の加算器もかなり高速に動作する。実質的に加算器専用回路が内蔵されていると言える。
|
|
[^4]: 4bit加算器の最上位のキャリー出力は、隣のブロック(スライス二つまとまりのことをブロックと呼ぶ)の4bit加算器のキャリー入力に専用線でつながっているので、4bitを超える幅の加算器もかなり高速に動作する。実質的に加算器専用回路が内蔵されていると言える。
|
|
[^5]: 例えば、32bit整数のすべてのビットが0かどうかは、0xffffffffを足して繰り上がるかで判定できる。このように、出力が1bitの論理関数のうち非常に特殊(だが頻出)なものは「キャリーが出力されるか」といった形で加算器のみを使って合成可能である。数ビットの結果をまとめたものを加算器の入力とすればさらに効率が上がる。
|
|
[^5]: 例えば、32bit整数のすべてのビットが0かどうかは、0xffffffffを足して繰り上がるかで判定できる。このように、出力が1bitの論理関数のうち非常に特殊(だが頻出)なものは「キャリーが出力されるか」といった形で加算器のみを使って合成可能である。数ビットの結果をまとめたものを加算器の入力とすればさらに効率が上がる。
|
|
[^6]: パリティの計算(全ビットの排他的論理和を取って1bitにまとめる)、といったものは多段のLUTに自明に分割できる単純な論理回路である。一方、Leading zeros count(上位何ビットが連続して0かを数える)、といったものは多段のLUTへの分解(中間計算結果に何を取るべきか)が自明ではない複雑な論理回路であり、ヒント無しで合成すると非常に大きな回路が生成されてしまう。
|
|
[^6]: パリティの計算(全ビットの排他的論理和を取って1bitにまとめる)、といったものは多段のLUTに自明に分割できる単純な論理回路である。一方、Leading zeros count(上位何ビットが連続して0かを数える)、といったものは多段のLUTへの分解(中間計算結果に何を取るべきか)が自明ではない複雑な論理回路であり、ヒント無しで合成すると非常に大きな回路が生成されてしまう。
|
|
[^7]: 一応、8入力までの任意の論理関数は一スライスで実現可能であるが、Vivadoはそれを最終手段とみなしているようである。一スライスに四つある6入力LUTの出力をスライス内にある二段のセレクタで選択することで8入力LUTを実現するのだが、たった1bitの出力に一スライス使うのは非常にもったいない。多くの場合、Vivadoはそういった論理関数を二段のLUTに分割する。一段目のLUT出力を他の場所で再利用できれば合計の消費LUT数を減らせるからである。一段目のLUT出力はかなり自由に選べるので、ほとんどの場合、うまく選べば他の場所で再利用できる形にできる。 |
|
[^7]: 一応、入力が8bitまでの任意の論理関数は一スライスで実現可能であるが、Vivadoはそれを最終手段とみなしているようである。一スライスに四つある6入力LUTの出力をスライス内にある二段のセレクタで選択することで8入力LUTを実現するのだが、たった1bitの出力に一スライス使うのは非常にもったいない。多くの場合、Vivadoはそういった論理関数を二段のLUTに分割する。一段目のLUT出力を他の場所で再利用できれば合計の消費LUT数を減らせるからである。一段目のLUT出力はかなり自由に選べるので、ほとんどの場合、うまく選べば他の場所で再利用できる形にできる。 |