【FPGA】:ip核----cordic

一、概述

cordic核主要用来求三角方程, 主要功能为:
 rotate 旋转 ——复数旋转
 translate 变换 ——复数转极坐标
 sin/cos
 arctan
 sinh/cosh
 arc tanh
 square root 平方根

二、端口说明

备注:s_axis_代表核作为丛机,m_axis代表核作为主机,数据宽度一般为8的整数倍
在这里插入图片描述
在这里插入图片描述

三、ip核的生成

(1)在ip catalog里面选择cordic
在这里插入图片描述
(2)配置configuration
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
compensation Scaling:补偿因子,当选择不补偿时他的输出是乘了倍数Z的,如下所示:在这里插入图片描述
因此,为了让结果为z,则需要选择补偿项
(3)配置Axis Stream Option

在这里插入图片描述
与核相关的具体细节如下所示:
在这里插入图片描述

四、示例

以arctan函数为例进行仿真说明:

在这里插入图片描述

输入: 复数据实部虚部,输入格式:IMAG(31:16),REAL(15:0);范围:− 1 ≤ x o r y ≤ 1
输出: 相位,输出格式:PHASE(15:0);范围:− π ≤ x ≤ π 在这里插入图片描述

tb文件:

`timescale 1ns / 1ps
//
// Company: 
// Engineer: 
// 
// Create Date: 2022/06/04 10:14:40
// Design Name: 
// Module Name: cordic_tb
// Project Name: 
// Target Devices: 
// Tool Versions: 
// Description: 
// 
// Dependencies: 
// 
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
// 
//


module cordic_tb();

reg aclk;
reg aresetn;
reg s_axis_cartesian_tvalid;
reg [31:0] s_axis_cartesian_tdata;
wire m_axis_dout_tvalid;
wire [15:0] m_axis_dout_tdata;

wire [15:0]X_in;//real
wire [15:0]Y_in;//imag

assign Y_in = s_axis_cartesian_tdata[31:16];
assign X_in = s_axis_cartesian_tdata[15: 0];

cordic_0 cordic_0_inst0(
  .aclk(aclk),                                        // input wire aclk
  .aresetn(aresetn),                                  // input wire aresetn
  .s_axis_cartesian_tvalid(s_axis_cartesian_tvalid),  // input wire s_axis_cartesian_tvalid
  .s_axis_cartesian_tdata(s_axis_cartesian_tdata),    // input wire [31 : 0] s_axis_cartesian_tdata
  .m_axis_dout_tvalid(m_axis_dout_tvalid),            // output wire m_axis_dout_tvalid
  .m_axis_dout_tdata(m_axis_dout_tdata)              // output wire [15 : 0] m_axis_dout_tdata
);

/*********************************时钟信号*********************************/
 initial aclk = 0;
 always #5 aclk = ~aclk;

initial begin
    aresetn =0;
    s_axis_cartesian_tvalid=0;
    s_axis_cartesian_tdata=32'd0;
    #20;
    aresetn =1;
    s_axis_cartesian_tvalid=1;
    // 前两位为整数部分【第1位符号位,第2位为数字】,后两位为小数部分,,输入必须归一化到-1到1
   // s_axis_cartesian_tdata=32'b0010000000000000_0010100000000000;       //高位为虚部,低位为实部
    s_axis_cartesian_tdata=32'b0010000000_000000_0010100000_000000;
end

endmodule

仿真结果;
在这里插入图片描述
其中modelsim显示小数的方法如下:
在这里插入图片描述
在这里插入图片描述
对于本例而言,输入数据的整数为2bit,输出数据的整数为3bit,均为有符号数。
总结: cordic ip核使用 时候通常情况下输入为【-1,1】,超过此范围会出错,因此,常用办法为,对原来数据的最高位进行扩一位符号位,再送入cordic ip核,或者代码中必定能要保证输入数据的范围限定在-1~1之间。若是不能肯定上级模块向CORDIC中输入数据的范围,能够先仿真,肯定数据的最大值和最小值是否超出了该范围。若是超过能够用相似“{q[15],q[15:1],i[15],i[15:1]}”这样的移位除法,缩小输入数据范围。因为是带符号数二进制补码,移位时注意高位补符号位。

五、参考资料

  1. VIVADO cordic IP核
  2. XILINX CORDIC IP核使用记录
  3. CORDIC(6.0) IP核 与 DDS Compiler(6.0) IP核 使用示例
  4. FPGA----IP核cordic使用
  5. VIVADO cordic IP核
  6. Cordic v6.0 IP CORE使用说明
  7. modelsim调试把信号显示为小数格式
  8. VIVADO cordic IP核(遇到的一些问题)
  9. FPGA数字信号处理(十四)Vivado Cordic IP核计算arctan(使用技巧)
  • 19
    点赞
  • 177
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
### 回答1: Cordic IP是一种用于计算正弦和余弦函数的数学运算IP。在进行Cordic IP的sin/cos测试之前,我们需要编写一个测试台(testbench)来进行测试。 测试台的设计目标是在输入一组角度值后,计算出对应的正弦和余弦值,并与预期值进行对比,以确保Cordic IP的功能正确性。 首先,我们需要确定测试的角度值范围。我们可以选择一个角度的正弦和余弦值是已知的,并以这个角度为中心,测试一定范围内的角度值。例如,我们可以选择0°到360°之间的某个角度值进行测试。 测试台的流程如下: 1. 定义输入信号和预期输出信号。 2. 将输入信号传递给Cordic IP,并接收其计算得到的结果。 3. 将Cordic IP计算的结果与预期输出进行对比,检查它们之间的误差是否在可接受范围内。 4. 如果误差在可接受范围内,则测试通过,输出测试结果。 5. 如果误差不在可接受范围内,则测试失败,输出测试结果。 在测试台中,我们可以通过生成随机角度值的方法,对Cordic IP进行多组测试,以覆盖更广泛的角度范围。 测试台设计中需要考虑的几个重要因素包括输入输出数据的精度、测试角度的覆盖范围和测试结果的判定标准。通过合理设置这些参数,我们可以编写一个有效的Cordic IPsin/cos测试台,以确保IP的正确性。 ### 回答2: Cordic IP是一种用于计算三角函数的硬件心,通过使用迭代方法来实现高效的计算。为了测试Cordic IP的sin/cos功能,我们可以编写一个Testbench。 Testbench的目的是验证Cordic IP的输出结果是否正确。在Testbench中,我们首先需要生成一系列的输入值作为测试用例,这些输入值可以按照一定的步长递增或随机生成。然后,将这些输入值送入Cordic IP进行计算,得到对应的sin和cos值。 接下来,我们需要知道这些测试用例的预期输出值。我们可以使用软件或数学库函数计算标准的sin和cos值作为参考。然后,将Cordic IP的输出结果与预期输出值进行比较。如果两者非常接近,即可认为Cordic IP的sin/cos功能正确。 在Testbench中,我们可以使用assert语句对比Cordic IP的输出结果和预期输出值。如果两者不匹配,assert语句会给出错误提示。此外,我们还可以输出测试结果是否通过的信息,以便于判断Cordic IP的性能和准确性。 最后,在Testbench中我们还可以记录测试的运行时间以及任何其他有用的信息,以便于分析和评估Cordic IP的性能。 总结起来,通过编写一个完善的Testbench,我们可以对Cordic IP的sin/cos功能进行全面的测试和评估,确保其在实际应用中的正确性和可靠性。 ### 回答3: Cordic是一种数字算法,通常用于计算三角函数(如sin和cos函数)。Cordic IP是一种可以在FPGA中实现Cordic算法的IP。 进行Cordic IP的sin/cos测试需要编写一个测试平台,也就是所谓的testbench。测试平台主要用于验证Cordic IP的正确性和性能。 测试平台的第一步是生成输入信号,即角度(或弧度)的值。可以使用随机数生成器来生成不同的角度输入。然后将这些角度值提供给Cordic IP进行计算。 下一步是为Cordic IP建立期望输出。可以使用系统级建模(System-Level Modeling)来计算期望的sin和cos值。使用已知的数学公式,将输入的角度值代入,计算出对应的sin和cos值。 然后,将输入信号提供给Cordic IP,将计算结果与期望输出进行比较。可以使用assert语句来进行比较。如果计算结果与期望输出相差很小,可以认为测试通过。否则,可能需要检查IP的实现是否存在问题。 在测试过程中,还可以记录每个输入角度和对应的计算结果,以便后续分析和调试。可以将这些记录在一个文件中,或者将其显示在仿真工具的波形窗口中。 测试完所有的输入角度后,可以进行一些统计分析,如计算平均误差、最大误差等。这些分析可以用于评估Cordic IP的性能和准确性。 总之,Cordic IP的sin/cos测试需要编写一个测试平台,生成输入信号,计算期望输出,并将计算结果与期望输出进行比较。通过分析比较结果,可以评估IP的性能和准确性。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值