アダルト・ヴァイオリン May the force be with you..

2009年12月27日

NSL:バレルシフタ

Filed under: Weblog — い~ぐる @ 9:04 PM

NSLの構造展開のfor文を用いたバレルシフタの例。
整数変数やvariableは、出現順順次評価を行なうことに注意。

// Copyright (c) IP ARCH, Inc. Naohiko Shimizu
// All rights reserved.
#define N 8
#define M 4
declare shift_%N%_%M% {
input A[N], B[M];
output F[N];
func_in shift_do(A,B);
}
module shift_%N%_%M% {
integer i,sv;
variable ps[N];
function shift_do {
ps=A;
sv=1;
for(i=0;i<M;i++) {
ps = if(B[i]) (ps << sv) else ps;
sv = sv << 1;
}
F = ps;
}
}

NSL:引き戻し法による除算回路

Filed under: Weblog — い~ぐる @ 12:17 AM

除算をするのに、乗算器を使うというのもあんまりなんで、減算器を用いた、引き戻し法による除算回路を作ってみました。
マクロによるパラメタライズはあまりデバッグしていないので、異なるビット数だとバグがあるかもしれませんが、そのときはご容赦。

動作には、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);
function sub {
wire sub_o[N+1];
sub_o = {sub_i1} - {0b0,sub_i2};
minus=sub_o[N];
}
function 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++) {
{
if(sub(QQ[N+M-1:N-M-1], {QB,(N-M)'b0}).minus) {
QQ := (QQ << 1) ;
}
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]);
}
}

Powered by WordPress