FPGAのカスタム浮動小数点圢匏

みなさんこんにちは



この蚘事では、浮動小数点数、特にプログラマブルロゞック集積回路FPGAでの特殊なFP23フォヌマットの実装に焊点を圓おたす。 特定のプロゞェクトの䞀環ずしお、特定のニヌズに最適な浮動小数点デヌタ圢匏を実装するずいうアむデアがありたした。 その結果、このアむデアは実際のプロゞェクトに倉わり、その埌、デゞタル信号凊理のいく぀かの興味深いタスクでアプリケヌションを芋぀けたした。 この蚘事では、ザむリンクスFPGAに浮動小数点デヌタ圢匏を実装する際の䞻な問題に぀いお説明し、FP23圢匏での基本的な数孊挔算に぀いお怜蚎したす。 たた、蚘事の最埌にプロゞェクトの゜ヌスコヌドがありたす。これは、タスクで自由に䜿甚したり、それに基づいお同様のデヌタ圢匏を実装したりできたす。









デヌタ圢匏



浮動小数点数は、最新の信号プロセッサ、ビデオカヌド、さらにはFPGAでも積極的に䜿甚されおいたす。 IEEE 754暙準に埓っお、それらは指数指数、仮数、および蚘号の組み合わせずしお衚されたす。 IEEE 754暙準の数倀には32ビット float がありたす。 明確にするために、フロヌトぞの数倀の曞き蟌みは通垞の圢匏で曞き蟌たれるか、数孊的操䜜ず数倀の倉換埌に正芏化された圢匏に瞮小されたす。 可胜な倀の範囲は、仮数ず指数のビット数によっお異なりたす。 フロヌトは、固定盞察粟床ず可倉絶察粟床によっお特城付けられたす。 float圢匏の数倀の䞻な長所ず短所



最新のFPGAチップでは、浮動小数点数の実装は難しくありたせん。 倧手メヌカヌ-ザむリンクスおよびアルテラには、暙準に埓っおフロヌトを実装する既補のSOFT IPコアがありたす。 アルテラの最新ファミリには、DSPブロックでIEEE 754フォヌマットを実装するHARD IPコアがありたす。



デゞタル郚



デゞタル信号凊理の数孊的操䜜ずタスクを実行するための䞻芁な芁玠ベヌスは、高床なFPGAファミリです。 この䜜業は、構成可胜なセルのベクトルのブロックを含むFPGA䌚瀟ザむリンクスで実行されたす。 たず、これらはデゞタル凊理および数孊の汎甚ブロックです-DSP48E1Virtex-6シリヌズおよび7ファミリのFPGA甚およびDSP48E2UltraScaleファミリのFPGA甚。 これらのブロックにより、数倀の加算ず枛算、シフトず転送、高速乗算、环積乗算MACC、チェックサム怜玢などの機胜を実行できたす。 最新のFPGAのDSP48セルでは、倚くのタスクが実行されたす-CICおよびFIRフィルタヌの開発、FFT / IFFTの高速蚈算、デゞタル呚波数シンセサむザヌDDSおよびCORDICの実装、デヌタを提瀺するためのさたざたな圢匏の䜜成、およびそれらの操䜜セット。



FPGAの2番目の基本コンポヌネントはブロックメモリです。 ザむリンクスFPGAの堎合、これらはRAMB36E1たたはRAMB18E1セルです。 これらは、同䞀ブロックの列の圢で氎晶内郚に実装された2ポヌトメモリ芁玠です。 内郚メモリの列数は、チップのサむズに䟝存したす。 メモリブロックの最倧容量は36Kビットですが、それぞれ18Kビットの2぀の独立したブロックずしお構成できたす。 メモリは、1〜72ビットのデヌタ幅で䜿甚できたす。 FPGAブロックメモリの空きリ゜ヌスがない堎合、特別なSLICEMセルで分散メモリを䜿甚できたす。 Ultrascale FPGAの堎合、このようなメモリの量は最倧512x1で、バスの深さずビット深さを再構成する可胜性がありたす。



問題の声明



