基礎008_定浮點轉化[floating point IP]


作者:桂。

時間:2018-05-15  21:55:50

鏈接:http://www.cnblogs.com/xingshansi/p/9042564.html 


前言

本文為Xilinx floating point IP的學習筆記,僅記錄最基礎的用法。參考文檔:pg060-floating-point.pdf

 一、IP核綜述

主要功能【基本思路是:1)輸入接口:定點轉浮點;2)各類浮點運算;3)輸出接口:浮點轉定點】:

其中floating point涉及三種格式:

1)half:半精度,16位 = 1位符號 + 5 位指數 + 10位小數

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:

定點轉浮點的對應關系:

二、仿真測試

 假設現在需要求: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,仿真結果與理論一致,此為資源評估的依據


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM