前面一篇随笔叙述了关于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. Codeforces 1355 E. Restorer Distance(三分)

    传送门:E - Restorer Distance  题意:给出四个数 N, A, R, M ,然后给出一个长度为N的序列.让一个数+1花费A,-1花费R,从一个大的数向一个小的数移动1花费M.问让所 ...

  2. UVALive 7276 Wooden Signs

    详细题目见:http://7xjob4.com1.z0.glb.clouddn.com/0f10204481da21e62f8c145939e5828e 思路:记dp[i][j]表示第i个木板尾部在j ...

  3. Kafka SASL/SCRAM+ACL实现动态创建用户及权限控制

    kafka系列文章 第一章 linux单机安装kafka 第二章 kafka--集群安裝部署(自带zookeeper) 第三章 Kafka SASL/SCRAM+ACL实现动态创建用户及权限控制 Ka ...

  4. [Golang]-6 超时处理、非阻塞通道操作、通道的关闭和遍历

    目录 超时处理 非阻塞通道操作 通道的关闭 通道遍历 超时处理 超时 对于一个连接外部资源,或者其它一些需要花费执行时间的操作的程序而言是很重要的. 得益于通道和 select,在 Go中实现超时操作 ...

  5. Redis Cluster 分布式集群(下)

    Redis Cluster 搭建(工具) 环境准备 节点 IP 端口 节点① 172.16.1.121 6379,6380 节点② 172.16.1.122 6379,6380 节点③ 172.16. ...

  6. eclipse中使用debug,显示参数配置

    打开Window---->Preferences------>java------>Editor-------->Hovers 效果:

  7. Java 并发机制底层实现 —— volatile 原理、synchronize 锁优化机制

    本书部分摘自<Java 并发编程的艺术> 概述 相信大家都很熟悉如何使用 Java 编写处理并发的代码,也知道 Java 代码在编译后变成 Class 字节码,字节码被类加载器加载到 JV ...

  8. Leetcode(32)-最长有效括号

    给定一个只包含 '(' 和 ')' 的字符串,找出最长的包含有效括号的子串的长度. 示例 1: 输入: "(()" 输出: 2 解释: 最长有效括号子串为 "()&quo ...

  9. How to get the real screen size(screen resolution) by using js

    How to get the real screen size(screen resolution) by using js 获取用户屏幕的真实像素分辨率, 屏幕实际尺寸 window.deviceP ...

  10. CDN 工作原理剖析

    CDN 工作原理剖析 CDN / Content Delivery Network / 内容分发网络 https://www.cloudflare.com/zh-cn/learning/cdn/wha ...