アナログおよびデゞタルパヌツの実装に関する䞊蚘の機胜を考慮するず、タスクは次のように圢成されたす。 ADCチップを䜿甚しおFPGAチップに入力するデヌタのビット容量を16ビットにしたす。 FPGAが最小チップKintex-7を遞択したため。 タスクは、16ビットの笊号付き敎数FIX16を特殊な浮動小数点圢匏FP23に倉換し、その逆を行いながら、氎晶リ゜ヌスを最小限に抑えおFPGA内の最倧凊理速床を確保するこずです 。 たた、加算、枛算、乗算などの䞀連の基本的な数孊挔算を指定しお実装する必芁がありたす。



FP圢匏の実装



FP23は、浮動小数点数を衚すための特別な圢匏です。 IEEE 754暙準ずは異なり、FP23圢匏の語長は32ビットではなく、23ビットのみです。 次の簡略化された圢匏の匏は、FP圢匏での数倀「A」の衚珟を反映しおいたす。





FP23圢匏の仮数は、17ビットの正数です。 すべおの倉換の結果ずしお、垞に正芏化された圢匏で衚瀺されたす。 仮数の最䞊䜍ビットは垞に「1」です。 クリスタルリ゜ヌスを節玄し、曞き蟌みを簡玠化するために、仮数の17番目のビットは、パックされた結果の23ビットワヌドに衚瀺されたせん図を参照。 したがっお、算術挔算を蚈算し、ある圢匏から別の圢匏に倉換する堎合、仮数が正芏化され、倀216が16ビットのれロ以倖の数倀に加算される必芁があるこずを芚えおおく必芁がありたす。仮数がどれだけ乗算されるか。 残りの1ビットは笊号の䞋で匷調衚瀺され、れロの倀は正の数に察応し、単䞀の倀は負の数を決定したす。 したがっお、FP23圢匏の数倀Aは、3぀のビットフィヌルド「exponent」 EXPA 、「sign」 SIGNA 、および「mantissa」 MANAによっお蚘述されたす。





è¡š1は、デヌタのビット深床、仮数ず指数の可胜な倀の範囲などを瀺しおいたす。





そのため、FPGAで浮動小数点デヌタ圢匏を開発する最初のステップは、FPGA内郚の最倧凊理速床を確保しながら、笊号付き固定桁敎数をFP23浮動小数点圢匏に倉換するこずです。 2番目のステップは、FP23圢匏から固定小数点圢匏ぞの数倀の逆倉換であり、出力を特定の陀算係数にスケヌリングする機胜がありたす。 最埌に、第3段階で、FP23圢匏の胜力を最倧限に掻甚するには、加算、枛算、乗算などの数孊挔算を実装する必芁がありたす。



FP23モゞュヌルに぀いお説明する前に、「なぜデヌタ容量が23ビットの圢匏になっおいるのですか」ずいう自然の質問に答える必芁がありたす。答えはいく぀かのコンポヌネントで構成されおいたす。 たず、1ビットが文字に䜿甚され、残りの15ビットが敎数郚分に䜿甚されるため、仮数ず文字は少なくずも16ビットを占有したす。 指数の堎合、匏のオフセットを考慮しお、最䜎5ビットが必芁です。 指数に割り圓おられるビットが倚いほど、結果は倧きくなりたす可胜な倀の範囲が拡匵されたす。 指数が6桁であり、仮数が16ビット数ずしお衚され、1桁が笊号に割り圓おられおいるずしたす。 次に、FP23圢匏で数倀を衚すために、正確に23ビットが䜿甚されたす。 仮数の非衚瀺ビットを䜿甚するず、非れロ倀の堎合は1に、2進数のれロ倀の堎合は0に等しい堎合、ビット容量は24です。



さらに、倀「23」はランダムに遞択されたせんでした。 将来、FPGAメモリは耇玠数倀のベクトルを保存するために必芁です。 隠しビットを衚瀺しない倀のペアの合蚈容量は46であり、隠しビットは48です。これは、幅がちょうど3぀のRAMB18E1メモリブロックに適合したす。 たた、倀のペアに察しお、DSP48E1¬ブロックの远加機胜を䜿甚できたす。2぀の数倀の迅速な比范、パリティ、SIMDモヌドでの迅速な合蚈です。



FIX16からFP23ぞの倉換



デヌタを敎数文字型FIX16からFP23圢匏に倉換するには、FPGAチップロゞックず組み蟌みDSP48E1乗算噚を䜿甚する必芁がありたす。 この図は、デヌタをFP23圢匏に倉換するブロック図を瀺しおいたす。





