cordic ip核 vivado_Xilinx Vivado CORDIC IP求解atan 反正切

本文介绍了如何在Xilinx Vivado中使用CORDIC IP核来求解反正切。内容包括创建工程、IP配置、输入输出位宽设置、数据归一化处理、二进制小数表示以及测试 bench 的创建。特别强调了CORDIC IP核输入要求的1Qn格式,以及如何将非1Qn格式的数据转换为兼容格式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

赛灵思官方提供了cordic(coordinate rotational digital computer) ip核实现直角坐标极坐标变化,三角函数的操作。我介绍下它进行反正切求解的使用:

新建个简单工程:bd如下

进行ip设置,选择运算位反正切后,ip端口回自动变为上图,再引出2个总线和时钟,xilinx的ip核不少是基于AXI4-Stream总线,这里使用并不复杂,默认只有2个信号,一个数据线tdata,一个握手信号tvalid,tvalid拉高时数据信号有效。

确定了输入输出位宽后,系统会自动求解出需要的延时latency。这里说一句,AXI-Stream总线收发基于byte的,无论输入什么位宽最后都是8的整数倍。所以需要参照UG,放置好有效输入位和分解输出位。

如果输入输出位宽恰好不是8的倍数,那么tdata位宽是大于设定的值的。所以需要上图提到进行填充(PAD),比如我输入20位,x和y加起来40位,那么输入S_AXIS的位宽是48,我要在0-19放x,20-23放填充数据(随意,我用0),24-43放y,44-47放填充数据。必须保证0-19和24-25分别是我的x和y。

atan=y/x,要求输入必须是[-1,1],所以如果数据不是这个区间还需要进行归一化处理(可以用除法器div_gen ip核,这里不做介绍了)。上图是一个简单的示例,介绍输入输出的定点小数格式。整数部分的第一位是符号位,小数部分没有符号位是正的。※Q格式:小数点位于第 n 位元之右侧,称为Qn 格式。

这里关于二进制小数表示,可以看下这个https://blog.youkuaiyun.com/AaricYang/article/details/87882868。整数的每一位权重是2^(n-1) 111就是2^2+2^1+2^0=7,小数部分的权重是2^(-n) 0.111就是2^(-1)+2^(-2)+2^(-3)=0.875

这里我觉得还有一个细节问题。如果输入的数值x或y是负数小数,比如1100,常规默认符号位第一位,第二位开始就是小数部分了,所以1010就是1.010= -1+0.25= -0.75;这种符号位后一位就是小数部分的第一位的格式就是vivado 除法器ip输出小数的格式。也可以说这种是0Qn format,即符号位后0位就是小数。但是cordic ip输入要求 1Qn format,符号位结束后1位才是小数格式(为了兼容恰好等于±1的情况),那么刚刚1010就不可以直接作为cordic ip核的输入,1010按照1Qn format,第3位才是小数部分,1010就是10.10= -1.5 因为整数部分是10,反码01,补码10为2,因为是负数所以-2,小数部分是0.5,最终结果是-2+0.5=1.5。这样就不符合cordic ip核输入要求了。从0Qn改为1Qn为了满足,如果是绝对值小于1的数只要在符号位后重复符号位就可以了,1 010改为11 010,这样就可以正常输入到cordic中了。

