前面一篇随笔叙述了关于MATLAB中FFT_HDL_Optimzed模块定点(IEEE754单精度float格式)二进制与十进制转换实现,有需要的往前翻一下即可。这一篇随笔将叙述 FFT HDL Optimized 模块实现 8192 burst Radix 2 结构的定点 FFT (定点格式依照 IEEE-754 single-precision format,小数为 23 位二进制精度),并通过 Xilinx LogiCORE FFT MEX Function interface 进行单精度浮点与 FFT HDL Optimzed 模块定点输出的正确性(误差性)检测过程,并附加FFT HDL Optimized 模块 8192 Streaming Radix 2^2 详细测试。

Parameters:

  整个系统输入为 32 位 1D array of complex data 单精度浮点数据,FFT HDL Optimized 模块生成是基于 MATLAB2018b,Vivado 2018.3,Modelsim SE-64 10.7 平台。FFT HDL Optimized 模块的参数
  ①FFT Length = 8192
  ②Burst Radix 2
  ③顺序输入 顺序输出

具体步骤:

  (1)进入 MATLAB2018b,打开 Simulink,新建 mode,My_fft;
  (2)接入如图所示模块;

Simulink 整体框图例如图所示:(for example)

subsys 子系统框图如图所示:


  其中 valid 给高电平,输入有效,而 data 通过 Sine Wave 模块进行输入,其中 fft_input_s、fft_hdl_in、fft_hdl_out 均为 To Workspace 模块(Savemode 选择 array),convert 模块转换输入的数据形式:32 位 1D array of complex data 浮点->32 为 fixdt(1,32,14),To Sample 模块改变输出信号的采样模式。重要模块的参数设置如图:

Sine Wave 模块

FFT HDL Optimized 模块

  (3)Simulink run simulation,仿真成功后,在 Workspace 会出现三个参数
的值:fft_hdl_in、fft_hdl_out、fft_input_s(后面会用到);
  (4)回到 MATLAB 命令窗口中,返回到 simulink mode-My_fft 所在的目录;
  (5)建立 Synthesis Tool Path,通过使用 hdlsetuptoolpath 命令;
  (6)在 MATLAB 命令窗口中,输入 hdlsetup(My_fft);
  (7)在 simulink 中,选择 code>HDL Code>HDL Workflow Advisor;


  (8)在 HDL Workflow Advisor 窗口中,在 Set Target > Set Target Device and Synthesis Tool step, for Synthesis tool, select Xilinx Vivado and click Run This Task;
  (9)在 Set Target > Set Target Frequency step,click run the task;
  (10)Right-click Prepare Model For HDL Code Generation and select Run All;
  (11)In the HDL Code Generation > Set Code Generation Options > Set Basic Options step, select the following options, then click Apply:
  • For Language, select Verilog.
  • Enable Generate traceability report.
  • Enable Generate resource utilization report.
  (12)Right-click the HDL Code Generation > Generate RTL Code and Testbenchstep, and select Run to Selected Task.(在 Run to Selected 之前需要勾上 Generate RTL code 和 Generate RTL testbench);
  (13)等待一段时间,成功后会生成对应的报告,代码在指定的目录文件下;下面步骤为生成 FFT HDL 代码后进行 Modelsim 仿真,如果不需要进行仿真可以跳过(14)-(16)下面的步骤
  (14)进入 Modelsim software,通过 tcl 切换到刚刚生成 HDL 代码的目录;
  (15)在 tcl 输入 subsys_tb_compile.do;
  (16)在 tcl 输入 subsys_tb_sim.do;
  结束 Modelsim 仿真,下面为 FFT HDL Optimized 模块的正确性(误差性)检测过程,检测过程为使用 Xilinx 提供的 xfft MATLAB mex 函数接口进行检测:
  (17)打开 Vivado 软件,新建工程,在 Vivado IP 目录输入 FFT,找到LogiCORE Fast Fourier Transform,设置与前面对应的参数(FFT_length、Arch、浮点处理类型),最后点 generate IP;
  (18)IP 生成后,回到工程目录,找到xxx\xxx.srcs\sources_1\ip\xfft_0\cmodel 文件,解压 xfft_v9_1_bitacc_cmodel_nt64.zip 压缩包(适合与 windows 系统,对于linux 系统解压 xfft_v9_1_bitacc_cmodel_lin64.zip 压缩包),解压完成,得到下面文件: 


  (19)打开 MATLAB,在 MATLAB 命令窗口跳转到xfft_v9_1_bitacc_cmodel_nt64.zip 压缩包解压文件目录下;
  (20)在执行下面步骤之前,电脑需要安装有编译器如 Microsoft Visual Studio 201x、MinGW64 等,可以通过 mex –setup 指令进行查看是否安装,也可以指定编译器;
  (21)执行 make_xfft_v9_1_mex.m 来建立 MEX function(而如何实现的自己可以网上搜一下);
  (22)在当前目录查看是否存在 xfft_v9_1_bitacc_mex.mexw64 文件(windows 系统);
  (23)通过在命令窗口运行 xfft_v9_1_bitacc_mex.mexw64 FFT MEX function 可以看到它的输入输出参数细节:[output_data, blk_exp, overflow] = xfft_v9_1_bitacc_mex(generics,nfft, input_data,scaling_sch, direction)(具体参数情况可以参照 pg109-xfft Xilinx 官方手册,而手册可以直接去Xilinx 官网也可以在 Logicore FFT IP 核生成的时候点击上方的 help 来查找文档);
  (24)之后打开 run_xfft_v9_1_mex.m 文件(MEX Function Example Code),需要对文件进行参数的修改(参数含义看 xfft_):
