UPGRADE YOUR BROWSER

We have detected your current browser version is not the latest one. Xilinx.com uses the latest web technologies to bring you the best online experience possible. Please upgrade to a Xilinx.com supported browser:Chrome, Firefox, Internet Explorer 11, Safari. Thank you!

cancel
Showing results for 
Search instead for 
Did you mean: 
Xilinx Employee
Xilinx Employee
6,848 Views
Registered: ‎03-19-2013

用Vivado-HLS实现低latency 除法器

0 Kudos
2 Replies
ChinaForumAdmin
ChinaForumAdmin
6,837 Views
Registered: ‎01-31-2013

回复: 用Vivado-HLS实现低latency 除法器

 好文章,以下是文章的全文。大家也可以直接下载主贴的word版本。

 

 

用Vivado-HLS实现低latency 除法器

 

作者:George Wang – Xilinx DSP Specialist

 

                                                                                         

 

1         Vivado HLS 简介

2         创建一个Vivado-HLS工程

2.1      打开Vivado HLS GUI 

2.2      创建新工程

2.3      添加源文件

2.4      添加测试文件

2.5      创建solution

3         C Validation

4         C Synthesis. 13

5         Explore 不同新的Solution. 15

 

 

 

1      Vivado HLS 简介

 

        Xilinx Vivado High-Level Synthesis (HLS) 工具将 C, C++,或者 SystemC 设计规范,算法转成 Register Transfer Level (RTL)实现,可综合到Xilinx FPGA。

 

  • 将DSP算法快速转到RTL FPGA 实现
  • 将C 至 RTL时间缩短 4 倍
  • 基于 C 语言的验证时间缩短100倍
  • RTL 仿真时间缩短 3 倍

 

2      创建一个Vivado-HLS工程

 

2.1      打开Vivado HLS GUI

       双击桌面上Vivado HLS GUI 图标, 或从Start > All Programs >

 

       Vivado <version> > Vivado HLS GUI

1.png

 

       打开GUI之后,Vivado-HLS welcome界面如下所示:

2.png 

 

2.2      创建新工程

       在 Welcome Page, 选择Create New Project

3.png 

 

2.3      添加源文件

       指定顶层需要综合的源文件名,并添加文件.

4.png 

 

       本除法器设计采用移位算法

 

#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;          // <quo>+1 bits unsigned

  subtract_t   sub_out, rem_r;    // <divisor>+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 <<  (LOOP_MAX-i-2);

        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;

}

 

 

2.4      添加测试文件

       添加测试文件.

5.png 

 

 

#include <stdio.h>

#include <math.h>

 

#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);

 

//////////////////////////////////////////////////////////////////////////////

 

}

2.5      创建solution

       创建solution, 时钟约束, 并选器件.

 6.png

 

       打开包括工程信息Vivado HLS GUI.

 7.png

 

 3      C Validation

       在将c/c++/system c 转换成RTL之前,必须先验证C 设计,确保其功能是正确的

 

       点击 “Run C Simulation” 图标,

 8.png

 

 

 

4      C Synthesis

       现在可以对设计做C 综合,生成RTL代码. 当综合完成,, GUI 更新综合结果. 包括资源使用,latency等。

 9.png

 

        为了达到了预先要求为3 个时钟周期, 将latency 的directive设置为3。

 11.png

 

 5      Explore 不同新的Solution

       project -> new solution。

 

       在同一个工程里面,可以使用同一套源代码,进行不同solutions的尝试。

 11.png

 

 ---end---

 

 

 

 

---
^_^. 喵咿呜 @鱼猫饭
0 Kudos
Explorer
Explorer
6,765 Views
Registered: ‎01-31-2013

回复: 用Vivado-HLS实现低latency 除法器

缺radix2div.h, 该试验无法还原

-XILINX DFAE-
AVNET(安富利)北京
FPGA就用XILINX, 代理商只选安富利
0 Kudos