代码编织梦想

一、QN格式(Q数据格式)

        XQN格式数据,是一个1bit符号位+X bits整数位+N bits小数位的补码数据。可表达的数据的范围是[-2X,2X-2(-N)],

        比如Q15,指的是X=0,N=15的Q格式数据,加上符号位合计16位数据(等同于Q1.15)。

        又比如1Q15,指的是X=1,N=15的Q格式数据,加上符号位合计17位数据(等同于Q2.15)。

        Q格式数据也可以用Fix格式数据表示。

        对于有符号数,表示为Fix(1+X+N)_N,X表示整数位数,N表示小数位数。

        对于无符号数,表示为uFix(X+N)_N,X表示整数位数,N表示小数位数。

举例

        1Q7格式数据(Q2.7)

        2Q7格式数据(Q3.7)

 二、CORDIC算法中的Q格式

2.1笛卡尔坐标数据的表示

        笛卡尔坐标数据使用定点数补码表示,无视总的数据位宽,整数位固定2位,其余为小数位。使用Q数据格式表达为1QN,小数位N=总数据位宽-2。

        一般情况下,输入数据X_IN和Y_IN范围为[-1,1]。超范围可能会导致未定义的结果。

        最大值和最小值表示如下:

        计算平方根时,若设置为无符号小数,X_IN范围时[0,2],Q数据格式为1bit整数位,其余是小数位(没有符号位)

        若设置为无符号整数X_IN范围时[0,2^{input width}],Q格式数据位宽全部为整数位。

2.2相位/弧度数据的表示

        PHASE_IN和PHASE_OUT使用二进制补码形式的定点数表示,整数位一共3位,其余为小数位。

        相位数据格式可使用两种表达形式:Radians和scaled Radians。

        选用Radians表达形式时,PHASE_IN范围为[-π,π]。最大值和最小值可以表达如下:

        选用scaled Radians表达形式时,PHASE_IN范围为[-1,1]。最大值和最小值可以表达如下:

 

2.3举例

        举例:旋转模式下,从坐标(Xin,Yin)旋转角度Pin,目标坐标的值为(Xout,Yout)。Q 格式数据示例如下:

        上图表示的是,从坐标(0.707,0.25)顺时针旋转90°,旋转到坐标(0.25,-0.707)。

        举例:向量模式下,坐标(Xin,Yin)旋转到x轴上,得到的横坐标和旋转的角度值。Q 格式数据表示如下:

          上图表示的是,从坐标(0.707,0.25)旋转到横坐标(0.75,0),一共旋转的弧度是0.336

 

三、映射不同数据格式

        假设输入数据与输出数据位宽不一致时,需要进行映射处理。同一个二进制数据,按照不同的XQN格式,其表达的十进制数据是不同的。

        如果输出数据宽度比输入数据宽度小,CORDIC算法输出的结果减少了小数部分bits数。当数据输出比输入数据宽度大,那么增加小数部分的bits数。

平方根数据的映射。

无符号数X_IN:00001000

 UFix8_7:\sqrt{0.0625}=0.25

UFix8_1:\sqrt{4}=2

UFix8_0:\sqrt{8}= 2.8284

平方根X_OUT输出:00100000,在不同的Q格式下,X_OUT代表的数值:

 UFix8_7:\sqrt{0.0625}=0.25

UFix8_1:\sqrt{4}=16

UFix8_0:\sqrt{8}=32

CORDIC计算平方根的X_IN的取值范围是[0,2)。根据上表,我们发现,如果直接用Ufix8_1和Ufix8_1格式计算X_OUT,计算出来的数值明显错误。那么该如何处理呢?

        我们先计输入数据范围在[0,2)的数据为X,输入数据范围在[2,∞)为xalt,输出出数据为Y。

        我们先计输入数据X,输出出数据为Y,Y=\sqrt{X}。范围在[0,2)的输入数据X记为X_{normal},其平方根即为Y_{normal};范围在[2,∞)输入数据X 记为X_{alt},其平方根记为Y_{alt}

        当输入数据取值为X_{normal},数据格式为Ufix8_7,正常按照CORDIC算法处理得出平方根Y_{normal}结果即可。

        当输入数据取值为X_{alt},直接使用CORDIC算法处理得到的数据不正确,需要先对数据进行缩放处理。

        缩放处理方式:X_{alt}右移A位,变换成Ufix8_7格式X_{normal}(A=m-1)。(实际二进制数值不发生任何变化,仅从意义上更改了Q格式小数点位置而已)

 Y_{alt}=\sqrt{X_{alt}}

 Y_{normal}=\sqrt{X_{normal}}=\sqrt{2^{-A}\times X_{alt}}=2^{-\frac{A}{2} } \times\sqrt{ X_{alt}}

        根据上面两个公式,我们发现,将X按照不同的取值范围方式进行CORDIC处理,得到的Y值存在2^{-\frac{A}{2} }的倍数关系。即超过数值2的输入X_IN,经过CORDIC算法计算平方根时,需要乘上2^{-\frac{A}{2} }

