本文轉(zhuǎn)載自:VagueCheung的博客
由于Verilog/Vhdl沒(méi)有計(jì)算exp指數(shù)函數(shù)的庫(kù)函數(shù),所以在開(kāi)發(fā)過(guò)程中可利用cordic IP核做exp函數(shù)即e^x值;
但前提要保證輸入范圍在(-pi/4—pi/4)
在cordic核中e^x = sinh + cosh所以在配置cordic時(shí)點(diǎn)選sinh and cosh即可 如下圖:
input width配置為16位,表示輸入數(shù)據(jù)的第16位是符號(hào)位,第15,14位是整數(shù)位,其他位表示小數(shù)位,相當(dāng)于13位有符號(hào)定點(diǎn)小數(shù);
output width配置16位,高16位表示sinh結(jié)果 其中第16位符號(hào)位,第15位整數(shù)位,其它小數(shù)位,相當(dāng)于13位有符號(hào)定點(diǎn)小數(shù);
低16位表示cosh結(jié)果 其中第16位符號(hào)位,第15位整數(shù)位,其它小數(shù)位,相當(dāng)于13位有符號(hào)定點(diǎn)小數(shù);
其它選項(xiàng)都按上圖顯示配置;
編寫(xiě)testbench測(cè)試文件:
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/4做exp 定義(可自選)
//需自己將仿真結(jié)果高16位提出作為sinh值 數(shù)據(jù)格式為第16位為符號(hào)位 第15位是整數(shù)位 后邊其他是小數(shù)
//將仿真結(jié)果低16位提出作為cosh值 數(shù)據(jù)格式為第16位為符號(hào)位 第15位是整數(shù)位 后邊其他是小數(shù)
//得到結(jié)果exp(x)=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
仿真結(jié)果如下圖:
圖中標(biāo)紅區(qū)域值分別為:
e(pi/5)=1.87432861328125
e(-pi/4)=0.45587158203125
利用Matlab仿真結(jié)果如下圖:
對(duì)比可知仿真結(jié)果一致;
審核編輯 黃昊宇
-
函數(shù)
+關(guān)注
關(guān)注
3文章
4380瀏覽量
64848 -
Vivado
+關(guān)注
關(guān)注
19文章
835瀏覽量
68741
發(fā)布評(píng)論請(qǐng)先 登錄
vivado hls 寫(xiě)的IP核(某函數(shù)) 如何在 vivado 里面連接PS并且導(dǎo)出到Xilinx SDK調(diào)用,最后把值放到內(nèi)存里面?(使用AXI?)
Vivado生成IP核
Xilinx Vivado的使用詳細(xì)介紹(3):使用IP核

了解Vivado中IP核的原理與應(yīng)用
vivado調(diào)用IP核詳細(xì)介紹
FPGA實(shí)現(xiàn)基于Vivado的BRAM IP核的使用
Vivado中xilinx_courdic IP核(求exp指數(shù)函數(shù))使用

Vivado中xilinx_BRAM IP核使用

VCS獨(dú)立仿真Vivado IP核的一些方法總結(jié)
Xilinx Vivado DDS IP使用方法

評(píng)論