前面一篇隨筆敘述了關于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定點轉浮點模塊造成的誤差影響較小,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/256247.html
標籤:其他
下一篇:LeetCode——相同的樹