再回到刚才的示例:

X_IN:00001000

 UFix8_7:\sqrt{0.0625}=0.25

UFix8_1:\sqrt{4}=2

UFix8_0:\sqrt{8}= 2.8284

X_OUT:00100000

UFix8_7: \sqrt{0.0625}=0.25

UFix8_1:\sqrt{4}=16\times 2^{-\frac{6}{2}}=2     (整数位共7位,因此A=7-1=6)

UFix8_0:  \sqrt{4}=16\times 2^{-\frac{6}{2}}=2\sqrt{8}=32\times 2^{-\frac{7}{2}}=2.8284  (整数位共7位,因此A=8-1=7)

这里我们需要知道的是,使用CORDIC算法计算[0,2)之间的数与[2,∞]之间的数,计算平方根时有上面描述的缩放处理的区别。

 

四、CORDIC IP核 IO用户界面的参数配置

 

 

1、功能选择                                         

可选功能包括:

        rotate :旋转模式。输入初始坐标和旋转角度,输出目标坐标值

        Translate:向量模式。输入初始坐标,将其旋转到横坐标轴,输出旋转弧度和目标横坐标。

        Sin and cos:输入角度(弧度),输出cos值和sin值

        Sinh and cosh:输入双曲线角度(弧度),输出cosh值和sinh值

        Arctan:输入初始坐标(x,y),旋转到横坐标轴,输出atan(y/x)

        Arctanh:输入初始坐标,沿着双曲线旋转到横坐标轴,输出atanh(y/x)

        Square root:输入一个数值,输出其平方根值

基本上涵盖了CORDIC算法所能计算的全部运算。

当然,也可以通过基本的加减乘除运算简介地实现下面的运算:

2、架构配置

        并行架构:或者可以称为流水线架构,每个时钟可以输出新的数据(输入与其对应的输出相差N个时钟的延迟,N等于输出数据宽度)。

        串行架构:每N个时钟输出一个新的数据。(N等于输出数据宽度)

3、流水线模式

        NONE:CORDIC 实现时不使用流水线

        Optimal:CORDIC算法实现时,使用流水线,但是尽可能不多使用查找表资源,相当于自动优化资源和时序。

        Maximum:每个加减法运算都使用流水线。比较适合资源充裕时序困难的逻辑

4、数据格式

CORDIC算法提供了三种不同的格式表达输入数据X和Y。

        有符号小数:该格式是默认的设置,X和Y按照有符号定点数的补码进行表述,并且整数位宽度为2bits。1位符号位,1位整数位,其余为小数位。

        无符号小数:X和Y按照无符号定点数表达。1位整数位,其余为小数位。

        无符号整数:X和Y按照无符号整数表达,仅用于计算平方根的时候。

5、相位格式

两种相位格式可供选择:

        弧度:相位使用定点数补码表示,整数位为3bits,单位是rad,范围[-π,π]。比如01100000表示3.0rad

       归一化弧度:使用定点数补码表示,整数位宽3bits,单位是π rad,范围[-1,1]。比如00100000表示1*πrad;又比如11110000表示-0.5*πrad。

6、输入数据宽度

        X_IN/Y_IN/PHASE_IN的数据宽度

7、输出数据宽度

        X_OUT/Y_OUT/PHASE_OUT的数据宽度

8、取整模式

提供了三种输出数据的取整模式

        Truncate:截断模式,直接舍弃低位

        Positive infinity:,正方向四舍五入,等效于matlab的floor(x+0.5)

        Pos Neg infinity:正数正方向四舍五入,负数负方向四舍五入,等效于matlab的round(x)

        Nearest Even:输出数据取整为最近的整数,0.5向下取整,1.5向上取证

 

 

