除算をするのに、乗算器を使うというのもあんまりなんで、減算器を用いた、引き戻し法による除算回路を作ってみました。
マクロによるパラメタライズはあまりデバッグしていないので、異なるビット数だとバグがあるかもしれませんが、そのときはご容赦。
動作には、sfl2vlのベータ版(20091226版)で加えた修正が必要(かもしれない)。
マクロによるパラメタライズはあまりデバッグしていないので、異なるビット数だとバグがあるかもしれませんが、そのときはご容赦。
動作には、sfl2vlのベータ版(20091226版)で加えた修正が必要(かもしれない)。
// Copyright (c) IP ARCH, Inc. Naohiko Shimizu // All rights reserved. #define N 8 #define M 4 declare divu_%N%_%M% { input A[N],B[M]; output Q[N],R[M]; func_in divu_do(A,B); func_out divu_done(Q,R); func_out divu_error; } module divu_%N%_%M% { reg QB[M], QQ[N+M]; wire sub_i1[N+1], sub_i2[N], minus; func_self sub(sub_i1,sub_i2); func sub { wire sub_o[N+1]; sub_o = {sub_i1} - {0b0,sub_i2}; minus=sub_o[N]; } func divu_do if(B==M'b0) divu_error(); else seq { reg bitcount[M]; for( {bitcount:=0; QB:=B; QQ:={M'b0,A};} ; bitcount <N ; bitcount++) {
} else { QQ := {(sub_o << 1)[N:N-M],(QQ[N-2:0]<<1)} |
(N+M)'b1; } } } divu_done(QQ[N-1:0],QQ[(N+M-1):N]); } }