利用CORDIC IP核计算两路信号的相位差

利用CORDIC IP核计算两路信号的相位差

1 IP 说明

1.1 DDS IP核

The output frequency(f_out ) , of the DDS waveform is a function of the system clock frequency(f_clk ) .the phase width, that is, number of bits (B ) in the phase accumulator
and the phase increment value (deta_theta) . The output frequency in Hertz is defined by:f_out=f_clkdeta_theta/(2^B)
输出频率的计算公式f_out=f_clk
deta_theta/(2^B)
频率字:deta_theta=f_out*(2^B)/f_clk
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

1.2 CORDIC IP核

(0)Latency:由这个值可以知道得到输出结果需要多少个时钟。
(1)Functional Selection:选择为"Arc Tan"。
(2)architectural configuration:
1)word serial 是为了节省资源,采用了循环的方法,只用一个shift-addsub和一个循环计数器来实现
2)parallel则是用多个shift-addsub串连在一起来实现,如果为了提高始终频率和吞吐量,每个shift-addsub之间 可添加reg ,实现pipeline

(3)Pipelining Mode:可以设置为最大值(Maximum)、最优值(Optimal)和不设置流水线(No pipelining即纯组合逻辑实现)。
增加流水线级数可以提高计算速度。
(4)Data Format:计算arctan时Data Format固定为带符号小数(Signed Fraction)。
(5)Phase Format:可以设置为Radians(以pi为单位)或Scaled Radians(将单位pi归一化到-1~1范围内)。

(6)Input/Output width:设置输入、输出数据位宽
(7)Round mode:舍位模式,这里选择为Nearest Even,表示最接近的值(可以理解为四舍五入)。

(8)Coarse Rotation:默认为勾选。选中此值时,CORDIC的输出范围是-pi~pi;
没有选中时,CORDIC的输出范围是-1/4pi~1/4pi。前者通常更符合我们的需要。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2 源代码

`timescale 1ns / 1ps
/*
知识点:
 1、 DDS IP核
  The output frequency(f_out ) , of the DDS waveform is a function of the system clock frequency(f_clk ) .
  the phase width, that is, number of bits (B )  in the phase accumulator 
  and the phase increment value (deta_theta) . 
  The output frequency in Hertz is defined by:f_out=f_clk*deta_theta/(2^B)

2、CORDIC IP核
(0)Latency:由这个值可以知道得到输出结果需要多少个时钟。
(1)Functional Selection:选择为"Arc Tan"。
(2)architectural configuration:
    1)word serial 是为了节省资源,采用了循环的方法,只用一个shift-addsub和一个循环计数器来实现
    2)parallel则是用多个shift-addsub串连在一起来实现,如果为了提高始终频率和吞吐量,每个shift-addsub之间 可添加reg ,实现pipeline

(3)Pipelining Mode:可以设置为最大值(Maximum)、最优值(Optimal)和不设置流水线(No pipelining即纯组合逻辑实现)。
                 增加流水线级数可以提高计算速度。
(4)Data Format:计算arctan时Data Format固定为带符号小数(Signed Fraction)。
(5)Phase Format:可以设置为Radians(以pi为单位)或Scaled Radians(将单位pi归一化到-1~1范围内)。

(6)Input/Output width:设置输入、输出数据位宽
(7)Round mode:舍位模式,这里选择为Nearest Even,表示最接近的值(可以理解为四舍五入)。

(8)Coarse Rotation:默认为勾选。选中此值时,CORDIC的输出范围是-pi~pi;
                 没有选中时,CORDIC的输出范围是-1/4pi~1/4pi。前者通常更符合我们的需要。
                 
*/
module top(
    input   clk   , //system clock
    input   rst_n
);
    
    
    
    
    
//-----------------------1、产生输入信号
// ------------根据IP核的summery, phase width=16 bits   Frequency per channel=100MHz
// 输出频率的计算公式f_out=f_clk*deta_theta/(2^B)    
// 频率字:deta_theta=f_out*(2^B)/f_clk      ,对应输出频率10M
 wire [15 : 0] PINC; 
// assign PINC=16'd6554;//10M
  assign PINC=16'd655;//1M
 wire data_tvalid   ;
 wire  [31 : 0]  data_tdata    ;
 dds_sin Inst_dds_sin (
  .aclk(clk),                                  // input wire aclk
  .s_axis_config_tvalid(1'b1),  // input wire s_axis_config_tvalid
  .s_axis_config_tdata(PINC),    // input wire [15 : 0] s_axis_config_tdata
  
  .m_axis_data_tvalid   (data_tvalid    ),      // output wire m_axis_data_tvalid
  .m_axis_data_tdata    (data_tdata     ),        // output wire [31 : 0] m_axis_data_tdata
  .m_axis_phase_tvalid  (   ),    // output wire m_axis_phase_tvalid
  .m_axis_phase_tdata   (   )      // output wire [15 : 0] m_axis_phase_tdata
);   
wire [15:0] RtI;
wire [15:0] RtQ;
assign  RtQ   =data_tdata[31:16];
assign  RtI   =data_tdata[15:0];    
    
    
    
    
//---------------2、计算输入信号RtQ和RtI,两者之间的相位差--arctan(Y/X)=arctan(RtQ/RtI)
//   CORDIC的IP核的输入数据:包括Y和X两个数据输入,共同占用s_tdata总线,Y占用高字节部分,X占用低字节部分。
//   比如输入数据位宽为16Bits时,15~8位为Y,7~0位为X。CORDIC计算arctan(Y/X),输出计算结果
//   仿真结果:phase=atand(32765/253)=90度    
wire phase_data_tvalid; 
wire [15 : 0]  phase_data; 
 
cordic_0 your_instance_name (
  .aclk(clk),                                        // input wire aclk
  .s_axis_cartesian_tvalid(data_tvalid),  // input wire s_axis_cartesian_tvalid
  .s_axis_cartesian_tdata({RtQ,RtI}),    // input wire [31 : 0] s_axis_cartesian_tdata
  
  .m_axis_dout_tvalid(phase_data_tvalid),            // output wire m_axis_dout_tvalid
  .m_axis_dout_tdata(phase_data)              // output wire [15 : 0] m_axis_dout_tdata
); 
    

    
    
endmodule

`timescale 1ns / 1ps

module sim_top;

reg   clk   ; //system clock
reg   rst_n ;

top Inst_top(
    .clk  (clk  ) , //system clock
    .rst_n(rst_n)
);


initial
begin
    rst_n<=1'b0 ;
    clk<=1'b0   ;
    #10
    rst_n<=1'b1 ;
end

always #5 clk=~clk;//100MHz


endmodule

3 结果分析

在这里插入图片描述
仿真结果:phase=atand(32765/253)=90度 ,DDS的实部和虚部理论上相差90度,正确。

  • 5
    点赞
  • 36
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
### 回答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 IP核sin/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核的性能和准确性。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值