Cordic角度旋转算法高位宽输入实现DDS的一些思考

2023-10-31

Cordic角度旋转算法简介:

        在DDS内,Cordic算法相当于替代Rom的一种相幅映射算法,算法通过计算单位圆上点的X坐标和Y坐标,得到角度θ的正弦和余弦值,从一个正弦和余弦已知的初始角度开始,通过多次旋转一系列固定角度来获得所需点的坐标。

 其公式如下所示:

        

 

 

硬件内架构如下所示:

        

通过多次流水迭代即可实现相幅映射关系。

具体迭代的算法详解这里就不再解释,详情可以看一休哥的Cordic算法详解,里面的算法解释及硬件实现代码解释的很清楚。

基于FPGA的CORDIC算法实现——Verilog版_善良の一休君的博客-CSDN博客_cordic算法fpga实现算法本身并不是太难,不过结合到具体的设计中需要具体理解,由于项目需求需要位宽较大的相位累加器,而对于基于Rom的查找表来说,相位累加器的位宽和Rom的深度是相关的,不可能在大位宽的输入情况下,完全的根据位宽实现Rom的深度,这带来的Rom大小是不可估量的,为此我查找了文献的DDS实现方案,基本上有两种方案,一是将ROM压缩,这里可以参考我其他的博文,另外一种方案是将Rom替代,也就是本文的Cordic算法详解,这里结合具体项目笔者写下根据项目出发的一些思考:

        根据项目需求我对相位累加器的位宽直接采用到了48位,幅值量化位数也就是输出正余弦的位宽上我分别采用了8位和16位,带符号位。

        仿真时我才用主频250M,输出波形我分别采用了10M,0.694M。

        在联系到具体的设计上,K值直接联系着输出位宽,输出位宽为16位,K值就是0.607253*2^16,输出位宽为8位,K值就是0.607253*2^8.

        Cordic算法的流水深度也是根据K值而来的,在K值是16位的情况下,流水迭代基本上也就在16级的流水深度下停止迭代,这点可以根据公式非常容易的推出,X值和Y值在后续的迭代过程中基本上相加的也是0值,而K值是8位的情况下,流水迭代基本上在第8级的流水深度下停止迭代。

        输入位宽过大,输出位宽过小,流水迭代过早的停止导致本想由输入位宽大造成的高频率分辨率的优点大大减小,而在实际的迭代过程中由于流水过早的停止,基本上也是高位参与了迭代过程,低位由于流水迭代的深度小没有迭代到低位主要参与的流水深度相当于没起到作用。在仿真过程中我将输入位宽为12位输出数据位宽为8位的仿真模型与输入位宽为48位输出位宽为8位的仿真模型进行了对比,输出数据基本一致,在相位的位宽上基本上只有高位参与了迭代过程。

        同时结合具体的需求,比如要求就是输出位宽为8位或者16位,但是输入位宽为32为或者48位时,直接采用8位或者16位进行迭代肯定会影响流水的效果,为此我分别将K值先扩大到36位和48位,加深流水深度,并将输出的结果再缩短为16位和8位并对比和直接将K值为16位和8位以及直接采用Vivado的DDS基于Rom查找表实现方式进行了对比,仿真效果上输出的数据基本上一致。

        从全方位考虑,采用多级流水实现迭代所带来的乘法器和移位器消耗的成本和实现的结果对比而言,完全不如采用Rom查找表实现,但是如果采用高位输出,高位宽输入的情况下,完全可以采用Cordic算法实现,但是在相幅量化位数较低的情况下不如直接采用Rom查找表实现DDS,这样所带来的成本还有实现收益而言是比较合适的。

        下图为仿真过程中采用48位输入,8位输出,在内部采用41级流水线实现的资源消耗图:

        

        作为对比下图为采用查找表方式实现的12位输入,8位输出的资源消耗对比:

         

可以发现相差甚多!而且功耗相差也是甚多! 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Cordic角度旋转算法高位宽输入实现DDS的一些思考 的相关文章

