0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

Xilinx Floating-Point 浮點(diǎn)IP加減法的仿真驗(yàn)證案例

454398 ? 來(lái)源:FPGA開源工作室 ? 作者:OpenSLee ? 2020-11-13 11:06 ? 次閱讀

作者:OpenSLee

1、float IP的創(chuàng)建

搜索float雙擊Floating-point

1 > Operation Selection 我們這里選擇浮點(diǎn)數(shù)的加減法驗(yàn)證。

2 > Precision of Inputs 我們選擇單晶浮點(diǎn)數(shù)(Single),指數(shù)位寬Exponent Width 8bit 尾數(shù)位寬24 bit

3 > Optimizations默認(rèn)值

4 > Interface Options Latency選擇1

2、浮點(diǎn)IP加減法的仿真驗(yàn)證

我們用python 自動(dòng)生成100000個(gè)隨機(jī)浮點(diǎn)數(shù)a和b以及a和b的相加或相減的結(jié)果。

python代碼(float32(a)+float32(b)=float32(c)):

import bitstring, random 
span = 10000000
iteration = 100000

def ieee754(flt):
    b = bitstring.BitArray(float=flt, length=32)
    return b

with open("TestAdd.txt", "w") as f:
    for i in range(iteration):
        a = ieee754(random.uniform(-span, span))
        b = ieee754(random.uniform(-span, span))
        ab = ieee754(a.float  + b.float)
        f.write(a.hex +"_" +  b.hex  +  "_" + ab.hex + "/n")

浮點(diǎn)數(shù)加法驗(yàn)證python結(jié)果(部分):

4a953fc4_ca39838f_49e1f7f2
4b14900e_492290ab_4b1eb919
4aedbfc3_4b146c7e_4b85a630
ca4bb7f6_cb162f1d_cb491d1a
ca1ca77e_4ad19cc6_4a834907
c96e52c3_c9c7778d_ca1f5077
4ab9c1cc_cb187d76_ca6e7240
4b18508e_4a8e5556_4b5f7b39
cb103fa5_ca1765cf_cb361919
4a09db98_ca2feb0d_c9183dd4
ca626910_4a991e54_499fa730
c983aaa6_4b0534fd_4ae97f50
49e9e5f2_cad6005d_ca9b86e0
491b3266_4a3e2d28_4a64f9c2
ca935d66_caae8cbc_cb20f511
4a150544_4a645ebe_4abcb201

3、xilinx float IP的加法驗(yàn)證

s_axis_a_tdata,s_axis_b_tdata和m_axis_result_tdata分別代表浮點(diǎn)操作的a,b和結(jié)果c。

s_axis_operation_tdata的最低位為0時(shí)為加法,為1時(shí)為減法運(yùn)算。

m_axis_result_tvalid當(dāng)次信號(hào)為1時(shí),結(jié)果有效。

浮點(diǎn)數(shù)加減法仿真頂層Float_AddSub_tb:

`timescale 1ns / 1ps
`define N_TESTS 100000
module Float_AddSub_tb();
    
 reg aclk;                           
 reg s_axis_a_tvalid;                
 wire s_axis_a_tready;               
 reg [31 : 0] s_axis_a_tdata;        
 reg s_axis_b_tvalid;                
 wire s_axis_b_tready;               
 reg [31 : 0] s_axis_b_tdata;        
 reg s_axis_operation_tvalid;        
 wire s_axis_operation_tready;       
 reg [7 : 0] s_axis_operation_tdata; 
 wire m_axis_result_tvalid;          
 reg m_axis_result_tready;           
 wire [31 : 0] m_axis_result_tdata;

reg [95:0] testVector [`N_TESTS-1:0];
reg test_stop;
reg [31:0] Expected_result;
reg [31:0] Expected_result_r;
integer mcd;
integer test_n;
integer pass;
integer error;

initial begin
  aclk = 0;
  test_n = 0;
  pass =0;
  error = 0;
  test_stop =0;
  s_axis_a_tvalid = 0;
  s_axis_b_tvalid = 0;
  Expected_result = 0;
  Expected_result_r = 0;
  s_axis_a_tdata = 0;
  s_axis_b_tdata = 0;
  s_axis_operation_tvalid = 1;
  s_axis_operation_tdata =8'b0000_0000;//Add
  //s_axis_operation_tdata =8'b0000_0001;//Sub
  m_axis_result_tready = 1;
  $readmemh("TestAdd.txt", testVector);//Add
  mcd = $fopen("ResultsAdd.txt");//Add
  
  //$readmemh("TestSub.txt", testVector);//Sub
 //mcd = $fopen("ResultsSub.txt");//Sub
  
  repeat(100000) begin
   #10 test_n = test_n + 1'b1;
  end
  
  wait(test_stop==1'b1)begin
    $fclose(mcd);
    $finish;
  end
end


always #(5) aclk = ~aclk;
  
  always @(posedge aclk) begin
    Expected_result_r  %d",test_n);
          pass = pass + 1'b1;
        end


      if ((m_axis_result_tvalid == 1) && (m_axis_result_tdata[31:11] != Expected_result_r[31:11]))
        begin
          $fdisplay (mcd,"Test Failed Expected Result = %h, Obtained s_axis_b_tdata = %h, Test Number -> %d",Expected_result,s_axis_b_tdata,test_n);
          error = error + 1'b1;
        end
      
      if (test_n >= `N_TESTS) 
      begin
        $fdisplay(mcd,"Completed %d tests, %d passed and %d fails.", test_n, pass, error);
        test_stop = 1'b1;
      end
  end    
