zoukankan      html  css  js  c++  java
  • 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仿真结果如下图:

    对比可知仿真结果一致;

  • 相关阅读:
    webpack基础
    LeetCode232. 用栈实现队列做题笔记
    mysql 时间加减一个月
    leetcode 1381. 设计一个支持增量操作的栈 思路与算法
    LeetCode 141. 环形链表 做题笔记
    leetcode 707. 设计链表 做题笔记
    leetcode 876. 链表的中间结点 做题笔记
    leetcode 143. 重排链表 做题笔记
    leetcode 1365. 有多少小于当前数字的数字 做题笔记
    LeetCode1360. 日期之间隔几天 做题笔记
  • 原文地址:https://www.cnblogs.com/VagueCheung/p/10489693.html
Copyright © 2011-2022 走看看