Vivado使用Cordic IP计算e^ix(复e指数函数)

这里写自定义目录标题

  • 原理
  • IP解析
  • 设置IP
  • HDL Code
  • Simulation
    • Code
    • 仿真
  • reference

原理

根据欧拉公式
e^(ix)=(cos x+isin x)

IP解析

在这里插入图片描述
1 选择功能为计算正余弦
2 并行(面积和速度的平衡)
3 流水线模式开到最大(不知道有啥用)
4 有符号小数(整数宽度为2(里面应该包含了一位符号位))
这个选项是默认的,而且我们用的是相位而不是坐标对,可以忽略这个选项
在这里插入图片描述
5 相位格式(以弧度为单位还是以pi为单位,1位符号位,2位整数位和N-3位小数位的补码)
在这里插入图片描述
不同的格式对应着不同的输入范围,
在这里插入图片描述
在这里插入图片描述
6 输入宽度(按需配置)

7 输出宽度(建议与输入宽度保持一致)
在这里插入图片描述
在这里插入图片描述
输入时为2qn,输出时为1qn

8 取整模式(这里计算的是小数,私以为取整模式不重要)
在这里插入图片描述
在这里插入图片描述
9 迭代次数(设置为0,自动确认)

10 精度(设置为0,自动确认)
11 Coarse Rotation 是否将输入范围从第一象限(-Pi/4 to + Pi/4)扩大到整个圈
12 补偿比例 sin函数下不生效

设置IP

在这里插入图片描述
在这里插入图片描述
高位表示正弦函数,低位表示余弦函数

HDL Code

module correlation(input clk,input rst_n,input [15:0]	phase_in	,input [ 0:0]	phase_vld);wire [15:0] sinx;wire [15:0] cosx;wire [ 0:0] out_vld;cordic_0 sin_cos (.aclk					( clk),                                // input wire aclk.s_axis_phase_tvalid	( phase_vld			),  // input wire s_axis_phase_tvalid.s_axis_phase_tdata		( phase_in			),    // input wire [15 : 0] s_axis_phase_tdata.m_axis_dout_tvalid		( out_vld			),    // output wire m_axis_dout_tvalid.m_axis_dout_tdata		( {sinx, cosx}		)      // output wire [31 : 0] m_axis_dout_tdata);
endmodule

Simulation

Code

module tb_correlation;// correlation Parameters
parameter PERIOD  = 10;// correlation Inputs
reg   clk                                  = 0 ;
reg   rst_n                                = 0 ;
reg   [15:0]  phase_in                     = 0 ;
reg   [ 0:0]  phase_vld                    = 0 ;// correlation Outputsinitial
beginforever #(PERIOD/2)  clk=~clk;
endinitial
begin#(PERIOD*2) rst_n  =  1;
endcorrelation  u_correlation (.clk                     ( clk               ),.rst_n                   ( rst_n             ),.phase_in                ( phase_in   [15:0] ),.phase_vld               ( phase_vld  [ 0:0] )
);initial
begin#(PERIOD*3)		phase_vld 	= 1'b1;#(PERIOD*0)		phase_in 	= 16'b1110_0000_0000_0000		; // -1#PERIOD			phase_in	= 16'b1110_1000_0000_0000		; // -0.75#PERIOD			phase_in 	= 16'b1111_0000_0000_0000		; // -0.5#PERIOD			phase_in 	= 16'b1111_1000_0000_0000		; // -0.25#PERIOD			phase_in 	= 16'b0000_0000_0000_0000		; // 0#PERIOD			phase_in 	= 16'b0000_1000_0000_0000		; // 0.25#PERIOD			phase_in 	= 16'b0001_0000_0000_0000		; // 0.5#PERIOD			phase_in 	= 16'b0001_1000_0000_0000		; // 0.75#PERIOD			phase_in 	= 16'b0010_0000_0000_0000		; // 1#PERIOD			phase_vld 	= 1'b0		;#(PERIOD*30)$finish;
endendmodule

仿真

设置输入输出格式
在这里插入图片描述
输入格式,有符号,13位小数位
在这里插入图片描述
输出格式
在这里插入图片描述
仿真结果
在这里插入图片描述

reference

pg105


都看到这儿了,点个赞呗
||
\/


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部