9、迭代次数

设置为0时,迭代次数由IP核自动决定。也可以手动输入迭代次数。

10、精确度

配置CORDIC IP内部计算时的精确度,当设置为0时,IP核自动决定精确度取值。也可以手动输入精确度。

11、粗略旋转

控制CORDIC算法使用的象限,勾选时可以在所有象限中使用;不勾选时只能在第一象限使用。

12、补偿方式

讲解原理的时候,学习过使用CORDIC算法时,会带来模长的拉伸,此处可选择是否乘上补偿因子。

        No scale compensation:不乘补偿因子

        LUT based:基于查找表保存补偿因子

        BRAM:基于BRAM保存补偿因子

        Embedded Multiplier:使用DPS进行计算补偿

五、CORDIC IP核的仿真使用

5.1 使用CORDIC IP核计算cos值和sin值

IP核配置截图

 

 按照手册要求、以Q3.13格式输入Q码数据,弧度值分别为

0,

π/6,

π/3,

π/2,

2π/3,

π,

-π/6,

-π/3,

-2π/3,

仿真后结果如下:(注意输出的cos和sin数据为Q2.14格式)

 

输入角度

输入相位

输入相位

理论cos值

理论sin值

CORDIC IP计算的cos值

CORDIC IP计算的sin值

/

/

/

/

/

有符号Q2.14码

十进制转换,近似值

有符号Q2.14码

十进制转换,近似值

0

0

0.000000

1.000000

0.000000

16'b01_00_0000_0000_0000

0

16'b11_11_1111_1111_1111

0

30°

pi/6

0.523599

0.866025

0.500000

16'b00_11_0111_0110_1100

0.86597

16'b00_10_0000_0000_0000

0.5

60°

pi/3

1.047198

0.500000

0.866025

16'b00_10_0000_0000_0000

0.5

16'b00_11_0111_0110_1101

0.86603

90°

pi/2

1.570796

0.000000

1.000000

16'b11_11_1111_1111_1100

0

16'b01_00_0000_0000_0000

1

120°

pi*2/3

2.094395

-0.500000

0.866025

16'b11_01_1111_1111_1111

-0.5

16'b00_11_0111_0110_1100

0.86597

180°

pi

3.141593

-1.000000

0.000000

16'b11_00_0000_0000_0000

-1

16'b00_00_0000_0000_0001

0

-30°

-pi/6

-0.523599

0.866025

-0.500000

16'b00_11_0111_0100_1110

0.86413

16'b11_10_0000_0000_0001

-0.5

-60°

-pi/3

-1.047198

0.500000

-0.866025

16'b00_10_0000_0000_0001

0.5

16'b11_00_1000_1001_0011

-0.86602

-120°

-pi*2/3

-2.094395

-0.500000

-0.866025

16'b11_10_0000_0000_0001

-0.5

16'b11_00_1000_1001_0010

-0.86602

-180°

-pi

-3.141593

-1.000000

0.000000

16'b10_11_1111_1111_1111

-1

16'b11_11_1111_1111_1111

0

         根据表格可以看出,经过CORDIC IP核计算出来的结果与理论结果非常相近。

 

5.2 使用CORDIC IP核计算平方根值

IP核配置截图

 

 

按照手册要求、输入无符号整数数据,分别为

1

4

16386

4096

16384

0

仿真后结果如下:

输入数值

理论的平方根

CORDIC算法计算的平方根

十六进制

十进制

/

十六进制

十进制

1

1

1

1

1

4

4

2

2

2

4002

16386

128.0078123

80

128

1000

4096

64

40

64

4000

16384

128

80

128

0

0

0

0

        根据表格可以看出,经过CORDIC IP核计算出来的结果与理论结果非常相近。

 

 

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/yindq1220/article/details/127168951

vivado中cordic ip 6.0 arctan 的使用_ocean_vv的博客-爱代码爱编程

有个项目需要用到arccos,然而,cordic中只有arctan,所以只能将就用一下了。哈哈 之前,有写过cordic中sin/cos 的使用。cordic IP 6.0 sin/cos 的使用  所以,也算对这个ip核比较熟悉了,这里只想记录一下  在使用arctan时,一些相关配置和输入输出的位数问题。如下图:   基本就需要注意一下这5个

