• 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即可 如下图:

     

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

    对比可知仿真结果一致;

  • 相关阅读:
    第12组 Alpha冲刺(4/6)
    第12组 Alpha冲刺(3/6)
    第12组 Alpha冲刺(2/6)
    2019软件工程实践——第四次作业
    2019软件工程实践——第三次作业
    2019软件工程实践——第二次作业
    2019软件工程实践——第一次作业
    博客园 自定义背景图片(包括动图)
    软件工程 实验一 GIT代码版本管理
    WordCounter项目(基于javase)
  • 原文地址:https://www.cnblogs.com/VagueCheung/p/10489693.html
Copyright © 2020-2023  润新知