組み込まれたエンジニア

我輩は石である。名前はまだ無い。

NSL:整数除算回路

2009-12-24 07:32:36 | Weblog
メリークリスマス!

ということで、クリスマスバージョンのsfl2vlとともに、NSLによる除算回路のサンプルをお届けします。
Nは割られる数のビット数、Mは割る数のビット数を定義し、出力は、N-Mビットになります。

見れば見るほど平方根回路にそっくり、というか、平方根回路を少し変更しただけで作成しました。。この回路は乗算のコストが安いFPGA向けです。ASICで使う場合には、通常の引き戻し法か引き離し法などを使ってください。

#define N 8
#define M 4

declare div_%N%_%M% {
input A[N],B[M];
output F[N-M];
func_in div_do(A,B);
func_out div_done(F);
}


module div_%N%_%M% {
reg try[N-M];
wire mul_i1[N-M], mul_i2[M], mul_o[N];

func_self mul(mul_i1,mul_i2);

func mul {
        mul_o = mul_i1*mul_i2;
        }

func div_do seq {
        reg bitpos[N-M];
        for( {bitpos:=1 << ((N-M)-1); try:=0; } ; bitpos != 0 ; bitpos := bitpos >> 1) {
                if(mul(try | bitpos,B).mul_o <= A) try := try | bitpos;
} div_done(try); } }