关于altera stratix 4的pll ip核生成的时钟频率不准_qq_16923717的博客-爱代码爱编程

世界上没有PLL不能生成的时钟,如果一个PLL不够,那就两个 —— 尼古拉斯·赵四 前两天调试一个项目的时候遇到一个pll的问题,感觉以后也会遇到类似的问题,记录一下。 调试平台 调试平台如下图所示,基带主时

《fpga并行编程》读书笔记(第一期)03_cordic_sazc的博客-爱代码爱编程

《FPGA并行编程》读书笔记(第一期)03_CORDIC 0. 内容回顾1. 绪论2. 读书笔记源码说明3. 3个Solution带您理解CORDIC算法3.1 S1_Baseline3.2 S2_Simple_Re

VIVADO cordic IP核-爱代码爱编程

VIVADO中,cordic是一个实现通用坐标旋转计算的IP核,在进行数字信号处理时常常会用到,算法主要是通过迭代来解三角方程,不过这些原理的东西我们做FPGA实现的不需要掌握它的历史,重点是怎么用,正好最近刚刚做完一个bp神经网络的实现,很多地方都用到了cordic核,网上的讲解很散乱,所以决定自己写一个。 cordic核主要功能包括: rotate

【FPGA调整时序】调整时序过程中遇到的问题与解决方式-爱代码爱编程

毕设的时候FPGA逻辑部分已经做完了,虽然毕业了,但是老师还是希望我把整个流程做完。 现在在调整时序,由于之前没有怎么接触过,也没有师兄师姐帮助,调的我是心烦意乱 有人说没有调过时序就不算做过FPGA,因此我准备记录一下调整时序的方法,日后做个纪念 最开始检查时序,基本就是一片红,200MHz的时钟根本满足不了,我看最多支持到120M的时钟,感觉自己之前

cordic sinx 代码_使用CORDIC算法求解角度正余弦及Verilog实现-爱代码爱编程

本文是用于记录在了解和学习CORDIC算法期间的收获,以供日后自己及他人参考;并且附上了使用Verilog实现CORDIC算法求解角度的正弦和余弦的代码、简单的testbench测试代码、以及在Modelsim下的仿真结果。 本文主要参考了: 感谢! ------------------------------------------------

VIVADO仿真功能系列-爱代码爱编程

版权声明:本文为CSDN博主「FPGADesigner」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/FPGADesigner/article/details/81807296 一、仿真功能概述 仿真FPGA开发中常用的功能,通过给设计注入激励和观察输出结果

Xilinx vivado 常用IP核使用-爱代码爱编程

目录 1. Accumulator 12.02. Aurora 8B10B 11.13. Clocking Wizard3.1. 时钟资源4. Divider Generator 5.15. FIFO Generator 13.26. ILA(Integrated Logic Analyzer) 6.27. Multiplier 12.08. Bl

【Vivado HLS学习之CORDIC算法的实现】-爱代码爱编程

【Vivado HLS学习之CORDIC算法】 先抛出一个问题:在FPGA上怎么实现三角函数sin,cos的计算? 以sin为例,在计算机上实现sin函数可以用泰勒展开来近似。 s i

simulink hdl coder fpga初级开发实践(五)fft以及cordic算法进行信号相位校正_肆拾伍的博客-爱代码爱编程

前言: 本栏目除特别说明以外,均采用的黑金AX7103开发板,该开发板时钟频率为200M,并且是双端时钟,因此在每个项目中都有一段原语将双端时钟变成200MHz的单端时钟。文章仅作为学习记录,如有不足请在评论区指出,博

fpga之旅设计99例之第十六例----舵机驱动_valentinehp的博客-爱代码爱编程

一. 简介 本例将是FPGA之旅设计的第十六例,将介绍如何驱动舵机,实现任意角度的旋转,也是一个小模块,只需要三个IO即可完成驱动,一般购买模块的时候,就已经用杜邦线引出来了,根据杜邦线的颜色区分对应IO口的功能,一般由如

基于fpga与ds18b20温度传感器的通信实现_qq_778132974的博客-爱代码爱编程

温度传感器介绍: 本设计使用VHDL语言实现温度传感器的驱动,并通过数码管显示。下面有完整代码及注释介绍 工程截图: 全部代码如下: library IEEE; use IEEE.STD_LOGIC_1164.AL