XILINX CORDIC IP核使用记录

问题简述

基于FPGA实现Sobel算法,计算出像素水平和铅直方向的微分dx,dy后,需要计算向量{dx,dy}的模与其夹角,即实现 ( d x ) 2 + ( d y ) 2 \sqrt{(dx)^2 + (dy)^2} (dx)2+(dy)2
arctan ⁡ ( d y / d x ) \arctan(dy/dx) arctan(dy/dx)
肯定不能使用乘法器或者除法器呀,那太费资源了。遂使用CORDIC算法,该算法的原理部分不再赘述。

cordic IP核的详细介绍和使用

该内容大部分来自于xilinx cordic IP核官方文档。
在这里插入图片描述
基本思路是根据6.0版本的cordic核中各个配置和功能进行记录。

配置选项

配置参数

  1. Functional Selection(功能选择):旋转,坐标变换,双曲正弦函数(sinh),双曲余弦函数(cosh),反正切(arctan),反正切双曲函数(arctanh),平方根。
    在sobel算子中使用到的是arctan和square root。针对这两个功能着重记录。
  2. Architecture Configuration (配置构架):
    Parall(并行):占用更多而逻辑资源,其内部实现的电路规模与迭代次数和输出精度的乘积成正比。但具有单周期的吞吐量,即N位宽度的输出需要N个时钟周期延迟才可以实现,每个时钟周期都会有一个输出。
    Word Serial(串行):相比之下使用更少的逻辑资源,其内部实现的电路规模与输出精度成正比多周期的吞吐量,即N位宽度的输出需要N个时钟周期延迟才可以实现,并且每N个时钟周期才可以输出一个数据。
    注:延迟周期除了与架构有关,AXI总线的通信协议影响更大。
  3. Pipelining Mode(流水线模式)
    NONE:无流水线,Latency = 0,可能需要很多的LUTS.
    Optimal:CORDIC核心是通过尽可能多的阶段来实现的,而不需要使用任何额外的LUTs。
    Maximum:CORDIC核心是在每个shift-add子阶段之后通过管道实现的(不太懂)。
  4. 数据格式:arctan默认为有符号数,square_root为可选。
  5. 相位格式
    IP核中针对相位格式有两个选项:
    Radians(弧度制),范围为(-pi,pi)。
    Scaled Radians(归一化的弧度制),范围为(-1,1)。
    AXI-4 Stream
    Stream 即是去掉了地址项,允许无限制的数据突发传输,由AXI-FULL和AXI-LITE的读写变成了对数据的收发。

输入\输出选项

  1. 输入\输出位宽
  2. 近似模式:
    a. Truncate(截断)
    b. Positive Infinity(向正无穷跑): 对于正数来说就是四舍五入,对于负数来说就是截断。
    c. Pos Neg Infinity(分开跑):四舍五入。
    d. Nearest Even:跑向最近的偶数

其他选项

  1. 迭代次数和精度:不写就会根据你的其他设定,自动设置。
  2. Coarse Rotation
    如果关闭Sin,Cos,Arctin 输出的角度将被局限在一象限
    (-Pi/4,+ Pi/4)。粗旋转通过将输入样本旋转到第一象限并将输出样本反向旋转回适当的象限,将CORDIC操作范围扩展到整个圆。

AXI-Stream选项

在这里插入图片描述
从此图可以看到ready信号显示在模块端口中,但无法enable(不是我没有选,就是没有)。估计是assign ready= valid。
其中,有两种模式选择:NON BLOCKING和BLOCKING
如下图所示:
在这里插入图片描述
non_blocking模式的特点和时序图
在这里插入图片描述
针对两个输入,该模式输出的数据就是两个信号的valid和ready同时有效处的值。
blocking模式的特点和时序图
在这里插入图片描述
针对两个信号,此模式会将有效信号(valid和ready同时拉高)进行排序,配对,a信号的第一个有效数据配对b信号第一个有效数据。

具体功能

arctan
在这里插入图片描述
输入采用Q1格式的有符号定点数(首位为符号位,之后一位整数位,其余为小数位),输出采用Q2格式的有符号定点数(首位为符号位,之后两位整数位,其余为小数位)。在仿真过程中我的Xin与Yin有很多都不满足这个条件但都计算出了正确值。。。
Square Root
在这里插入图片描述
平方根操作的data format有两种选择:

  1. Unsigned Fraction(无法号分数),整数位宽为1位
    在这里插入图片描述
  2. Unsigned Integer(无符号整数)
    在这里插入图片描述
    输入位宽确定后输出位宽自动确定。
  • 7
    点赞
  • 87
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Xilinx提供了CORDIC IP核,可以用于实现三角函数计算。CORDIC(Coordinate Rotation Digital Computer)是一种通过旋转坐标轴来计算三角函数的算法,它具有高精度、低功耗、低面积等优点,在数字信号处理、通信、图像处理等领域得到广泛应用。 以下是实现正弦函数计算的示例代码: ```verilog `timescale 1ns / 1ps module cordic_sin ( input signed [31:0] angle, output reg signed [31:0] sin_out ); wire signed [31:0] x, y, z; reg signed [31:0] x_buf, y_buf, z_buf; reg [31:0] i; CORDIC #( .DATA_WIDTH(32), .MODE(1), // Mode 1: Compute sin and cos .ITERATIONS(16), // Number of iterations .ANGLE_PRECISION(32), // Angle precision .PIPELINE_STAGE(0) // Pipeline stage ) cordic_inst ( .x(x), .y(y), .z(z) ); // Initial values assign x = angle; assign y = 0; assign z = 0; always @ (posedge cordic_inst.clk) begin if (cordic_inst.done) begin sin_out <= y_buf; x_buf <= x; y_buf <= y; z_buf <= z; i <= 0; end else begin // Shift x, y, z for next iteration x_buf <= x; y_buf <= y; z_buf <= z; x <= cordic_inst.x_out >> i; y <= cordic_inst.y_out >> i; z <= cordic_inst.z_out >> i; i <= i + 1; end end endmodule ``` 在上面的代码中,我们使用CORDIC IP核计算输入角度的正弦值。输入角度为一个有符号的32位整数,输出正弦值也是一个有符号的32位整数。我们使用MODE 1来计算正弦和余弦,ITERATIONS为16,ANGLE_PRECISION为32(表示输入角度的精度为32位),PIPELINE_STAGE为0(表示不使用流水线)。 我们将输入角度直接赋值给x,y和z的初始值都为0。每次CORDIC IP核完成一次计算后,我们将得到下一次计算的x、y和z值,同时将当前计算得到的y值存储在sin_out寄存器中。 需要注意的是,CORDIC IP核是一个带有时钟的模块,因此我们需要在时钟上升沿时检查计算是否完成。如果计算完成,我们将存储下一次计算所需的x、y和z值,并将i重置为0,以便进行下一轮迭代。 值得注意的是,CORDIC IP核支持流水线操作,可以在可接受的延迟范围内提高性能。如果您需要更快的计算速度,可以尝试调整PIPELINE_STAGE参数。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值