Vivado Cordic IP核计算arctan
参考资料
IP核配置
Functional Selection:Arctan
input wire [31 : 0] s_axis_cartesian_tdata→设置width为16
round mode:Nearest Even
参数配置(具体参照手册例子)
要设定好输入数据的整数和小数
CORDIC的输入数据范围应限制在-11(否则会出错),输出数据范围为(-pipi,选中Coarse Rotation)。且数据格式为带符号小数,输入数据整数位有2bit;输出数据整数位有3bit。
v
`timescale 1ns / 1ps
module arctan(
input aclk,
input [15:0] data_x,data_y,
output [15:0] data_out
);
wire s_axis_cartesian_tvalid;
wire m_axis_dout_tvalid;
wire [15:0] s_axis_cartesian_tdata;
assign s_axis_cartesian_tvalid = 1’b1;
assign m_axis_dout_tvalid = 1’b1;
cordic_0 arctan (
.aclk(aclk), // input wire aclk
.s_axis_cartesian_tvalid(s_axis_cartesian_tvalid), // input wire s_axis_cartesian_tvalid
.s_axis_cartesian_tdata({data_x[15],data_x[15:1],data_y[15],data_y[15:1]}), // 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(data_out) // output wire [7 : 0] m_axis_dout_tdata
);
endmodule
PS
- 配置Cordic输入端口的时候需要注意一共是输入32位
- 这个输入可以再深入研究
tb
`timescale 1ns / 1ps
module tb_arctan;
reg aclk;
reg [15:0] data_x;
reg [15:0] data_y;
wire [15:0] data_out;
arctan uut(
.aclk(aclk),
.data_x(data_x),
.data_y(data_y),
.data_out(data_out)
);
initial begin
aclk = 0;
data_x= 15'd0;
data_y= 15'd0;
end
always@(posedge aclk)
begin
data_x= 15'd20282;
data_y= 15'd25717;
end
always #5 aclk = ~aclk;
endmodule
PS
- 这里只是给了几个固定值,实际测试还是给波形比较合理