//----------- Begin Cut here for INSTANTIATION Template ---// INST_TAG
floating_AddSUB your_instance_name (
  .aclk(aclk),                                        // input wire aclk
  .s_axis_a_tvalid(s_axis_a_tvalid),                  // input wire s_axis_a_tvalid
  .s_axis_a_tready(s_axis_a_tready),                  // output wire s_axis_a_tready
  .s_axis_a_tdata(s_axis_a_tdata),                    // input wire [31 : 0] s_axis_a_tdata
  .s_axis_b_tvalid(s_axis_b_tvalid),                  // input wire s_axis_b_tvalid
  .s_axis_b_tready(s_axis_b_tready),                  // output wire s_axis_b_tready
  .s_axis_b_tdata(s_axis_b_tdata),                    // input wire [31 : 0] s_axis_b_tdata
  .s_axis_operation_tvalid(s_axis_operation_tvalid),  // input wire s_axis_operation_tvalid
  .s_axis_operation_tready(s_axis_operation_tready),  // output wire s_axis_operation_tready
  .s_axis_operation_tdata(s_axis_operation_tdata),    // input wire [7 : 0] s_axis_operation_tdata
  .m_axis_result_tvalid(m_axis_result_tvalid),        // output wire m_axis_result_tvalid
  .m_axis_result_tready(m_axis_result_tready),        // input wire m_axis_result_tready
  .m_axis_result_tdata(m_axis_result_tdata)           // output wire [31 : 0] m_axis_result_tdata
);

endmodule

仿真結(jié)果:

Completed      100000 tests,       99999 passed and           0 fails.

通過(guò)仿真xilinx浮點(diǎn)ip的計(jì)算結(jié)果與python代碼的輸出結(jié)果一致,仿真成功。大家可以按照此方法仿真其他的算法中的計(jì)算公式或過(guò)程。首先利用C、matlab或者python等高級(jí)語(yǔ)言將算法的輸入和輸出一起打印出來(lái),然后再讀入到verilog的算法模型里面,通過(guò)打印出計(jì)算結(jié)果或誤差來(lái)分析我們自己的算法的錯(cuò)誤或者誤差出現(xiàn)在哪里。