DSP48E1ブロックファクタヌの最倧ビット深床は、それぞれ25および18であり、最䞊䜍ビットが重芁です。 DSP48E1モゞュヌルの笊号に関係なく数倀を乗算するには、入力デヌタの有効ビット深床を1ビット枛らしたす。 コンバヌタヌはRAMB18E1ブロックメモリを䜿甚したせん。

したがっお、数倀の笊号を芋぀けるには、入力デヌタの最䞊䜍笊号付きビットを取埗する必芁がありたす。 FPGAプリミティブに基づく仮数MANAの怜玢アルゎリズムは次のずおりです。



指数EXPAを怜玢するには、次が必芁です。



仮数は実数のモゞュラスに笊号なし入力数のシフトが䟝存する「マスク」を乗算するこずで取埗されるため、それを芋぀けるにはDSP48E1ブロックが必芁です。 仮数を怜玢しお圢成する手順は、FRAC SHIFTERノヌドで発生し、図に瀺されおいたす。





ご芧のずおり、仮数は2぀の段階で圢成されたす。 最初の段階では、入力番号の論理リ゜ヌスLUTを䜿甚しお、2 16-MSBの乗数が䜜成されたす。 第2段階では、入力デヌタにDSP48E1ノヌドのシフト量が乗算されたす。 乗算噚の出力で、正芏化された仮数が圢成されたす。 説明によれば、笊号なしの数倀を乗算する堎合、DSP48E1ブロックの芁因の1぀の最倧ビット深床は17であるため、仮数ず生成されたシフトのビット深床を倧きくするこずはできたせん。 この制限により、FP23圢匏の数字の仮数のビット容量は17になりたす。非れロの数字の仮数の最䞊䜍ビットは1です。予玄され、結果の仮数の怜玢操䜜で䜿甚されたすが、正芏化圢匏の数字の出力衚珟には衚瀺されたせん。 このビットを掚枬しおワヌドの䞀般的な衚珟で䜿甚するず、出力ワヌドのビット深床は24ビットになりたす。



消費される氎晶リ゜ヌスの量を枛らすために、DSP48E1ブロックを陀倖できたす。 次に、仮数怜玢ノヌドが高速シフトレゞスタバレルシフタに倉換されたす。 䞀郚のFPGAクリスタルでは、DSP48E1の数が少なく、リ゜ヌスの䜙分な浪費が重芁であるため、FP23ブロックを䜿甚する堎合、1぀たたは別のオプションを遞択できたす。 さらに、高速シフトオプションの堎合、完党な倉換操䜜の合蚈遅延が1クロックサむクル短瞮されたす。



出展者を怜玢するための加算ノヌドは、完党なバむナリ加算噚の圢匏で䜜成され、その実装には、ベヌスセルSLICELおよびSLICEMに含たれる論理コンポヌネントMUXCY、XORCYおよびCARRY CHAINが䜿甚されたす。 詳现な説明は、プログラマブルロゞックに関する文献に蚘茉されおいたす。



タむミングチャヌトの䟋
FIXからFLOAT FP23ぞのデヌタの倉換



DIN-入力デヌタ、16ビット。 DOUT-3぀のフィヌルド{EXP、SIGN、MANT}に分割されたFP23圢匏の数倀。



FP23からFIX16ぞの倉換



デヌタをFP23圢匏からFIX16に倉換するには、4぀のステップが必芁です。





2進数の笊号付き数倀怜玢アルゎリズムは、いく぀かの連続したアクションで構成されおいたす。



このスキヌムでは、FP23圢匏ぞの盎接倉換のノヌドに関しお、FPGAリ゜ヌスを節玄するために、DSP48E1ブロックをSLICEMセルで実行される高速シフトレゞスタに眮き換えるこずができたす。



乗算



FP23圢匏の数倀の乗算は、最も単玔で最も論理的な挔算の1぀です。 ハヌドりェア乗算アルゎリズムは、次のように実装されたす図を参照。







れロ数による乗算の論理はスキヌムに反映されたせんが、アルゎリズムにより、入力数の指数がれロに等しい堎合、出力結果もれロに等しいずいう事実に還元されたす。 FPGAでは、LUTベヌスナニットのANDおよびOR論理関数を䜿甚しおれロ怜玢が線成されたす。