`timescale 1 ns / 1psmodulecordic_tb_top;regaclk;wire [31:0]M_AXIS_DOUT_0_tdata;wireM_AXIS_DOUT_0_tvalid;reg [47:0]S_AXIS_CARTESIAN_0_tdata;regS_AXIS_CARTESIAN_0_tvalid;integer handle;

initial beginaclk=0;

S_AXIS_CARTESIAN_0_tvalid=1'b0;

S_AXIS_CARTESIAN_0_tdata='b0;

end

initial handle = $fopen("D:/FPGAcode/_file/cordic.txt");//打开文件

always #10 aclk=~aclk;localparam PAD=(48-20*2)/2;always@(posedge aclk) beginS_AXIS_CARTESIAN_0_tvalid<=1'b1;

S_AXIS_CARTESIAN_0_tdata<={{PAD{1'b0}},{3'b000,17'b0},{PAD{1'b0}},{3'b111,17'b0}};end

always@(posedge aclk) begin

if(M_AXIS_DOUT_0_tvalid)

$fdisplay(handle,"%b",M_AXIS_DOUT_0_tdata);//写数据

enddesign_1_wrapper design_1_i

(.M_AXIS_DOUT_0_tdata(M_AXIS_DOUT_0_tdata),

.M_AXIS_DOUT_0_tvalid(M_AXIS_DOUT_0_tvalid),

.S_AXIS_CARTESIAN_0_tdata(S_AXIS_CARTESIAN_0_tdata),

.S_AXIS_CARTESIAN_0_tvalid(S_AXIS_CARTESIAN_0_tvalid),

.aclk_0(aclk));endmodule

给个简单的testbench

在modelsim中可以设置小数位数,显示出具体的数值。

如果自己参考文献,用HDL实现一个CORDIC算法的模块,应该是很不错了。但是我偷懒直接用现成IP了

### CORDIC IP实现arctan功能的设计与应用 CORDIC(Coordinate Rotation Digital Computer)是一种高效的数值计算算法,在FPGA中广泛用于三角函数、三角函数和其他数学运算的硬件加速。以下是关于如何通过CORDIC IP实现arctan功能的具体分析。 #### 1. CORDIC算法原理 CORDIC算法的心思想是通过对坐标系中的向量进行一系列旋转操作,逐步逼近目标角度或距离[^1]。对于arctan(y/x)的计算,可以通过迭代方式调整输入向量的方向角θ,使其最终接近于y/x对应的正切值。具体来说,每次旋转的角度由预先设定的一组常数决定,这些常数决定了精度和收敛速度。 #### 2. 使用Vivado中的CORDIC IPXilinx Vivado开发环境中,可以直接调用CORDIC IP来简化设计过程。为了正确配置并使用此IP,需注意以下几个方面: - **查阅官方文档** 配置IP前应仔细阅读其User Guide。可以在IP配置界面上点击“Documentation”按钮访问相关资料,或者通过Xilinx官网查询编号为pg105的文档获取详细指导[^2]。 - **参数设置** - 输入模式选择:针对arctan计算,建议选用Vectoring Mode。 - 输出格式定义:确保输出支持固定点表示法以便后续处理。 - 数据宽度调节:依据实际需求平衡资源消耗与计算精确度之间的关系。 #### 3. Verilog代码实例 下面展示了一段简单的Verilog代码片段,演示了如何实例化CORDIC模块完成基本的功能验证工作。 ```verilog module cordic_arctan ( input wire clk, input wire reset, // Input Ports input wire signed [15:0] x_in, y_in, // Output Ports output reg signed [15:0] angle_out ); // Internal Signals Declaration reg start; wire done; // Instantiation of the CORDIC Core cordic_ip_core U_CORDIC_CORE ( .aclk(clk), .s_axis_cartesian_tvalid(start), .s_axis_cartesian_tdata({y_in,x_in}), .m_axis_dout_tvalid(done), .m_axis_dout_tdata(angle_out) ); always @(posedge clk or posedge reset) begin if (reset) begin start <= 1'b0; end else begin start <= ~start; // Toggle Start Signal Every Clock Cycle For Testing Purpose. end end endmodule ``` 上述代码展示了如何创建一个顶层模块`cordic_arctan`并将内部心组件连接起来形成完整的系统结构[^5]。 #### 4. 定点化的考虑因素 由于浮点运算耗费较多逻辑单元,在嵌入式领域更倾向于采用定点数表达形式来进行高效运算。MATLAB可作为前期仿真的有力工具帮助确定最佳量化策略后再移植至HDL描述阶段。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值