XILINXのIP Catalogの割り算器を使ってみた
ADCを使ったデザインで、トリガの設定のために割り算をしなければならなくなりました。ユーザがmV単位で指定してくるトリガレベルをADCのLSB単位に変換するというためです。
除算回路というとサイズが大きく、速度も遅いという印象があるのですが、現在ではどうでしょうか?試してみました。
IPカタログから「div」で検索して除算器を見つけます。Divider Generatorというそうです。どうやらAXI Stream専用になっているようですね。
いろいろな設定項目があり、どう使えばよいのか少し悩みます。
最初のタブではArgorithm TypeはRadix2のほかにHighRadixやLutMultが選べますが、デフォルトのRadix2でいいでしょう。
Operand SignはUnsignedとSignedが選べます。
Dividend WidthとDivisor Widthは、割られる数と割る数です。12÷5=2あまり3といった場合の、12がDividentで、5がDivisorです。
出力のビット幅はDivident.width+Divisor.widthになります。
DividentもDivisorも1ビット単位で指定できますが、出力のビット幅を見ていると内部では8bit単位で回路を構成しているようなので8の倍数で指定したほうがよさそうです。
出力フォーマットは、「商 & 剰余」という形式になっています。
商のwidthはdividentのwidthであり、剰余のwidthはdivisorのwidthと等しくなります。
つまり、32bit÷16bitの割り算器を作る場合、
signal divident : std_logic_vector(31 downto 0);
signal divident_rdy : std_logic;
signal divident_vld : std_logic;
signal divisor : std_logic_vector(15 downto 0);
signal divisor_rdy : std_logic;
signal divisor_vld : std_logic;
signal divout : std_logic_vector(47 downto 0);
signal divout_vld : std_logic;
で信号を作って、
inst_divider : div_gen_0 port map (
aclk => clk,
s_axis_divisor_tvalid => divisor_vld,
s_axis_divisor_tready => divisor_rdy,
s_axis_divisor_tdata => divisor,
s_axis_dividend_tvalid => divident_vld,
s_axis_dividend_tready => divident_rdy,
s_axis_dividend_tdata => divident,
m_axis_dout_tvalid => divout_vld,
m_axis_dout_tdata => divout
);
で実装すると、divout(47 downto 16)が商、divout(15 downto 0)が剰余となります。
Output ChannelはRemainderとFractionalが選べますが、Fractionalにすると剰余の代わりに小数が出てくるようです。
2ページ目の設定項目は主にタイミングに関するものです。
Clocks per Divisionは、1回の除算を何クロックで行うかを指定するもので、1,2,4,8が選べます。当然遅くしたほうが回路は小さくなるので、時間に厳しい回路でなければ遅くしたほうがいいでしょう。レイテンシのオプションも、回路規模を小さくしたいのであれば最大にしておくのがよいでしょう。
こうして出来上がった回路をMITOUJTAGのBRAMロジアナで解析してみます。
DivisorもDividentもAXI Streamで、treadyに8クロックに1回のパルスが来ているのがわかります。除算コアはtvalidが来るまで待っていてくれるわけではないので、割り算したい信号はこのタイミングで入れなければなりません。
結果が出たタイミングでdivout_validが有効になっているのがわかりますので、計算結果が出てくるのは38クロック後になります。結果がいつ出てくるかは回路規模によって変わるので、除算コアを取り扱うために簡単なステートマシンを作ったほうがよいでしょう。
使用したロジック数はDesign Runsのステータスに出てきます。
32bit÷16bitの除算器を作った場合のリソース消費量は、LUTが259個、FFが626で、Artix-7 100Tの1%にも満たない量でした。BRAMやDSPも使っていませんでした。
これなら気兼ねなく使うことができそうですね。
| 固定リンク
« EZ-USB FX2LPのブランクなEEPROMにWindows10 x64から書き込む方法 | トップページ | Vivadoでクロックの名前を付けなおしてset_false_pathを設定する »
コメント