1   generics.C_NFFT_MAX = 13; %fft length = 8192
2   generics.C_ARCH = 2; %Burst Radix 2
3   generics.C_HAS_NFFT = 0;
4   generics.C_USE_FLT_PT = 1; %浮点
5   generics.C_INPUT_WIDTH = 32; % Must be 32 if C_USE_FLT_PT = 1
6   generics.C_TWIDDLE_WIDTH = 24; % Must be 24 or 25 if C_USE_FLT_PT =1
7   generics.C_HAS_SCALING = 0; % Set to 0 if C_USE_FLT_PT = 1
8   generics.C_HAS_BFP = 0; % Set to 0 if C_USE_FLT_PT = 1
9   generics.C_HAS_ROUNDING = 0; % Set to 0 if C_USE_FLT_PT = 1
部分代码进行注释
 1 % % Check xk_re and xk_im data: Only xk_re[0] should be non-zero
2 % if output(1) ~= expected_xk_re_0
3 % if channels > 1
4 % error('ERROR: Channel %d xk_re[0] is incorrect:
5 expected %f + j%f, actual %f +
6 j%f\n',channel,real(expected_xk_re_0),imag(expected_xk_re_0),real(out
7 put(1)),imag(output(1)))
8 % else
9 % error('ERROR: xk_re[0] is incorrect: expected %f + j%f,
10 actual %f +
11 j%f\n',real(expected_xk_re_0),imag(expected_xk_re_0),real(output(1)),
12 imag(output(1)))
13 % end
14 % end
15 %
16 % % Check all other sample values are zero
17 % for n = 2:samples
18 % if output(n) ~= 0 + 0j
19 % if channel > 1
20 % error('ERROR: Channel %d output sample %d is incorrect:
21 expected %f +j%f, actual %f +
22 j%f\n',channel,n,0.0,0.0,real(output(1)),imag(output(1)))
23 % else
24 % error('ERROR: output sample %d is incorrect: expected %f
25 +j%f, actual %f + j%f\n',n,0.0,0.0,real(output(1)),imag(output(1)))
26 % end
27 % end
28 % end
  (25)运行配置好的 run_xfft_v9_1_mex.m 文件,之后再修改 run_xfft_v9_1_mex.m 文件,修改:input_raw(1:samples) = fft_input_s(1:samples);其他条件不变,再次运行配置好的 run_xfft_v9_1_mex.m 文件;
  (26)在 Worksapce 找到 out 变量(其中 out 变量为经过 FFT MEX Function 得到的结果,经 FFT MEX Function 处理了浮点数据之后得到的 double 类型数据);
  (27)之后在命令行 fft_hdl_out_test(1:8192)=fft_hdl_out(57578:65769);(其中 fft_hdl_out 为经过 FFT HDL Optimized 定点输出数据,而从 57578 开始是因为 57577 及前面的数据为 input 与 output 之间的 Latency,所有值为0);
~~~~~~~~
~~~~
~~~~
~~~~
  (28)进行FFT数据的比较,即Xilinx LogiCORE FFT IP核运算输出结果与Simulink FFT HDL Optimized模块输出结果对比,通过编写一个脚本,用plot函数进行对比: 

测试说明:

  ①测试是通过对 FFT HDL Optimized 的输出或 FFT HDL Optimized 输出经过convert 定点转浮点的输出结果的绝对值 A 与 Xilinx FFT MEX Function 接口输出 B 绝对值之间的差值:abs(A)-abs(B);
  ②在测试中,以 Xilinx FFT MEX Function 输出为参考值(标准值);
  ③在进行 diff/reference result 计算时,因为 result 值太小及出现一些问题所以没有进行百分比的显示,现在给出 abs(Xilinx FFT MEX Function 接口输出 B)的图解,测试时 Sine 模块幅值为 0.9,以第一个 8192 点为例,在其他计算情况下,结果基本相同:

测试一

  Xilinx FFT MEX 函数的接口的运算方式设置为浮点测试,convert 模块转换输出的数据形式为 fixdt(1,32,14),(Sine 模块的幅值为 1.0)abs(fft_hdl_out_test(countx))-abs(output(countx))FFT HDL Optimized 模块的 Data Types 为 Rounding Method = Floor
abs(fft_hdl_out_test(countx)- output(countx)) 

测试二

  Xilinx FFT MEX函数的接口的运算方式设置为浮点测试,修改convert模块转换输出的数据形式(其他条件不变):fixdt(1,32,23),与IEEE-754
single-precision 格式一致,小数部分为23位二进制精度,(Sine模块的幅值为1.0)FFT HDL Optimized模块的Data Types为Rounding Method = Floor
abs(fft_hdl_out_test(countx))-abs(output(countx))

测试三

  Xilinx FFT MEX函数的接口的运算方式设置为浮点测试,修改Simulinkmode 中Sine模块的幅值为0.9(与测试四相比其他条件不变)fixdt(1,32,23),
与IEEE-754 single-precision 格式一致,小数部分为23位二进制精度FFT HDL Optimized模块的Data Types为Rounding Method = Floor
abs(fft_hdl_out_test(countx))-abs(output(countx))

测试四

  Xilinx FFT MEX 函数的接口的运算方式设置为定点测试,修改 convert模块转换输出的数据形式(其他条件不变):fixdt(1,32,23),与 IEEE-754
single-precision 格式一致,小数部分为 23 位二进制精度,且run_xfft_v9_1_mex.m 文件中 generics.C_TWIDDLE_WIDTH 设置为 26;
FFT HDL Optimized模块的Data Types为Rounding Method = Floor
  (Sine 模块的幅值为 0.9)

测试五

  Xilinx FFT MEX 函数的接口的运算方式设置为 浮 点 测 试 ,fixdt(1,32,23),与 IEEE-754 single-precision 格式一致,小数部分为 23
位二进制精度,结构改为 Streaming Radix 2^2 ,此为第一个 8192 点FFT HDL Optimized模块的Data Types为Rounding Method = Floor
  (Sine 模块的幅值为 0.9)


  Xilinx FFT MEX 函数的接口的运算方式设置为浮点测试, fixdt(1,32,23),与 IEEE-754 single-precision 格式一致,小数部分为 23 位二进制精度,
结构改为 Streaming Radix 2^2 ,此为测试五第二个 8192 点
  (Sine 模块的幅值为 0.9)
 


  Xilinx FFT MEX 函 数 的 接 口 的 运 算 方 式 设 置 为 浮 点 测 试 ,fixdt(1,32,23),与 IEEE-754 single-precision 格式一致,小数部分为 23位二进制精度,结构改为 Streaming Radix 2^2 ,此为测试五第三个 8192点
  (Sine 模块的幅值为 0.9)


  Xilinx FFT MEX 函 数 的 接 口 的 运 算 方 式 设 置 为 定 点 测 试 ,fixdt(1,32,23),与 IEEE-754 single-precision 格式一致,小数部分为 23位二进制精度,且 run_xfft_v9_1_mex.m 文件中 generics.C_TWIDDLE_WIDTH设置为 26;结构改为 Streaming Radix 2^2 ,此为测试五第三个 8192 点

测试六

  Xilinx FFT MEX 函数的接口的运算方式设置为定点测试,系统直接输出定点 fixdt(1,32,23)数据,与 IEEE-754 single-precision 格式一致,小数部
分为 23 位二进制精度,结构改为 Streaming Radix 2^2,此为第一个 8192 点FFT HDL Optimized模块的Data Types为Rounding Method = Floor
  (Sine 模块的幅值为 0.9)
 
  Xilinx FFT MEX 函数的接口的运算方式设置为定点测试,系统直接输出定点 fixdt(1,32,23)数据,与 IEEE-754 single-precision 格式一致,小数部
分为 23 位二进制精度,结构改为 Streaming Radix 2^2,此为第二个 8192 点FFT HDL Optimized模块的Data Types为Rounding Method = Floor
  (Sine 模块的幅值为 0.9)
  Xilinx FFT MEX 函数的接口的运算方式设置为定点测试,系统直接输出定点 fixdt(1,32,23)数据,与 IEEE-754 single-precision 格式一致,小数部
分为 23 位二进制精度,结构改为 Streaming Radix 2^2,此为第三个 8192 点FFT HDL Optimized模块的Data Types为Rounding Method = Floor
  (Sine 模块的幅值为 0.9)

测试七

  Xilinx FFT MEX 函数的接口的运算方式设置为定点测试,系统直接输出定点 fixdt(1,32,23)数据,与 IEEE-754 single-precision 格式一致,小数部
分为 23 位二进制精度,结构为 Streaming Radix 2^2,此为第一个 8192 点FFT HDL Optimized模块的Data Types为Rounding Method = Ceiling
  (Sine模块的幅值为0.9)
  Xilinx FFT MEX 函数的接口的运算方式设置为定点测试,系统直接输出定点 fixdt(1,32,23)数据,与 IEEE-754 single-precision 格式一致,小数部
分为 23 位二进制精度,结构为 Streaming Radix 2^2,此为第二个 8192 点FFT HDL Optimized模块的Data Types为Rounding Method = Ceiling
  (Sine模块的幅值为0.9)
  Xilinx FFT MEX 函数的接口的运算方式设置为定点测试,系统直接输出定点 fixdt(1,32,23)数据,与 IEEE-754 single-precision 格式一致,小数部
分为 23 位二进制精度,结构为 Streaming Radix 2^2,此为第三个 8192 点FFT HDL Optimized模块的Data Types为Rounding Method = Ceiling
  (Sine模块的幅值为0.9)

测试八

  Xilinx FFT MEX 函数的接口的运算方式设置为浮点测试,系统直接输出定点 fixdt(1,32,23)数据,与 IEEE-754 single-precision 格式一致,小数部分为 23 位二进制精度,结构改为 Streaming Radix 2^2,此为第一个 8192 点,且在模块输出加了定点转浮点输出 FFT HDL Optimized 模块的 Data Types 为
Rounding Method = Floor
  (Sine 模块的幅值为 0.9)
 
  Xilinx FFT MEX 函数的接口的运算方式设置为浮点测试,系统直接输出定点 fixdt(1,32,23)数据,与 IEEE-754 single-precision 格式一致,小数部分为 23 位二进制精度,结构改为 Streaming Radix 2^2,此为第二个 8192 点,且在模块输出加了定点转浮点输出 FFT HDL Optimized 模块的 Data Types 为
Rounding Method = Floor
  (Sine 模块的幅值为 0.9)
  Xilinx FFT MEX 函数的接口的运算方式设置为浮点测试,系统直接输出定点 fixdt(1,32,23)数据,与 IEEE-754 single-precision 格式一致,小数部分为 23 位二进制精度,结构改为 Streaming Radix 2^2,此为第三个 8192 点,且在模块输出加了定点转浮点输出 FFT HDL Optimized 模块的 Data Types 为
Rounding Method = Floor
  (Sine 模块的幅值为 0.9)

测试结果说明:

(1)测试一

  通过测试一结果图可以看出其运算误差有点大,经过后面测试可以发现其主要原因是因为convert模块的fixdt(1,32,x)中x的影响,测试二及以后的测试均与 IEEE-754 single-precision 格式一致,小数部分为23位二进制精度,即fixdt(1,32,23)。

(2)测试二与测试三


  在修改前面的浮点转定点参数后,FFT HDL Optimized 模块的运算结果变得精确了,误差较小,差值大概在±2×10-4,diff/reference 大概在 10-5 左右,而为什么选择 0.9 幅值,是因为在做定点运算的时候,Sine 模块幅值 1.0 在输入至 Xilinx FFT MEX Function 在运算中会产生溢出,经测试,1.0 与 0.9 产生的结果基本一致。

(3)测试四


  测试四是与测试三对应的,除了修改了 MEX 定点参数,其他均没有变化,进行定点测试。在定点测试结果中,差值大概在±8×10-6,diff/reference 大概在 10-7左右,从结果说明在定点测试中,FFT HDL Optimized 模块计算误差小。

(4)测试五


  测试五相比测试一至测试四,最大差别是修改了 FFT HDL Optimized 模块的内部结构即 Streaming Radix 2^2,因为在 Burst Radix 2 结构中,运行时间慢,且在进行第一个 8192 点之后处理之后,后续的 8192 点间隔很大,难以对 FFT HDL Optimized模块与 MEX 进行不同情况下进行测试(两种结构详细区别需看 doc 文档)。在测试五Streaming 情况下,选定了后续三个 8192 点进行测试对比,来说明精度情况。在三轮结果测试中,差值大概均在±2×10-4,diff/reference 大概在 10-5 左右,误差较小。
  同时在 Streaming Radix 2^2 结构下,进行了第三个 8192 点的定点测试。


  在三个 8192 的定点测试中,差值大概在±8×10-6,diff/reference 大概在 10-7左右,误差小。

(5)测试六


  测试六过程中,Sine 模块直接输出定点 fixdt(1,32,23)数据,MEX 进行定点测试。在测试六 Streaming 情况下,选定了后续三个 8192 点进行测试对比,进一步说明定点精度。定点测试结果中,差值大概在±8×10-6,diff/reference 大概在 10-7 左右,从结果说明在定点测试中,FFT HDL Optimized 模块计算误差小。

(6)测试七


  测试七过程中,与测试六相比,改了 FFT HDL Optimized 模块的 data type 模式,即 Rounding Method = Ceiling 模式,Sine 模块直接输出定点 fixdt(1,32,23)数据,MEX 进行定点测试。在测试七 Streaming 情况下,也选定了后续三个 8192 点进行测试对比,来说明 FFT HDL Optimized 模块的不同 data type 模式下的精度区别。定点测试结果中,差值大概在±8×10-6,diff/reference 大概在 10-7 左右,从结果说明在定点测试中, FFT HDL Optimized 模块的不同 data type 模式下的精度区别不大。
 

(7)测试八


  相比测试五而言,在FFT HDL Optimized模块输出加了定点转浮点convert模块。在测试八Streaming情况下,选定了后续三个8192点进行测试对比,来说明精度情况。在三轮结果测试中,差值大概均在±2×10-4,diff/reference大概在10-5左右,误差较小,与测试五结果基本一致,也说明输出后加的convert定点转浮点模块造成的误差影响较小。

FFT HDL Optimized模块HDL综合代码生成及与Xilinx xfft IP MEX接口精度详细比较的更多相关文章

  1. HDL代码风格建议(1)使用示例和IP

    Recommended HDL Coding Styles HDL coding styles can have a significant effect on the quality of resu ...

  2. paper:基于verilog HDL 的高速可综合FSM设计

    1.寄存器输出型状态机 VS 组合逻辑输出型状态机 2.状态编码方法 这块讲的不好,也比较少. 3.系统设计中模块划分的指导性原则

  3. 【精选】Nginx模块Lua-Nginx-Module学习笔记(一)Nginx Lua API 接口详解

    源码地址:https://github.com/Tinywan/Lua-Nginx-Redis 一.介绍 各种* _by_lua,* _by_lua_block和* _by_lua_file配置指令用 ...

  4. Spring py登陆模块(包含 记录登陆时间,记录ip,增加积分)

    嘛基于最近的复习准备写个关于spring登陆模块的小程序 虽然小但是五脏俱全呐 话不多说让我来介绍一下今天的登陆程序. 这些是 基于Spring JDBC 的持久层实现 基于Spring 声明事物的业 ...

  5. Nginx模块Lua-Nginx-Module学习笔记(一)Nginx Lua API 接口详解

    源码地址:https://github.com/Tinywan/Lua-Nginx-Redis 一.介绍 各种* _by_lua,* _by_lua_block和* _by_lua_file配置指令用 ...

  6. 第6课:datetime模块、操作数据库、__name__、redis、mock接口

    1.  datetime模块 import datetime print(datetime.datetime.today()) # 当前时间 2018-01-23 17:22:35.739667 pr ...

  7. 2020年,最新NGINX的ngx_http_geoip2模块以精准禁止特定国家或者地区IP访问

    1.0 geoip2核心识别库 安装geoip2 lib步骤: cd /usr/local/src .tar.gz wget https://github.com/maxmind/libmaxmind ...

  8. 代码生成java连接数据库的所需代码(超详细)

    开始学习: round 1:(一开始学习当然还是要一步一步学习的啦,哪有什么一步登天!!!) a.准备工作:1.eclipse,mysql(这两个软件肯定要的啦,不然学什么把它们连接起来) 2.加载驱 ...

  9. 使用requests模块进行封装,帮你如何处理restful类型的接口

    import requests import urllib3 urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning) c ...

随机推荐

  1. 「LYOI2018 Summer」Hzy's Rabbit Candy----拓扑排序问题

    「LYOI2018 Summer」Hzy's Rabbit Candy 题目描述 Hzy 和她的 m 只兔兔在一个 n 个点 m 条边的有向无环图上玩. 为了让兔兔们开心,Hzy 带了一些糖.Hzy ...

  2. Uva 10815 Andy's First Dictionary(字符串)

    题目链接:https://vjudge.net/problem/UVA-10815 题意 找出一段文本中的所有单词,以小写形式按照字典序输出. 思路 用空白符替换文本中所有非字母字符后再次读入. 代码 ...

  3. UVA-257 哈希算法

    UVA-257 题意: 给你很多串,你需要找到这个串内有没有两个长度大于3的回文字符串,且要保证这两个回文字符串不相同,也不能完全覆盖,但可以重合一部分 题解: 首先判断回文的话可以通过马拉车算法(M ...

  4. 用数组模拟STL中的srack(栈)和queue(队列)

    我们在理解stack和queue的基础上可以用数组来代替这两个容器,因为STL中的stack和queue有可能会导致程序运行起来非常的慢,爆TLE,所以我们使用数组来模拟他们,不仅可以更快,还可以让代 ...

  5. 大数据开发-Spark-初识Spark-Graph && 快速入门

    1.Spark Graph简介 GraphX 是 Spark 一个组件,专门用来表示图以及进行图的并行计算.GraphX 通过重新定义了图的抽象概念来拓展了 RDD: 定向多图,其属性附加到每个顶点和 ...

  6. Butterfly美化

    Butterfly美化 首先提示,本文量特别大哦!基本上有所有的美化,还在持续更新ing,谨慎入坑......... 主题配置文件修改 基础配置 最最最开始的,好不容易搭建了自己的个人博客,当然要写上 ...

  7. CPU饥饿与线程饥饿

    线程饥饿: 进程无法得到资源,(cpu或者io资源或者别的什么资源),所以无法进行下去 比如说读者写者问题,如果读者优先,那么写者可能会饿死. 又比如操作系统概念的一道习题. 用broadcast可能 ...

  8. C# 类(9) - 接口 Interface

    Interface 接口 类似 抽象类,也不能被实例化...(前面说的静态类,加上抽象类,还有这个,都3个了)接口其实比 抽象类 更加抽象.接口的方法(这个方法还不能有实体代码,和抽象类的抽象方法差不 ...

  9. 三、mysql主从复制

    1 MySQL 主从复制 1.1 主从复制的含义 在 MySQL 多服务器的架构中,至少要有一个主节点(master),跟主节点相对的,我们把它叫做从节点(slave). 主从复制,就是把主节点的数据 ...

  10. i18n 和 L10n (internationalization and localization) 国际化与本地化(具有全球战略眼光的公司企业的必由之路)

    i18n 和 L10n (internationalization and localization)  国际化与本地化(具有全球战略眼光的公司企业的必由之路) 1 1 https://zh.wiki ...