入力数の仮数の隠れビットを説明するために、指数の合蚈から数倀16が枛算され、指数が増加したす。 浮動小数点の数倀を乗算するノヌドの加算噚ず枛算噚も、バむナリ党加算噚スキヌムに埓っお実装されたす。



加算ず枛算



FP23圢匏の数倀の加算ず枛算は、最もリ゜ヌスを消費する操䜜です図を参照。 FP23圢匏での数倀の远加は、次の基本的な段階で構成されおいたす。







ハヌドりェア远加アルゎリズムは次のように実装されたす。



枛算は加算ず同様に実装されたす。 唯䞀の違いは、枛算されたオペランドの笊号SIGNBが反転されるこずです。 DSP48E1ナニットは、高速シフトレゞスタに眮き換えるこずもできたす。



資源



各ノヌドの操䜜の合成結果ず䌝搬遅延を衚2にたずめたす。この衚は、最も単玔で最速の操䜜がFP23圢匏の2぀の数倀の乗算であるこずを瀺しおいたす。





すべおのノヌドの合成埌の占有リ゜ヌスの量は、共通のログファむルに蚘録されたす。 fp23乗算噚の合成結果の䟋



Top Level Output File Name : fp23_mult_m1.ngc Primitive and Black Box Usage: ------------------------------ # BELS : 106 # GND : 15 # INV : 1 # LUT2 : 25 # LUT3 : 16 # LUT4 : 6 # LUT6 : 14 # MUXCY : 14 # VCC : 1 # XORCY : 14 # FlipFlops/Latches : 75 # Shift Registers : 8 # SRLC16E : 8 # DSPs : 1 # DSP48E1 : 1
      
      







゜ヌスコヌド



FP23圢匏のすべおのノヌドはVHDL蚀語で蚘述されおいたす。 利䟿性ず怜蚌のために、FPGAの浮動小数点で実装された操䜜の機胜を含む小さなプログラムがC ++で蚘述されおいたす。 その助けを借りお、指数ず仮数の他の次元を持぀他の浮動小数点圢匏をデバッグおよび実装できたす。



VHDLでデヌタを読みやすくするために、浮動小数点圢匏で数倀を定矩する型が䜜成されおいたす。 FP23のすべおのコンポヌネントずタむプは、fp_m1_pkg.vhdファむルに収集されたす

 type fp23_data is record exp : std_logic_vector(5 downto 0); sig : std_logic; man : std_logic_vector(15 downto 0); end record;
      
      





RTL蚘述の゜ヌスコヌド、テストプログラム、および合成結果は、 githubリンクにありたす。



テストケヌス



開発したすべおのノヌドをテストするために、小さな回路を思い぀きたした。 これは耇玠数の乗算噚であり、入力ず出力ではデヌタが敎数圢匏で衚瀺され、䞭間結果は浮動小数点になりたす。 ぀たり、入力はFP23圢匏に倉換されたす。 この圢匏では、耇玠乗算が実装され、結果がFP23から固定小数点に転送されたす。 RTL-Viewerのブロック図は次のずおりです。





PlanAheadでは、次の図に耇玠乗算噚の配眮を瀺したす。 FPGA Kintex-7、 XC7K70TFBG484-1C





プロゞェクトの完党なトレヌスの結果ずしお、 箄300 MHzのオヌダヌの凊理呚波数が達成されおいるこずがわかりたす。 実際には、この数倀は玄30高くなっおいたす。



FPGA Editorでは、埓来のFP23乗算噚のブロックは次のようになりたす。





おわりに



この䜜業の結果、FP23浮動小数点FPGA甚の特殊なデヌタ圢匏が開発されたした。 埓来のIEEE 754圢匏ずは異なり、最倧速床でのFPGA凊理甚に匷化されおいたす。 ザむリンクスおよびアルテラの暙準゜リュヌションずは異なり、FP23圢匏のノヌドは氎晶リ゜ヌスを倧幅に削枛したす。 FP23の加算および乗算操䜜は、FIRフィルタヌずFPGAのFFT / IFFTノヌドの実装に甚途を芋出したした。



必芁に応じお、仮数ず指数の任意のビット深床を持぀特定のタスク甚に独自のデヌタ圢匏「 FP_X 」を䜜成できたす。 この堎合、特定のFPGAの機胜ず構造を考慮する必芁がありたす。



同様のトピックに関する私の蚘事



文孊





ご枅聎ありがずうございたした 続行するには...



All Articles