打印

用Vivado-HLS实现低latency 除法器

[复制链接]
5151|12
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
GoldSunMonkey|  楼主 | 2013-3-25 18:09 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

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

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


2.2      创建新工程

       在 Welcome Page, 选择Create New Project


2.3      添加源文件

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


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


#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      添加测试文件

       添加测试文件.



#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, 时钟约束, 并选器件.


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


3      C Validation

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


       点击 “Run C Simulation” 图标,




4      C Synthesis

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


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


5      Explore 不同新的Solution

       project -> new solution。


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


---end---



评分
参与人数 1威望 +5 收起 理由
jakfens + 5 哈哈 给力

相关帖子

沙发
yuqq| | 2013-3-25 20:54 | 只看该作者
用 Vivado HLS这个工具生成的网表能在中低端的板子上用吗?

使用特权

评论回复
板凳
jakfens| | 2013-3-25 21:29 | 只看该作者
的÷÷哈哈 good job 这个喜欢

使用特权

评论回复
地板
pontiff| | 2013-3-25 21:35 | 只看该作者
猴哥还在这混呢,还以为搬家了呢

使用特权

评论回复
5
GoldSunMonkey|  楼主 | 2013-3-25 23:57 | 只看该作者
yuqq 发表于 2013-3-25 20:54
用 Vivado HLS这个工具生成的网表能在中低端的板子上用吗?

目前支持7系列和ZYNQ

使用特权

评论回复
6
GoldSunMonkey|  楼主 | 2013-3-25 23:57 | 只看该作者
jakfens 发表于 2013-3-25 21:29
的÷÷哈哈 good job 这个喜欢

欢迎啊

使用特权

评论回复
7
GoldSunMonkey|  楼主 | 2013-3-25 23:57 | 只看该作者
pontiff 发表于 2013-3-25 21:35
猴哥还在这混呢,还以为搬家了呢

没有啊

使用特权

评论回复
8
george7042646| | 2013-4-15 15:33 | 只看该作者
厉害厉害,这也能做的这么出色,果然是有高手在啊。。受益匪浅

使用特权

评论回复
9
hardfire| | 2013-4-15 16:08 | 只看该作者
哇,厉害,顶下。

使用特权

评论回复
10
Backkom80| | 2013-4-15 17:38 | 只看该作者

使用特权

评论回复
11
xuxikfg| | 2013-4-15 21:25 | 只看该作者
明显厉害人物

使用特权

评论回复
12
lelee007| | 2013-4-15 21:47 | 只看该作者
犀利

使用特权

评论回复
13
GoldSunMonkey|  楼主 | 2013-4-18 20:43 | 只看该作者
lelee007 发表于 2013-4-15 21:47
犀利

感谢

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:                     2014, 追逐梦想

264

主题

17215

帖子

523

粉丝