除法器 c语言 模拟,用Vivado-HLS 实现低latency 的除法器

Vivado-HLS是从C, C++ 或 SystemC 至 RTL的高层次综合工具

将DSP算法快速到RTL FPGA 实现

将C 至 RTL时间缩短 4 倍

基于 C 语言的验证时间缩短100倍

RTL 仿真时间缩短 3 倍

本例子使用Vivado-HLS 实现13除7 bits, 得到13 bits 商, 7 bits余数的低latency 的除法器, latency只有3 个时钟周期。

C 源代码

#include "radix2div.h"

quotient_t radix2div (

dividend_t   dividend,  // (numerator)

divisor_t    divisor,   // (denominator)

remainder_t   *remainder  //

) {

#pragma AP latency max=3

#pragma AP pipeline

quotient_i_t quo, y;          // +1 bits unsigned

subtract_t   sub_out, rem_r;    // +1 bits signed

boolean_t    last_bit, next_bit;

loop_cnt_t   i;

///

last_bit = 0;

rem_r = 0;

if (LOOP_MAX > 32)

quo = 0ULL;

else

quo = 0;

//

div_booth_label0:  for (i = 0; i < LOOP_MAX; i = i+1) {

// concurrent blocks

sub_out = rem_r - divisor;

y = dividend & 1 <

if ( y == 0 )

next_bit = 0;

else

next_bit = 1;

if (sub_out < 0) { // remainder - denominator is negative

quo = quo << 1;

if (i != LOOP_MAX-1) {

rem_r = rem_r << 1;

rem_r = rem_r | next_bit;

}

}

else { // remainder - denominator is positive

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

*remainder = rem_r;

return quo;

}

h头文件

#ifndef LOOP_MAX

#define LOOP_MAX 14  // QUOTIENT_LENGTH + 1

#endif

#ifdef BIT_ACCURATE

#include "ap_cint.h"

typedef uint13  dividend_t;

typedef uint7 divisor_t;

typedef uint13 quotient_t;

typedef int14 remainder_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 int dividend_t;

typedef int short divisor_t;

typedef int quotient_t;

typedef int boolean_t;

typedef int remainder_t;

typedef int unsigned uint32_t;

typedef int long long subtract_t;

typedef int unsigned long long quotient_i_t;

typedef int loop_cnt_t;

#endif

C testbench 文件

#include

#include

#include "radix2div.h"

//

quotient_t radix2div (

dividend_t   dividend,  // (numerator)

divisor_t    divisor,   // (denominator)

remainder_t   *remainder  //

);

//

int test_divider (dividend_t    dividend,

divisor_t     divisor

)

{

quotient_t quotient;

remainder_t remainder;

quotient = radix2div(dividend,divisor,&remainder);

fprintf(stdout, ">>>>>>>>> dividend = %u,  divisor = %u   quotient = %u   remainder = %u \n",

dividend, divisor, quotient, remainder);

fprintf(stdout, ">>>>>>>>>-------------------- \n");

if ((quotient == dividend/divisor) && (remainder == dividend-(divisor*quotient)) ) {

printf ("PASS \n");

}

else {

printf ("FAIL \n");

return 1;

}

}

//

int main () {

int i, j;

dividend_t max_num;

max_num = 0;

j = LOOP_MAX-1;

for (i = 0; i < j; i = i+1) {

max_num = max_num + pow(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);

//

}

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值