snifer

[原创]Vivado高效设计案例之基于C++的快速傅里叶变换

1
阅读(5186)

基于Xilinx的快速傅里叶变换IP块能够通过C++使用hls_fft.h库进行调用,这种IP在Xilinx文档中称为:LogiCORE™ IP快速傅里叶变换v9.0 (PG109).今天我主要讲一下如何通过C++代码来进行配置。

注:这对你理解IP的众多特性具有非常重要的作用。

要在你的C++代码中使用傅里叶变换,需要注意如下五个步骤:

1、在你的代码中包含hls_fft.h库文件。

2、利用预定义结构设置默认的参数::ip_fft::params_t

3、定义运行时间属性。

4、调用傅里叶函数

5、自适应的检查运行时间。

以下代码提供了一个如何执行每一步的总结,及具体的步骤。

首先,包含快速傅里叶库在源文件中,头文件位于include文件中,在执行的时候会自动的进行搜索。

#include "hls_fft.h"

定义快速傅里叶变换的固定参数,这包含了输入的宽度,通道的个数,结构的类型,且不会动态变换,快速傅里叶变换包含了参数结构:hls::ip_fft::params_t,这能够用于初始化所有的固定参数的默认值。

在这个案例中,关于输出顺序和宽度的默认值及属性和状态口能够通过用户定义的结构参数被重写:

struct param1 : hls::ip_fft::params_t {
static const unsigned ordering_opt = hls::ip_fft::natural_order;
static const unsigned config_width = FFT_CONFIG_WIDTH;
static const unsigned status_width = FFT_STATUS_WIDTH;
};
定义执行时间属性和执行时间状态的类型和变量,这些值能够是动态的,在C代码中定义,因此可以通过访问APIs来动态变化。

typedef hls::ip_fft::config_t<param1> config_t;
typedef hls::ip_fft::status_t<param1> status_t;
config_t fft_config1;
status_t fft_status1;
下一步,设置运行时间属性,这个案例设置了快速傅里叶变换的方向(前向或者后向):

fft_config1->setDir(direction);
fft_config1->setSch(0x2AB);
通过HLS的名称空间利用定义的固定属性调用傅里叶函数,也就是案例中的param1,这个函数蚕食是为了输入数据,输出数据,输出状态和输入属性。

hls::fft<param1> (xn1, xk1, &fft_status1, &fft_config1);

最后检查输出的状态,在本案例中检查了溢出标志,并且在变量“ovflo”中存储其结果。

*ovflo = fft_status1->getOvflo();

在FFT C库中提供了Vivado HLS的案例,通过如下的顺序打开:

Help > Welcome > Open Example Project > Design Examples > FFT.
喜欢的朋友可以尝试一下,今天就写这么多吧,快国庆节了,提前祝大家:国庆快乐、

Baidu
map