編輯:hfy

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • Xilinx
    +關(guān)注

    關(guān)注

    71

    文章

    2167

    瀏覽量

    121444
  • 仿真
    +關(guān)注

    關(guān)注

    50

    文章

    4083

    瀏覽量

    133614
  • python
    +關(guān)注

    關(guān)注

    56

    文章

    4797

    瀏覽量

    84695
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    如何用運(yùn)放實(shí)現(xiàn)加減法運(yùn)算

     前面的反相放大器和同相放大器可以實(shí)現(xiàn)乘法運(yùn)算的功能,這一小節(jié)我們來(lái)看如何用運(yùn)放實(shí)現(xiàn)加減法運(yùn)算。
    發(fā)表于 02-02 14:12 ?4.6w次閱讀
    如何用運(yùn)放實(shí)現(xiàn)<b class='flag-5'>加減法</b>運(yùn)算

    超長(zhǎng)數(shù)加減法運(yùn)算器及相關(guān)指令設(shè)計(jì),實(shí)現(xiàn)精確計(jì)算

    8位單片機(jī)能夠?qū)崿F(xiàn)超長(zhǎng)數(shù)計(jì)算嗎?我說(shuō):"只要存儲(chǔ)器夠大,按照下面的方法設(shè)計(jì)的加減法運(yùn)算器及指令,就能夠編寫程序完成。"1。用全加器搭建一個(gè)8位加法器;2。將最低下進(jìn)位前連接一個(gè)1位寄存器,輸入端連接
    發(fā)表于 09-22 03:09

    atmega128 單片機(jī) 20以內(nèi)加減法訓(xùn)練機(jī) 做的過(guò)程 精選資料分享

    20以內(nèi)加減法訓(xùn)練機(jī)基于單片機(jī)實(shí)現(xiàn) 20 以內(nèi)整數(shù)加減法訓(xùn)練,要求具有加法、減法(結(jié)果不出現(xiàn)負(fù)數(shù))、加減法三種訓(xùn)練模式,每次訓(xùn)練隨機(jī)產(chǎn)生題目??梢赃x擇每次訓(xùn)練題目的數(shù)目,可分為每組 5
    發(fā)表于 07-15 07:51

    基于單片機(jī)如何去實(shí)現(xiàn)20以內(nèi)整數(shù)加減法訓(xùn)練呢

    基于單片機(jī)如何去實(shí)現(xiàn)20以內(nèi)整數(shù)加減法訓(xùn)練呢?有哪些具體要求以及操作步驟呢?
    發(fā)表于 11-02 07:00

    愛特梅爾推出全新浮點(diǎn)單元(Floating Point Un

    愛特梅爾推出全新浮點(diǎn)單元(Floating Point Unit)技術(shù)  愛特梅爾公司(Atmel Corporation)宣布推出全新浮點(diǎn)單元(F
    發(fā)表于 04-21 17:05 ?726次閱讀

    加減法電路

    加減法電路 利用一個(gè)差動(dòng)輸入的運(yùn)放就可同時(shí)實(shí)現(xiàn)加減法運(yùn)算,這種運(yùn)算電路如圖5.4-3所示。
    發(fā)表于 04-22 17:50 ?1.1w次閱讀
    <b class='flag-5'>加減法</b>電路

    WP409利用Xilinx FPGA打造出高端比特精度和周期精度浮點(diǎn)DSP算法實(shí)現(xiàn)方案

    WP409利用Xilinx FPGA打造出高端比特精度和周期精度浮點(diǎn)DSP算法實(shí)現(xiàn)方案: High-Level Implementation of Bit- and Cycle-Accurate Floating-Point D
    發(fā)表于 01-26 18:03 ?25次下載

    Comparing_Fixed-and_Floating-Point_DSPs

    Comparing Fixed- and Floating-Point DSP。
    發(fā)表于 01-19 14:12 ?5次下載

    C語(yǔ)言教程之整數(shù)加減法練習(xí)

    C語(yǔ)言教程之整數(shù)加減法練習(xí),很好的C語(yǔ)言資料,快來(lái)學(xué)習(xí)吧。
    發(fā)表于 04-22 17:45 ?0次下載

    Floating-Point設(shè)計(jì)編碼風(fēng)格與技巧

    盡管通常Fixed-Point(定點(diǎn))比Floating-Point浮點(diǎn))算法的FPGA實(shí)現(xiàn)要更快,且面積更高效,但往往有時(shí)也需要Floating-Point來(lái)實(shí)現(xiàn)。這是因?yàn)镕ixe
    發(fā)表于 11-22 15:20 ?1552次閱讀

    Xilinx Vivado HLS中Floating-Point浮點(diǎn))設(shè)計(jì)介紹

    的數(shù)據(jù)動(dòng)態(tài)范圍,從而在很多算法中只需要一種數(shù)據(jù)類型的優(yōu)勢(shì)。Xilinx Vivado HLS工具支持C/C++ IEEE-54標(biāo)準(zhǔn)單精度及雙精度浮點(diǎn)數(shù)據(jù)類型,可以比較容易,快速地將C/C++ Floating-Point算法轉(zhuǎn)成
    發(fā)表于 01-12 05:43 ?1.1w次閱讀

    Floating-Point IP接口操作介紹

    作者:OpenSLee 1、Floating-Point IP支持的運(yùn)算操作 1)Multiply乘法 2) Add/subtract加法和減法 3)Accumulator累加 4) Fused
    的頭像 發(fā)表于 11-13 15:17 ?3535次閱讀

    atmega128 單片機(jī) 20以內(nèi)加減法訓(xùn)練機(jī) 做的過(guò)程

    20以內(nèi)加減法訓(xùn)練機(jī)基于單片機(jī)實(shí)現(xiàn) 20 以內(nèi)整數(shù)加減法訓(xùn)練,要求具有加法、減法(結(jié)果不出現(xiàn)負(fù)數(shù))、加減法三種訓(xùn)練模式,每次訓(xùn)練隨機(jī)產(chǎn)生題目。可以選擇每次訓(xùn)練題目的數(shù)目,可分為每組 5
    發(fā)表于 11-15 14:36 ?4次下載
    atmega128 單片機(jī) 20以內(nèi)<b class='flag-5'>加減法</b>訓(xùn)練機(jī) 做的過(guò)程

    Xilinx FPGA里面的AXI DMA IP核的簡(jiǎn)單用法

    本文以浮點(diǎn)數(shù)Floating-point IP核將定點(diǎn)數(shù)轉(zhuǎn)換為浮點(diǎn)數(shù)為例,詳細(xì)講解AXI DMA IP核的使用方法。
    的頭像 發(fā)表于 02-16 16:21 ?9694次閱讀
    <b class='flag-5'>Xilinx</b> FPGA里面的AXI DMA <b class='flag-5'>IP</b>核的簡(jiǎn)單用法

    FPGA常用運(yùn)算模塊-加減法器和乘法器

    本文是本系列的第二篇,本文主要介紹FPGA常用運(yùn)算模塊-加減法器和乘法器,xilinx提供了相關(guān)的IP以便于用戶進(jìn)行開發(fā)使用。
    的頭像 發(fā)表于 05-22 16:13 ?4941次閱讀
    FPGA常用運(yùn)算模塊-<b class='flag-5'>加減法</b>器和乘法器