CORDIC(6.0) IP核 与 DDS Compiler(6.0) IP核 使用示例

一、CORDIC IP 计算相位值(Arc Tan)

参考:
1、Cordic v6.0 IP CORE使用说明
2、使用Xilinx CORDIC IP核 生成正余弦波

  • 输入:复数据实部虚部,输入格式:IMAG(31:16),REAL(15:0);范围: − 1 ≤ x   o r   y ≤ 1 -1 \leq x \ or \ y \leq 1 1x or y1
  • 输出:相位,输出格式:PHASE(15:0);范围: − π ≤ x ≤ π -\pi\leq x\leq \pi πxπ
1、参数配置

在这里插入图片描述

一、Configuration Parameters(配置参数)
1)、Functional Selection(功能设置):ArcTan模式即为笛卡尔直角坐标转弧度相位。
2)、Architectural Configuration(架构配置):Word Serial结构表示循环结构实现,节约资源。
3)、Pipelining Mode(流水线模式):这里选择最大。
4)、Data Format(数据格式):这里默认为有符号分数。
5)、Phase Format(相位格式):Scaled Radians表示输出弧度除以 π \pi π后的值。
二、InputOutput Options(输入输出选择)
1)、这里选择输入数据位宽为16,输出数据位宽为16。
2)、Round Mode(舍位模式):这里选择Truncate直接截位。
三、Advanced Configuration Parameters(高级配置参数)
1)、Iterations(迭代)与Precision(精度)不做设置,IP核将根据输出精度等自行取值。
2)、Coarse Rotation勾选,以使输入输出范围拓展到整个圆。

在这里插入图片描述

这里可以根据需求自行设置,勾选ARESETN以增加输入复位信号。

2、仿真
  • testbench文件
`timescale 1ns / 1ps
module cordic_arctan_tb;

// cordic_arctan_test Parameters
parameter PERIOD  = 25;

// cordic_arctan_test Inputs
reg   aclk                                     ;
reg   aresetn                                  ;
reg   s_axis_cartesian_tvalid                  ;
reg   [31 : 0]  s_axis_cartesian_tdata         ;

// cordic_arctan_test Outputs
wire  s_axis_cartesian_tready              ;
wire  m_axis_dout_tvalid                   ;
wire  [15 : 0]  m_axis_dout_tdata          ;

initial
begin
    aclk <= 1'b0;
    forever #(PERIOD/2.0)  aclk=~aclk;
end

cordic_arctan_test  u_cordic_arctan_test (
    .aclk                     ( aclk                              ),
    .aresetn                  ( aresetn                           ),
    .s_axis_cartesian_tvalid  ( s_axis_cartesian_tvalid           ),
    .s_axis_cartesian_tdata   ( s_axis_cartesian_tdata   [31 : 0] ),

    .s_axis_cartesian_tready  ( s_axis_cartesian_tready           ),
    .m_axis_dout_tvalid       ( m_axis_dout_tvalid                ),
    .m_axis_dout_tdata        ( m_axis_dout_tdata        [15 : 0] )
);

wire [15:0]Y_in;//imag
assign Y_in = s_axis_cartesian_tdata[31:16];
wire [15:0]X_in;//real
assign X_in = s_axis_cartesian_tdata[15: 0];

initial
begin
        aresetn <= 1'b0;
        s_axis_cartesian_tvalid <= 1'b0;
        s_axis_cartesian_tdata <= 32'b0;
#100    aresetn <= 1'b1;
#100 begin
    s_axis_cartesian_tvalid <= 1'b1;
    s_axis_cartesian_tdata <= 32'b0010000000_000000_0010100000_000000;//1_1_14
end
#25 begin
    s_axis_cartesian_tvalid <= 1'b0;
    s_axis_cartesian_tdata <= 32'b0010000000_000000_0010100000_000000;//1_1_14
end
// #25 begin
//     s_axis_cartesian_tvalid <= 1'b1;
//     s_axis_cartesian_tdata <= 32'b010000_0000000000_110000_0000000000;//1_1_14
// end
/* #25 begin
    s_axis_cartesian_tvalid <= 1'b1;
    s_axis_cartesian_tdata <= 32'b010000_0000000000_110000_0000000000;
end */
end
endmodule
  • 设计文件
`timescale 1ns / 1ps
module cordic_arctan_test(
input aclk,
input aresetn,
input s_axis_cartesian_tvalid,
input [31 : 0] s_axis_cartesian_tdata,
output s_axis_cartesian_tready,
output m_axis_dout_tvalid,
output [15 : 0]m_axis_dout_tdata
    );

cordic_arctan_div_Pi_LAT20 your_instance_name (
  .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_tready(s_axis_cartesian_tready),  // output wire s_axis_cartesian_tready
  .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
);
endmodule
  • 仿真图
    在这里插入图片描述

二、DDS Compiler IP 输出正弦波形

参考:
1、征战FPGA之使用IP核dds_compiler获取任意频率时钟和正余弦波形
2、FPGA设计心得(9)基于DDS IP核的任意波形发生器设计
3、官方文档:PG141

1、参数配置

在这里插入图片描述

