将DSP算法加速到RTL FPGA实现
将从c到RTL的时间缩短4倍
将基于c语言的验证时间缩短100倍
将RTL模拟时间缩短到3倍
在该例子中,如果用7 bits除cxdcc现象13,则得到13 bits商、7 bits以上的低latency的除法器,latency只有3个时钟周期。
c源代kqdwx/p #include 'radix2div.h '
dividend_t dividend,//(numerator )
divisor_t divisor,//(denominator )
remainder_t *remainder //
() )。
#pragma AP latency max=3
#pragma AP pipeline
subtract_t sub_out,rem_r; //1位信号
boolean_t last_bit,next_bit;
loop_cnt_t i;
//
last_bit=0;
rem_r=0;
if(loop_max32 ) )。
quo=0ULL;
else
quo=0;
//
div_booth_label03360for(I=0; i LOOP_MAX; I=I1({
//concurrent blocks
sub_out=rem_r - divisor;
y=dividend 1
if(y==0) )。
next_bit=0;
else
next_bit=1;
if(sub_out0)//remainder-denominatorisnegative
quo=quo 1;
if(I!=LOOP_MAX-1 ) {
rem_r=rem_r 1;
rem_r=rem_r | next_bit;
}
}
else//remainder-denominatorispositive
quo=quo 1;
quo=quo | 1;
if(I!=LOOP_MAX-1 ) {
rem_r=sub_out 1;
rem_r=rem_r | next_bit;
}
else
rem_r=sub_out;
}
} //end for
返回quo;
}
首字母axdds/p #ifndef LOOP_MAX
# define loop _ max 14//quotient _ length 1
#endif
#ifdef BIT_ACCURATE
#include 'ap_cint.h '
typedef uint13 dividend_t;
typedef uint7divisor_t;
typedef uint13quotient_t;
typedef int14remainder_t;
typedef int14 subtract_t; //dividend_t 1 bits signed
typedef uint14 quotient_i_t; //quotient_t 1 bits unsigned
typedef uint6 loop_cnt_t; //2^^Y loop_max
typedef uint1 boolean_t;
#else
typedef intdividend_t;
typedef intshort divisor_t;
typedef intquotient_t;
typedef int boolean_t;
typedef intremainder_t;
typedef int unsigned uint32_t;
typedef int long long subtract_t;
typedefintunsignedlonglongquotient _ I _ t;
typedef int loop_cnt_t;
#endif
C testbench语句axdds/p #include
#包含
#include 'radix2div.h '
//
dividend_t dividend,//(numerator )
divisor_t divisor,//(denominator )
remainder_t *remainder //
);
//
int test _ divider (dividend _ tdividend,
divisor_t divisor
)
{
remainder_t remainder;
frintf(stdout,' dividend=%u,divisor=% u quotient=% uremainder=% un ',
dividend、divisor、quotient、remainder;
frintf(stdout,--------n );
if () quotient==dividend/divisor (remainder==dividend-) divisor*quotient ) ) }{
printf(pass(n ) );
}
else {
printf(fail(n ) );
返回1;
}
}
//
int main ()。
int i,j;
dividend_t max_num;
max_num=0;
j=LOOP_MAX-1;
for(I=0; i j; I=I1({
max_num=max_numpow(2,I );
}
//
test_divider(max_num,1;
test_divider(2,pow ) 2,9 )-1 );
test_divider(max_num,pow ) ) 2,9 )-1 );
test _ divider (8,1;
test _ divider (99,10 );
//
}