随机推荐

  • 深入理解Socket套接字:必要的参数详解

    深入理解Socket套接字 必要的参数详解 文章目录 深入理解Socket套接字 必要的参数详解 引言 1 1 简介 1 2 Socket套接字的作用 Socket套接字的创建 2 1 Socket函数 2 2 Socket函数参数详解 S
  • 完美的mysql备份脚本

    转自 https www cnblogs com leffss p 7832047 html bin bash 全备方式 一般在从机上执行 适用于小中型mysql数据库 删除15天以前备份 作者 fafu li 时间 2015 08 10
  • 【全栈开发指南】OAuth2授权获取token调试接口的方式

    在我们实际应用接口的调用调试过程中 需要用到token或者刷新token GitEgg支持OAuth2 0协议进行认证授权 这里介绍说明如何通过Postman获取token和refresh token并进行接口调试 1 使用密码模式获取to
  • win10禁用windows更新

    Windows 10系统中有一项Update Orchestrator Service 更新协调器办事 在当地办事窗口中 我们发现 Update Orchestrator Service 状态的启动类型为灰色 无法进行点击修改 2 禁用Wi
  • ESB产品Oracle数据库升级说明

    ESB企业服务总线平台作为支撑企业综合集成的产品 在应用集成 数据集成 数据治理等解决方案都发挥着非常重要的作用 随着产品和解决方案的不断优化和升级 ESB企业服务总线平台功能需要逐步进行完善 不断提升产品功能的完备性 易用性和全面性 为了
  • 类和对象

    面向对象 类和对象 数据存储方面 变量 只能存储一个 如果内容多了 存储起来需要定义n个变量 麻烦 数组 可以存储一组相同数据类型的数据 数据类型相同 如果用数组存储一个人的信息 比较丰富的信息的话 不太方便 例如 吃货联盟中存储订单和菜品
  • Flowable-ui-modeler和MybatisPlus冲突问题

    启动出现报错 file F code test flowable boot target classes com example flowableboot flowable mapper ProcessModelMapper class r
  • 目录功能详解

    bin usr bin usr local bin 是Binary的缩写 这个目录存放着最经常使用的命令 sbin usr sbin usr local sbin s就是Super User的意思 这里存放的是系统管理员使用的系统管理程序
  • SpringBoot配置多个Redis集群数据源+自定义缓存注解实例

    今天找了半天没找到线程的 网上都是多个Redis示例 最还还是自己想办法实现了 两个Redis集群作为数据源 自定义缓存注解 不会做的是否发现好tm难 都不知道怎么动手 做完之后 发现原理其实特别简单 很容易就能实现 分两部分原理和示例代码
  • 使用pycharm传入初始化环境配置参数(Run configuration)

    在run gt edit configurations 选择项目并填写参数
  • td 字典表_字典表设计

    为什么字典表 存在问题 某些变量在多个地方使用 而且一般是固定的 但是随着系统升级和后期变化 可能需要改变 如果这些变量写死在代码里面将会变得难以维护 所以要将其从代码中抽离出来 一般的业务系统客户端与用户交互的时候都会使用下拉框组件 对于
  • day2作业

    1 列举出3种常见的操作系统 答 操作系统 windows ubuntu MacOS 其内核 windowsNT Linux uniux 2 简述Ubuntu和Linux的关系 答 Ubuntu 乌班图 是一个以桌面应用为主的Linux操作
  • 数据结构C语言版——初始化一个线性表

    问题描述 初始化一个线性表 程序代码 include stdio h include stdlib h define OVERFLOW 0 define OK 1 define LIST INIT SIZE 100 define LISTI
  • bomblab实验-bomb1~6and隐藏关

    bomb1 08048ae0
  • Spring之Bean的生命周期

    文章目录 BeanFactory 中 Bean的生命周期 测试代码 结论 ApplicationContext中 Bean的生命周期 BeanFactory 中 Bean的生命周期 带 的表示为容需要实现的接口 不带星号的表示是bean要实
  • Python 第10章课后习题参考答案

    第10章课后习题参考答案 一 单项选择题 以下关于Python内置库 标准库和第三方库的描述 正确的是 A 第三方库需要单独安装才能使用 B 内置库里的函数不需要 import 就可以调用 C 第三方库有三种安装方式 最常用的是 pip 工
  • 【IntellJ IDEA】idea上所有代码都报错了

    可能会碰到蓝屏 内存溢出重启idea等特殊情况 重新打开idea后发现原本的代码全都报错了 正确的解决方法 方法很简单 执行idea工具栏上下面的菜单 File gt Invalidate Caches Restart 重置下缓存就可解决该
  • Samba服务的介绍,安装和使用

    一 samba概述 Samba是在Linux和UNIX系统上实现SMB协议的一个免费软件 由服务器及客户端程序构成 SMB Server Messages Block 信息服务块 是一种在局域网上共享文件和打印机的一种通信协议 SMB协议是
  • (二)Qt实现自定义控件的两种方式---插件法

    系列文章目录 一 Qt实现自定义控件的两种方式 提升法 二 Qt实现自定义控件的两种方式 插件法 文章目录 系列文章目录 前言 一 Qt自定义控件的制作 完整代码 二 QtCreator使用DLL文件 问题解决 总结 前言 上一篇文章提到了
  • Cordic角度旋转算法高位宽输入实现DDS的一些思考

    Cordic角度旋转算法简介 在DDS内 Cordic算法相当于替代Rom的一种相幅映射算法 算法通过计算单位圆上点的X坐标和Y坐标 得到角度 的正弦和余弦值 从一个正弦和余弦已知的初始角度开始 通过多次旋转一系列固定角度来获得所需点的坐标