Vivado中xilinx_courdic IP核(求exp指數函數)使用

 

因爲Verilog/Vhdl沒有計算exp指數函數的庫函數,因此在開發過程當中可利用cordic IP核作exp函數即e^x值;函數

但前提要保證輸入範圍在(-pi/4pi/4測試

cordic核中e^x = sinh + cosh因此在配置cordic時點選sinh and cosh便可 以下圖:spa

 

input width配置爲16位,表示輸入數據的第16位是符號位,第15,14位是整數位,其餘位表示小數位,至關於13位有符號定點小數;3d

output width配置16位,高16位表示sinh結果 其中第16位符號位,第15位整數位,其它小數位,至關於13位有符號定點小數;blog

            低16位表示cosh結果 其中第16位符號位,第15位整數位,其它小數位,至關於13位有符號定點小數;ip

其它選項都按上圖顯示配置;ci

 

編寫testbench測試文件:開發

Testbenchget

`timescale 1ns / 1psinput

//////////////////////////////////////////////////////////////////////////////////

// Company:

// Engineer:

// Create Date: 2018/11/28 09:08:45

// Design Name:

// Module Name: test_bench_IP_cordic_ex

// Project Name:

// Target Devices:

// Tool Versions:

// Description:

// 利用cordic  IP核 作pi/5-pi/4exp 定義(可自選)

//需本身將仿真結果高16位提出做爲sinh 數據格式爲第16位爲符號位 第15位是整數位 後邊其餘是小數

//將仿真結果低16位提出做爲cosh值 數據格式爲第16位爲符號位 第15位是整數位 後邊其餘是小數

//獲得結果expx=sinh+cosh

// Dependencies:  

// Revision:

// Revision 0.01 - File Created

// Additional Comments:

//////////////////////////////////////////////////////////////////////////////////

 

module test_bench_IP_cordic_ex(

    );

  //inputs  

   reg              clk;

   reg[15:0]        s_axis_phase_tdata;

   reg              s_axis_phase_tvalid;

  //outputs

   wire             m_axis_dout_tvalid;

   wire[31:0]       m_axis_dout_tdata;

   

   //others

   wire[15:0]       sinh;

   wire[15:0]       cosh;

   wire[15:0]       exp;

   assign sinh = m_axis_dout_tdata[31:16];

   assign cosh = m_axis_dout_tdata[15:0];

   assign exp = sinh + cosh;

   

   cordic_0   cordic_m0(

        .aclk(clk),

        //.rst(rst),

        .s_axis_phase_tdata(s_axis_phase_tdata),                 

        //.s_axis_phase_tready(s_axis_phase_tready),

        .s_axis_phase_tvalid(s_axis_phase_tvalid),//s_axis_phase_tvalid),

        .m_axis_dout_tvalid(m_axis_dout_tvalid),

        .m_axis_dout_tdata(m_axis_dout_tdata)                

     );  

     always #5 clk = ~clk;

     initial    begin

        clk = 0;

        s_axis_phase_tvalid = 0;

        s_axis_phase_tdata = 0;

     #150

        s_axis_phase_tvalid = 1;

        s_axis_phase_tdata = 16'b0001010000011011;//pi * 1/5

     #10

        s_axis_phase_tdata = 16'b1110011011011110;//-pi * 1/4

     #10   

        s_axis_phase_tvalid = 0;   

     #40000 $finish;

     end  

endmodule

 

仿真結果以下圖:

 

 

圖中標紅區域值分別爲:

epi/5=1.87432861328125

 

e-pi/4=0.45587158203125

 

 

 

利用Matlab仿真結果以下圖:

 

 

對比可知仿真結果一致;

相關文章
相關標籤/搜索