NSLで(整数の)平方根を求める回路を作成してみました。
なるべくシンプルにするための、サンプル回路なので、効率は悪いです。
ぎりぎりのタイミングに詰めたい場合には、for文ではなく、ifとgotoを使って、余分なステップが発生しないようにします。
やはり、性能が落ちるのは気持ち悪いので、20091223版で、対策しました。まだ、シミュレーションモードではハザードになるなど、若干不安定なので、引き続き、調整中。20091224版で、修正した(はず)。なお、このバージョンから、端子やレジスタへの代入の右辺に整数値を与えることができます。
コード整理のついでに、SFLでの、while構文は需要が少なそうなので、削除します。
この回路、結果が出るまでの時間が長いのと、Nの定義値によって時間が変わるので、結果をsqrt_doneのタイミングで出力します。
この回路の動作確認中、sfl2vlのバグがあったので、
対応するベータ版は、20091222版にアップしてあります。
これとほとんど同じ回路で割算も出来ます。
// Copyright (c) IP ARCH, Inc. Naohiko Shimizu // All rights reserved. #define N 8 declare sqrt_%N% { input A[N]; output F[N/2]; func_in sqrt_do(A); func_out sqrt_done(F); } module sqrt_%N% { reg try[N/2]; wire mul_i[N/2], mul_o[N]; func_self mul(mul_i); function mul { mul_o = mul_i*mul_i; } function sqrt_do seq { reg bitpos[N/2]; for( {bitpos:=1 << ((N/2)-1); try:=0; }; bitpos != 0 ; bitpos := bitpos >> 1) { if(mul(try | bitpos).mul_o <= A) try := try | bitpos; } sqrt_done(try); } }