做者:桂。html
時間:2018-05-15 21:55:50學習
連接:http://www.cnblogs.com/xingshansi/p/9042564.html 測試
前言ui
本文爲Xilinx floating point IP的學習筆記,僅記錄最基礎的用法。參考文檔:pg060-floating-point.pdfspa
1、IP核綜述code
主要功能【基本思路是:1)輸入接口:定點轉浮點;2)各種浮點運算;3)輸出接口:浮點轉定點】:xml
其中floating point涉及三種格式:htm
1)half:半精度,16位 = 1位符號 + 5 位指數 + 10位小數blog
2)single:單精度,32位 = 1位符號 +8 位指數 + 23位小數接口
3)double:雙精度,64位 = 1位符號 + 11 位指數 + 52位小數
舉例:38414.4(10)=1001011000001110.0110011001100110011001100110011001100(2)
科學記數法爲:1.001011000001110 0110011001100110011001100110011001100,右移了15位,因此指數爲15。
其中 DSP slice usage:
對應註解:
In short, it is generally best to use DSP slices if you have them avaialable. They are free, faster, and lower power. If you are running low on them, you can go back and balance speed with area to use DSP slices at the bottlenecks of the design and use fabric where you don't need the speed. 簡而言之,DSP用的越多,時序能夠越快。
block memory usage:
定點轉浮點的對應關係:
2、仿真測試
假設如今須要求:13.24的天然對數【對數也能夠藉助CORDIC直接進行定點計算】。
13.24設置定點數:
s_axis_a_tdata自動擴展爲8的整數倍,如此處爲18,則輸出理論上爲24bits,其他補零便可。
此處求對數使用medium usage:
testbench文件:
`timescale 1ns / 1ps /* Function: DPRAM for data aligned Author: Gui. Data: 2018年5月15日22:43:11 */ module ln_tb; //parameter //logic logic clk,rst; logic signed [17:0] data; //initial initial begin clk = 0; rst = 1; data <= 0; #8 rst = 0; #20 data <= 18'b011010011110101110;//+13.24 #1000 $stop; end always #2 clk = ~clk; //main logic s_axis_a_tready; logic m_axis_result_tvalid; logic [31:0] m_axis_result_tdata; //fix to float fix_to_float fix_to_float_inst ( .aclk(clk), .s_axis_a_tvalid(1'b1), .s_axis_a_tready(s_axis_a_tready), .s_axis_a_tdata({6'b0,data}), .m_axis_result_tvalid(m_axis_result_tvalid), .m_axis_result_tready(1'b1), .m_axis_result_tdata(m_axis_result_tdata)//output ); //float calculation: ln(outout) logic [31:0] result; floating_point_0 floating_point_0_inst ( .aclk(clk), .s_axis_a_tvalid(1'b1), .s_axis_a_tready(), .s_axis_a_tdata(m_axis_result_tdata), .m_axis_result_tvalid(), .m_axis_result_tready(1'b1), .m_axis_result_tdata(result) ); //float to fix , ignored endmodule
第一步定點轉浮點:MATLAB輸出
>> dec2bin(hex2dec(num2hex((single(13.24))))) %浮點的定點顯示
%若是給了定點顯示,計算對應的浮點值的指令?
這涉及到:浮點數與16進制數的轉化,以32bit單精度爲例:
- 浮點數轉十六進制數:
num2hex(single(13.24))
- 十六進制轉浮點數(正數爲例,負數提取一個符號位便可,同時浮點->十六進制,只算絕對值):
function output = hex2float(a) %convert hex to float num = dec2bin(hex2dec((a))); L = length(num); exppos = num((L-23):-1:1); expnum = 0; for i = 1:length(exppos) expnum = expnum + str2num(exppos(i))*2^(i-1); end expnum = expnum - 2^7 + 1; fracpos = num(end-23:end); fracnum = 0; for i = 2:length(exppos); fracnum = fracnum + str2num(fracpos(i))*2^(-i+1); end fracnum = fracnum + 1; output = fracnum*2^expnum;從浮點角度對比FPGA與MATLAB輸出:
兩者很是接近。
對應VIVADO輸出:
對數運算結果:
MATLAB結果:
能夠看出與MATLAB計算結果基本一致。另外,可寫入module模塊,綜合後分析CLB、DSP等器件資源。
查看使用的器件資源:
定、浮點轉化,消耗的僅僅是邏輯資源LUT、FF,求對數過程當中,因爲選擇的是medium usage,對應四個DSP,仿真結果與理論一致,此爲資源評估的依據。