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

原理

根据欧拉公式
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 Outputs



initial
begin
    forever #(PERIOD/2)  clk=~clk;
end

initial
begin
    #(PERIOD*2) rst_n  =  1;
end

correlation  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;
end

endmodule

仿真

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

reference

pg105


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

  • 13
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
下面是一个使用Vivado Cordic IP的简单实例: 假设我们要计算正弦函数sin(x),其中x是输入角度,输出结果是浮点数。我们可以使用Vivado Cordic IP计算sin(x)的值。 1. 在Vivado设计环境中创建新的IP项目。 2. 在IP目录中搜索Cordic IP核,并将其添加到设计中。 3. 双击Cordic IP核,打开其属性选项卡。在这里,选择计算角度和输出数据类型为浮点数。 4. 将Cordic IP核与FPGA的时钟信号和输入角度信号连接起来。 5. 在设计中添加一个AXI GPIO核,用于输入角度值。 6. 在Xilinx SDK中创建一个新的应用程序项目。 7. 编写C代码,从GPIO核读取角度值,并将其作为输入发送到Cordic IP核。然后,从Cordic IP核读取输出值,并将其转换为浮点数格式,最后计算sin(x)的值。 8. 在Vivado中生成比特流文件,将其下载到FPGA设备中进行测试和验证。 下面是C代码示例: ```c #include <stdio.h> #include <math.h> #include "xparameters.h" #include "xil_io.h" #define CORDIC_BASE_ADDR XPAR_CORDIC_IP_0_S00_AXI_BASEADDR #define GPIO_BASE_ADDR XPAR_AXI_GPIO_0_BASEADDR int main() { float x, y, z, sin_z; // 读取输入角度值 xil_printf("Enter the angle in degrees:\n"); scanf("%f", &x); z = x * M_PI / 180.0; // 将输入角度值发送到Cordic IP核 Xil_Out32(CORDIC_BASE_ADDR + 0x00, *(u32*)&z); // 从Cordic IP核读取输出值 y = *(float*)(CORDIC_BASE_ADDR + 0x04); // 计算sin(z)的值 sin_z = y; // 输出结果 xil_printf("sin(%f degrees) = %f\n", x, sin_z); return 0; } ``` 需要注意的是,此示例代码仅用于说明如何使用Vivado Cordic IP,实际应用中可能需要更杂的硬件设计和软件编程。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值