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

By | 2019年9月20日

 

由于Verilog/Vhdl没有计算exp指数函数的库函数,所以在开发过程中可利用cordic IP核做exp函数即e^x值;

但前提要保证输入范围在(-pi/4pi/4

cordic核中e^x = sinh + cosh所以在配置cordic时点选sinh and cosh即可 如下图:

 

input width配置为16位,表示输入数据的第16位是符号位,第15,14位是整数位,其他位表示小数位,相当于13位有符号定点小数;

output width配置16位,高16位表示sinh结果 其中第16位符号位,第15位整数位,其它小数位,相当于13位有符号定点小数;

            低16位表示cosh结果 其中第16位符号位,第15位整数位,其它小数位,相当于13位有符号定点小数;

其它选项都按上图显示配置;

 

编写testbench测试文件:

Testbench

`timescale 1ns / 1ps

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

// 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仿真结果如下图:

 

 

对比可知仿真结果一致;

发表评论