一、CORDIC IP 计算相位值(Arc Tan)
- 输入:复数据实部虚部,输入格式:IMAG(31:16),REAL(15:0);范围: − 1 ≤ x o r y ≤ 1 -1 \leq x \ or \ y \leq 1 −1≤x or y≤1
- 输出:相位,输出格式: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
- 仿真图(初始相位相反两路波形)