1、Configuration Options(配置选择):这里选择Phase Generator and SIN COS LUT,即相位生成和正余弦LUT查找表。
2、System Clock(MHz)(系统时钟):系统输入时钟频率,可以按照自己系统配置,这里设置为40MHz.
3、Number of Channels(通道数):即要输出波形的通道数,这里设置为1,即输出一个正余弦波形组合。
4、Mode of Operation(模式选择):这里选择Standard标准模式。
5、Parameter Selection(参数选择):这里选择hardware Parameters 硬件参数,选择此参数可以在后续选择输入输出数据的位宽。
6、Phase Width(相位位宽)【Hardware Parameters下的参数】:这里设置为24位;Output Width(输出位宽):这里设置为16位。

在这里插入图片描述

1、Phase Increment Programmability(相位增量可编程性):这里选择Streaming,输出根据输入实时调整相位增量,该输入为相位增量弧度值除以 2 π 2\pi 2π后的值,取值范围为 [ 0 , 1 ) [0,1) [0,1)
2、Phase offset Programmability(相位偏移可编程性):这里设置为None,不做输入。
3、Output Selection选择Sine and Cosine,输出正余弦波形值,取消勾选Has Phase Out,不对相位值进行输出。

在这里插入图片描述

延迟参数和复位参数默认选择自动和不勾选。

在这里插入图片描述

2、仿真
  • bestbench文件
`timescale 1ns / 1ps
module tb_DSS_Complier_test(
    );

reg aclk,s_axis_phase_tvalid_1,s_axis_phase_tvalid_2;
reg signed[23:0]s_axis_phase_tdata_1,s_axis_phase_tdata_2;
wire m_axis_data_tvalid_1,m_axis_data_tvalid_2;
wire [31:0]m_axis_data_tdata_1,m_axis_data_tdata_2;

wire [15:0]sin1,cos1,sin2,cos2;

assign sin1 = m_axis_data_tdata_1[31:16];
assign cos1 = m_axis_data_tdata_1[15: 0];
assign sin2 = m_axis_data_tdata_2[31:16];
assign cos2 = m_axis_data_tdata_2[15: 0];

DSS_Complier_test u1(
.aclk(aclk),
.s_axis_phase_tvalid_1(s_axis_phase_tvalid_1),
.s_axis_phase_tdata_1(s_axis_phase_tdata_1),
.m_axis_data_tvalid_1(m_axis_data_tvalid_1),
.m_axis_data_tdata_1(m_axis_data_tdata_1),
.s_axis_phase_tvalid_2(s_axis_phase_tvalid_2),
.s_axis_phase_tdata_2(s_axis_phase_tdata_2),
.m_axis_data_tvalid_2(m_axis_data_tvalid_2),
.m_axis_data_tdata_2(m_axis_data_tdata_2)
    );

initial begin
    aclk  <= 1'b1;  
end
always #12.5 aclk <= ~aclk;

initial begin
    s_axis_phase_tvalid_1 <= 1'b0;
    s_axis_phase_tvalid_2 <= 1'b0;
#100 begin
    s_axis_phase_tvalid_1 <= 1'b1;
    s_axis_phase_tvalid_2 <= 1'b1;
    s_axis_phase_tdata_1 <= 24'b0000_0000_00111_10101_010100;
    s_axis_phase_tdata_2 <= 24'b1111_1111_11000_01010_101100; 
end
#100000 begin
    s_axis_phase_tvalid_1 <= 1'b0;
    s_axis_phase_tvalid_2 <= 1'b0;
end
/* #25 begin
    s_axis_phase_tvalid_1 <= 1'b0;
    s_axis_phase_tvalid_2 <= 1'b0;
end */
end
endmodule
  • 设计文件
module DSS_Complier_test(
input aclk,
input s_axis_phase_tvalid_1,
input [23 : 0]s_axis_phase_tdata_1,
output m_axis_data_tvalid_1,
output [31 : 0]m_axis_data_tdata_1,
input s_axis_phase_tvalid_2,
input [23 : 0]s_axis_phase_tdata_2,
output m_axis_data_tvalid_2,
output [31 : 0]m_axis_data_tdata_2
    );

dds_compiler_0 u_dds_compiler_0 (
  .aclk(aclk),                                  // input wire aclk
  .s_axis_phase_tvalid(s_axis_phase_tvalid_1),  // input wire s_axis_phase_tvalid
  .s_axis_phase_tdata(s_axis_phase_tdata_1),    // input wire [23 : 0] s_axis_phase_tdata
  .m_axis_data_tvalid(m_axis_data_tvalid_1),      // output wire m_axis_data_tvalid
  .m_axis_data_tdata(m_axis_data_tdata_1)        // output wire [31 : 0] m_axis_data_tdata
);

dds_compiler_0 u_dds_compiler_1 (
  .aclk(aclk),                                  // input wire aclk
  .s_axis_phase_tvalid(s_axis_phase_tvalid_2),  // input wire s_axis_phase_tvalid
  .s_axis_phase_tdata(s_axis_phase_tdata_2),    // input wire [23 : 0] s_axis_phase_tdata
  .m_axis_data_tvalid(m_axis_data_tvalid_2),      // output wire m_axis_data_tvalid
  .m_axis_data_tdata(m_axis_data_tdata_2)        // output wire [31 : 0] m_axis_data_tdata
);

endmodule
  • 仿真图(初始相位相反两路波形)
    在这里插入图片描述

微信公众号:通信随笔XIDIAN

在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

xidian_hxc

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值