草庐IT

vivado cordic IP学习记录

希言自然也 2023-04-30 原文

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

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

        比如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范围时,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:

UFix8_1:

UFix8_0:

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

 UFix8_7:

UFix8_1:

UFix8_0:

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

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

        我们先计输入数据X,输出出数据为Y,。范围在[0,2)的输入数据X记为,其平方根即为;范围在[2,∞)输入数据X 记为,其平方根记为

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

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

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

 

 

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

再回到刚才的示例:

X_IN:00001000

 UFix8_7:

UFix8_1:

UFix8_0:

X_OUT:00100000

UFix8_7: 

UFix8_1:     (整数位共7位,因此A=7-1=6)

UFix8_0:    (整数位共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核计算出来的结果与理论结果非常相近。

有关vivado cordic IP学习记录的更多相关文章

  1. ruby - Sinatra:运行 rspec 测试时记录噪音 - 2

    Sinatra新手;我正在运行一些rspec测试,但在日志中收到了一堆不需要的噪音。如何消除日志中过多的噪音?我仔细检查了环境是否设置为:test,这意味着记录器级别应设置为WARN而不是DEBUG。spec_helper:require"./app"require"sinatra"require"rspec"require"rack/test"require"database_cleaner"require"factory_girl"set:environment,:testFactoryGirl.definition_file_paths=%w{./factories./test/

  2. ruby-on-rails - Rails 5 Active Record 记录无效错误 - 2

    我有两个Rails模型,即Invoice和Invoice_details。一个Invoice_details属于Invoice,一个Invoice有多个Invoice_details。我无法使用accepts_nested_attributes_forinInvoice通过Invoice模型保存Invoice_details。我收到以下错误:(0.2ms)BEGIN(0.2ms)ROLLBACKCompleted422UnprocessableEntityin25ms(ActiveRecord:4.0ms)ActiveRecord::RecordInvalid(Validationfa

  3. LC滤波器设计学习笔记(一)滤波电路入门 - 2

    目录前言滤波电路科普主要分类实际情况单位的概念常用评价参数函数型滤波器简单分析滤波电路构成低通滤波器RC低通滤波器RL低通滤波器高通滤波器RC高通滤波器RL高通滤波器部分摘自《LC滤波器设计与制作》,侵权删。前言最近需要学习放大电路和滤波电路,但是由于只在之前做音乐频谱分析仪的时候简单了解过一点点运放,所以也是相当从零开始学习了。滤波电路科普主要分类滤波器:主要是从不同频率的成分中提取出特定频率的信号。有源滤波器:由RC元件与运算放大器组成的滤波器。可滤除某一次或多次谐波,最普通易于采用的无源滤波器结构是将电感与电容串联,可对主要次谐波(3、5、7)构成低阻抗旁路。无源滤波器:无源滤波器,又称

  4. CAN协议的学习与理解 - 2

    最近在学习CAN,记录一下,也供大家参考交流。推荐几个我觉得很好的CAN学习,本文也是在看了他们的好文之后做的笔记首先是瑞萨的CAN入门,真的通透;秀!靠这篇我竟然2天理解了CAN协议!实战STM32F4CAN!原文链接:https://blog.csdn.net/XiaoXiaoPengBo/article/details/116206252CAN详解(小白教程)原文链接:https://blog.csdn.net/xwwwj/article/details/105372234一篇易懂的CAN通讯协议指南1一篇易懂的CAN通讯协议指南1-知乎(zhihu.com)视频推荐CAN总线个人知识总

  5. 深度学习部署:Windows安装pycocotools报错解决方法 - 2

    深度学习部署:Windows安装pycocotools报错解决方法1.pycocotools库的简介2.pycocotools安装的坑3.解决办法更多Ai资讯:公主号AiCharm本系列是作者在跑一些深度学习实例时,遇到的各种各样的问题及解决办法,希望能够帮助到大家。ERROR:Commanderroredoutwithexitstatus1:'D:\Anaconda3\python.exe'-u-c'importsys,setuptools,tokenize;sys.argv[0]='"'"'C:\\Users\\46653\\AppData\\Local\\Temp\\pip-instal

  6. ruby-on-rails - 事件记录 : Select max of limit - 2

    我正在尝试将以下SQL查询转换为ActiveRecord,它正在融化我的大脑。deletefromtablewhereid有什么想法吗?我想做的是限制表中的行数。所以,我想删除少于最近10个条目的所有内容。编辑:通过结合以下几个答案找到了解决方案。Temperature.where('id这给我留下了最新的10个条目。 最佳答案 从您的SQL来看,您似乎想要从表中删除前10条记录。我相信到目前为止的大多数答案都会如此。这里有两个额外的选择:基于MurifoX的版本:Table.where(:id=>Table.order(:id).

  7. Ruby 守护进程导致 ActiveRecord 记录器 IOError - 2

    我目前正在用Ruby编写一个项目,它使用ActiveRecordgem进行数据库交互,我正在尝试使用ActiveRecord::Base.logger记录所有数据库事件具有以下代码的属性ActiveRecord::Base.logger=Logger.new(File.open('logs/database.log','a'))这适用于迁移等(出于某种原因似乎需要启用日志记录,因为它在禁用时会出现NilClass错误)但是当我尝试运行包含调用ActiveRecord对象的线程守护程序的项目时脚本失败并出现以下错误/System/Library/Frameworks/Ruby.frame

  8. ruby-on-rails - 在 Rails 中更高效地查找或创建多条记录 - 2

    我有一个应用需要发送用户事件邀请。当用户邀请friend(用户)参加事件时,如果尚不存在将用户连接到该事件的新记录,则会创建该记录。我的模型由用户、事件和events_user组成。classEventdefinvite(user_id,*args)user_id.eachdo|u|e=EventsUser.find_or_create_by_event_id_and_user_id(self.id,u)e.save!endendend用法Event.first.invite([1,2,3])我不认为以上是完成我的任务的最有效方法。我设想了一种方法,例如Model.find_or_cr

  9. ruby - 我正在学习编程并选择了 Ruby。我应该升级到 Ruby 1.9 吗? - 2

    我完全不是程序员,正在学习使用Ruby和Rails框架进行编程。我目前正在使用Ruby1.8.7和Rails3.0.3,但我想知道我是否应该升级到Ruby1.9,因为我真的没有任何升级的“遗留”成本。缺点是什么?我是否会遇到与普通gem的兼容性问题,或者甚至其他我不太了解甚至无法预料的问题? 最佳答案 你应该升级。不要坚持从1.8.7开始。如果您发现不支持1.9.2的gem,请避免使用它们(因为它们很可能不被维护)。如果您对gem是否兼容1.9.2有任何疑问,您可以在以下位置查看:http://www.railsplugins.or

  10. ruby - 在模块/类之间共享全局记录器 - 2

    在许多ruby​​类之间共享记录器实例的最佳(正确)方法是什么?现在我只是将记录器创建为全局$logger=Logger.new变量,但我觉得有更好的方法可以在不使用全局变量的情况下执行此操作。如果我有以下内容:moduleFooclassAclassBclassC...classZend在所有类之间共享记录器实例的最佳方式是什么?我是以某种方式在Foo模块中声明/创建记录器还是只是使用全局$logger没问题? 最佳答案 在模块中添加常量:moduleFooLogger=Logger.newclassAclassBclassC..

随机推荐