如何在Vivado HLS中使用定点sin函数

时间:2017-12-05 13:38:11

标签: fixed-point sin vivado-hls

我正在计算极坐标系中给出的两条直线的交点:

@Override
public void onItemSelected(AdapterView<?> main, View view, int position,
        long Id) {

    if(position > 0){
      // get spinner value
    }else{
      // show toast select gender
    }

}

在我们的FPGA合成之后,我看到浮动正弦(和cos)的4个实现每个实现需要4800个LUT,这四个函数总计19000个LUT。我想通过使用固定点正弦来减少LUT计数。 I already found a implementationCORDIC但我不确定如何使用它。函数的输入是一个整数但我有一个typedef ap_fixed<16,3,AP_RND> t_lines_angle; typedef ap_fixed<16,14,AP_RND> t_lines_rho; bool get_intersection( hls::Polar_< t_lines_angle, t_lines_rho>* lineOne, hls::Polar_< t_lines_angle, t_lines_rho>* lineTwo, Point* point) { float angleL1 = lineOne->angle.to_float(); float angleL2 = lineTwo->angle.to_float(); t_lines_angle rhoL1 = lineOne->rho.to_float(); t_lines_angle rhoL2 = lineTwo->rho.to_float(); t_lines_angle ct1=cosf(angleL1); t_lines_angle st1=sinf(angleL1); t_lines_angle ct2=cosf(angleL2); t_lines_angle st2=sinf(angleL2); t_lines_angle d=ct1*st2-st1*ct2; // we make sure that the lines intersect // which means that parallel lines are not possible point->X = (int)((st2*rhoL1-st1*rhoL2)/d); point->Y = (int)((-ct2*rhoL1+ct1*rhoL2)/d); return true; } 数据类型。如何将此ap_fixed映射到整数?如何将3.13固定点映射到所需的2.14固定点?

2 个答案:

答案 0 :(得分:0)

在我的一位同事的帮助下,我找到了一个非常简单的解决方案,不需要任何手写实现或操纵定点数据:

使用String[] items = new String[]{ "Office", "Home", "College", "Uncle's Home", "CoDebuggers"}; int[] items_value = new String[]{ 4, 8, 9, 10, 55}; ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_dropdown_item, items); SpinnerName.setAdapter(adapter); 以及#!/bin/bash # Calculate num of changed, new lines on git per days (show your productivity) ds() { date --date="$1 days ago" +%Y-%m-%d } echo "GIT changes stat: Date, Total lines modified (New added, Changed)" for week in {13..0} do # git log outputs lines like: # 11 10 path/to/your/file.java # => add first two columns with awk lines_all=$(git --no-pager log --after=$(ds $week) --before=$(ds $(($week - 1))) --format=format: --numstat | awk '{s+=$1; s+=$2} END {print s/1}') lines_chg=$(git --no-pager log --after=$(ds $week) --before=$(ds $(($week - 1))) --format=format: --numstat | awk '{s+=$1;} END {print s/1}') lines_new=$(git --no-pager log --after=$(ds $week) --before=$(ds $(($week - 1))) --format=format: --numstat | awk '{s+=$2} END {print s/1}') #echo -e "$(ds $week): $lines_all \t\t(new: $lines_new, \tchanged: $lines_chg)" printf "%10s: %10s \t\t(new: %10s, \tchanged: %10s)\n" $(ds $week) $lines_all $lines_new $lines_chg done #include "hls_math.h"函数。

重要的是要说函数的输入应该是hls::sinf() hls::cosf()。可以将函数的输出分配给不同类型,例如ap_fixed<32, I>

示例:

I <= 32

LUT消费:

在我的情况下,对于每个函数的实现,LUT的消耗减少到400 LUT。

答案 1 :(得分:0)

您可以使用位切片来获取ap_fixed变量的分数和整数部分,然后对它们进行操作以获得新的ap_fixed。也许是这样的事情:

constexpr int max(int a, int b) { return a > b ? a : b; }

template <int W2, int I2, int W1, int I1>
ap_fixed<W2, I2> convert(ap_fixed<W1, I1> f)
{
    // Read fraction part as integer:
    ap_fixed<max(W2, W1) + 1, max(I2, I1) + 1> result = f(W1 - I1 - 1, 0);
    // Shift by the original number of bits in the fraction part
    result >>= W1 - I1;
    // Add the integer part
    result += f(W1 - 1, W1 - I1);
    return result;
}

我还没有很好地测试过这段代码,所以请耐心等待。