m基于FPGA的cordic算法实现,输出sin和cos波形(包括仿真录像)

news/2024/5/18 3:58:53/文章来源:https://blog.csdn.net/hlayumi1234567/article/details/127148698

目录

1.源码获取方式

2.算法描述

3.部分程序

4.部分仿真图预览


1.源码获取方式

使用版本matlab2022a

获取方式1:

点击下载链接(解压密码C+123456):

m基于FPGA的cordic算法实现,输出sin和cos波形

获取方式2:

如果下载链接失效,加博主微信联系,或私信联系。

2.算法描述

      CORDIC(Coordinate Rotation Digital Computer)算法即坐标旋转数字计算方法,是J.D.Volder1于1959年首次提出,主要用于三角函数、双曲线、指数、对数的计算。该算法通过基本的加和移位运算代替乘法运算,使得矢量的旋转和定向的计算不再需要三角函数、乘法、开方、反三角、指数等函数。

       Cordic算法可以利用简单的移位和加减来计算复杂的三角函数、双曲函数、对数、指数等。

       Cordic算法核心思想有两点,通过已知的角度来逼近输入的角度(用移位来代替tanθ),已知角度的cosθ经过多次积累相乘趋于常数。

       CORDIC为Coordinate rotation digital computer的缩写,来自于J.E.Volder发表于1959年的论文中,是一种不同于“paper and pencil”思路的一种数字计算方法,当时专为用于实时数字计算如导航方程中的三角关系和高速率三角函数坐标转换而开发。如今看来,CORDIC非但没有局限于以上方面,反而在各个数字计算如信号处理、图像处理、矩阵计算、自动控制和航空航天等各领域获得了广泛的使用并成为了各行业不可替代的基石。所谓万物皆可信号处理,信号处理相关行业的各位与CORDIC自然难舍难分。又所谓“为人不识CORDIC,读尽算法也枉然”,CORDIC算法并不新鲜,今天老生常谈下CORDIC算法,尽量将每一步公式的变换展示清楚,希望对新手有用。

       ROM资源,作为产生离散正弦信号的另一种有效途径,CORDIC(坐标旋转数值计算)算法已越来越受到青睐。其基本思想是通过一系列逐次递减的、与运算基数相关的往复偏摆以逼近最终需要达到的旋转角度。该算法仅利用加法和移位两种运算通过迭代方式进行矢量旋转, CORDIC算法由于只采用加法和移位运算,因此很适合在FPGA中实现,它可以用来实现数字下变频中的NCO、混频器和坐标变换等功能。

       实现NCO的另一种方法是采用基于坐标旋转数字式计算机的算法,即CORDIC算法,基本思想是采用逐次逼近的方法实现三角函数的计算。该算法的突出优点是,仅做加减和移位运算,结合流水线,可以实现每一个时钟周期输出一个经过n次迭代的结果。

 通过迭代的方式,可以用如下的式子可以知道其表达式为:

:

 

 

3.部分程序


//?????1?
always @(posedge i_clk or posedge i_reset)
beginif(i_reset)beginx1<=8'b0000_0000;y1<=8'b0000_0000;z1<=8'b0000_0000;end
else beginif(z0[7]==1'b0)beginx1 <= x0 - y0;y1 <= y0 + x0;z1 <= z0 - 8'h20;  //45degendelse beginx1 <= x0 + y0;y1 <= y0 - x0;z1 <= z0 + 8'h20;  //45degendend
end//?????2?
always @(posedge i_clk or posedge i_reset)
beginif(i_reset)beginx2<=8'b0000_0000;y2<=8'b0000_0000;z2<=8'b0000_0000;end
else beginif(z1[7]==1'b0)beginx2 <= x1 - {y1[7],y1[7:1]};y2 <= y1 + {x1[7],x1[7:1]};z2 <= z1 - 8'h12;  //26degendelse beginx2 <= x1 + {y1[7],y1[7:1]};y2 <= y1 - {x1[7],x1[7:1]};z2 <= z1 + 8'h12;  //26degendend
end//?????3?
always @(posedge i_clk or posedge i_reset)
beginif(i_reset)beginx3<=8'b0000_0000;y3<=8'b0000_0000;z3<=8'b0000_0000;end
else beginif(z2[7]==1'b0)beginx3 <= x2 - {{2{y2[7]}},y2[7:2]};y3 <= y2 + {{2{x2[7]}},x2[7:2]};z3 <= z2 - 8'h09;  //14degendelse beginx3 <= x2 + {{2{y2[7]}},y2[7:2]};y3 <= y2 - {{2{x2[7]}},x2[7:2]};z3 <= z2 + 8'h09;  //14degendend            
end//?????4?
always @(posedge i_clk or posedge i_reset)
beginif(i_reset)beginx4<=8'b0000_0000;y4<=8'b0000_0000;z4<=8'b0000_0000;end
else beginif(z3[7]==1'b0)beginx4 <= x3 - {{3{y3[7]}},y3[7:3]};y4 <= y3 + {{3{x3[7]}},x3[7:3]};z4 <= z3 - 8'h04;  //7degendelse beginx4 <= x3 + {{3{y3[7]}},y3[7:3]};y4 <= y3 - {{3{x3[7]}},x3[7:3]};z4 <= z3 + 8'h04;  //7degendend       
end //?????5?
always @(posedge i_clk or posedge i_reset)
beginif(i_reset)beginx5<=8'b0000_0000;y5<=8'b0000_0000;z5<=8'b0000_0000;end
else beginif(z4[7]==1'b0)beginx5 <= x4 - {{4{y4[7]}},y4[7:4]};y5 <= y4 + {{4{x4[7]}},x4[7:4]};z5 <= z4 - 8'h02;  //4degendelse beginx5 <= x4 + {{4{y4[7]}},y4[7:4]};y5 <= y4 - {{4{x4[7]}},x4[7:4]};z5 <= z4 + 8'h02;  //4degendend
end //?????6?
always @(posedge i_clk or posedge i_reset)
beginif(i_reset)beginx6<=8'b0000_0000;y6<=8'b0000_0000;z6<=8'b0000_0000;end
else beginif(z5[7]==1'b0)beginx6 <= x5 - {{5{y5[7]}},y5[7:5]};y6 <= y5 + {{5{x5[7]}},x5[7:5]};z6 <= z5 - 8'h01;  //2degendelse beginx6 <= x5 + {{5{y5[7]}},y5[7:5]};y6 <= y5 - {{5{x5[7]}},x5[7:5]};z6 <= z5 + 8'h01;  //2degendend       
end 

4.部分仿真图预览

  01_115m

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_17836.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

程序员的数学课21 神经网络与深度学习:计算机是如何理解图像、文本和语音的?

在上一讲的最后&#xff0c;我们提到过“浅层模型”和“深层模型”。其实&#xff0c;人工智能的早期并没有“浅层模型”的概念&#xff0c;浅层模型是深度学习出现之后&#xff0c;与之对应而形成的概念。在浅层模型向深层模型转变的过程中&#xff0c;神经网络算法无疑是个催…

Vue2 生命周期

Vue 生命周期 概述在使用 Vue 时,我们需要执行一些 JS 代码。比如我们需要在页面中添加一个定时器来固定间隔更新时间。这时我们可能会想到直接在,Vue 实例外书写 JS 代码。这种方法能完成操作,但是 Vue 并不建议这样写。Vue 建议尽量在 Vue 实例中完成所有的操作。这时我们…

Hadoop3.X安装教程(Ubuntu)

前提:一台纯净的Ubuntu机器(虚拟机安装教程略) ctrl + alt + T 打开bash,全程使用bash指令进行,以hadoop 和 java 8为例 首先换源进入root账户 sudo su -升级软件列表 apt-get update安装vim apt install vim中途询问直接输入Y确认下载hadoop和java 创建/data mkdir /data…

半导体中的缺陷和位错能级

点缺陷&#xff1a; 在一定的温度下&#xff0c;组成晶体的格点原子在平衡位置附近做振动&#xff0c;这些振动就会有强有弱&#xff0c;这样会使得一部分原子可以获得足够的能量&#xff0c;而挣脱周围电子对它的束缚&#xff0c;挤入间隙位置&#xff0c;这样的结果就形成了…

211西北大学,计算机、软件学硕和专硕专业课都变难了!

西北大学位于陕西省西安市&#xff0c;是一所211大学。西北大学计算机学科评估B-&#xff0c;软件工程学科评估B&#xff0c;计算机实力在211大学中处于中上游水平&#xff0c;还算不错。西北大学前段时间公布了23考研的招生目录&#xff0c;我们来看一下&#xff1a;西北大学2…

Unity的UI框架

UI框架 UI框架的含义 含义&#xff1a;UI框架用于管理场景中所有的面板&#xff0c;负责控制面板之间的跳转 UI框架的意义 1、随着游戏系统的复杂化&#xff0c;UI控件越来越多&#xff0c;各个UI之间的直接通讯&#xff0c;已经UI与GameObject之间的关系会越来越复杂 2、代…

盘点一个Python自动化办公的实战案例

点击上方“Python共享之家”&#xff0c;进行关注回复“资源”即可获赠Python学习资料今日鸡汤岭猿同旦暮&#xff0c;江柳共风烟。大家好&#xff0c;我是皮皮。 一、前言前几天在Python钻石交流群【Hxy任我肥】问了一个Python自动化办公的问题&#xff0c;提问截图如下&am…

基于Vue+SSM+SpringCloudAlibaba的英雄管理系统

需求 前端技术&#xff1a;element-ui、vue后端技术&#xff1a;spring boot、spring cloud、mybatis plus、jwt项目要求&#xff1a; 前端&#xff1a;exam-war-fore-1217后端&#xff1a;exam-war-parent-1217端口要求&#xff1a; 注册中心&#xff1a;10086、10087 &#x…

福特、微软、槟榔-《软件方法》自测题解析019

DDD领域驱动设计批评文集>> 《软件方法》强化自测题集>> 《软件方法》各章合集>> 《软件方法》第2章自测题2 1 [单选题] 1999年11月的《财富》杂志题为“20世纪企业家”的文章&#xff0c;评选出了最能代表20世纪企业家精神的企业家─福特汽车的Henry F…

云原生|kubernetes|ingress-nginx插件部署以及简单的应用

前言&#xff1a; ingress直译&#xff1a;进口&#xff1b;入口&#xff1b;初切&#xff1b;进入&#xff1b;进入资格&#xff1b;进入权。在kubernetes中&#xff0c;它指的是网络入口。 ingress概述&#xff1a; 通俗来讲&#xff0c;Ingress和之前提到的Service、Depl…

Redis面试汇总笔记

在两个月前的学习中&#xff0c;我看过一个redis相关的讲解视频&#xff0c;是一个叫诸葛的老师&#xff0c;其中分为几层进行讲述&#xff0c;分别是数据类型、分布式锁、redis常见问题等。当时有记录一些内容&#xff0c;下面将按照顺序进行分享。 &#xff08;一&#xff0…

Cherno的Cpp教程笔记002:C++是如何工作的

include需要找到一个叫iostream的文件&#xff0c;然后将内容拷贝到当前的文件中来 main函数是程序的入口&#xff0c;main中调用了std::cout , main函数不一定需要返回值&#xff0c;当没有返回值时默认返回0 #include是预处理语句&#xff0c;编译器优先处理这些语句&#…

橘子学Mybatis03之代理模式

一、什么是代理模式&#xff0c;为啥需要代理模式 1、问题 在JAVAEE的MVC分层开发中&#xff0c;哪个层级对我们来说最重要&#xff1f; DAO ------> Service --------> ControllerJAVAEE分层开发中&#xff0c;最为重要的是Service层。这个也可以理解&#xff0c;因为S…

Lesson 8 The best and the worst 最好的和最差的

1.原文 2. 参考译文 3. New words and expressions ★competition n. 比赛&#xff0c;竞赛(暗地里的竞争) race n. 比赛&#xff0c;竞赛 car racematch n. 比赛 football matchcontest n. 比赛(更广泛)baby contest 宝宝大赛&#xff1b;beauty contest 选美game : 游戏, 运…

Spring自学日志01-IOC(控制翻转)

目录一、IOC的基本概念和底层原理1.1、什么是IOC?1.1.1、Spring IOC容器1.2、IOC底层原理1.2.1、IOC容器1.2.2、IOC容器装配Bean的方式1.2.3、IOC容器装配Bean的操作1.2.3.1、基于XML1.2.3.2、基于注解1.2.4、IOC容器装配Bean的作用域 一、IOC的基本概念和底层原理 1.1、什么是…

MySQL:索引特性

索引 0. 预备知识 索引是一个“物美价廉”的特性&#xff0c;用来提高数据库的性能。不需要改程序、调SQL、只需要正确的创建索引&#xff0c;查询速度就能提高成百上千倍&#xff0c;但查询速度的提升也带来了插入、更新、删除速度的下降。 0.1 认识磁盘 MySQL对数据进行增…

大数据讲课笔记2.1 初探大数据

文章目录零、学习目标一、导入新课二、新课讲解&#xff08;一&#xff09;什么是大数据&#xff08;二&#xff09;大数据的特征1、数据体量大2、数据类型多3、处理速度快4、价值密度低&#xff08;三&#xff09;研究大数据的意义&#xff08;四&#xff09;拥抱大数据时代1、…

【数据结构初阶】第四话 —— 动态栈的基本操作

文章目录什么是栈栈的结构1. 初始化栈2. 入栈3. 出栈4. 获取栈顶元素5. 获取栈中有效元素个数6. 检测栈是否为空7. 销毁栈8. 总结接口函数贴图什么是栈 假如有⼀个⼜细⼜⻓的圆筒&#xff0c;圆筒⼀端封闭&#xff0c;另⼀端开⼝。往圆筒⾥放⼊乒乓球&#xff0c;先放⼊的靠近…

U盘插入自动读写/U盘插入自动复制/pythhttps://www.cnblogs.com/wawawa888/p/16749476.htmlon检测U盘的插入,以及进行自动复制文件并写入文件

U盘自动读写的小玩意 共有四种方法(我知道的方法,全是转载。转载也很不易,可望给个硬币) 方法一(vbs方法 全自动,转载自bilibili 点我跳转)文件下载链接(点我下载) 方法二(cmd方法 需手动,转载自bilibili 点我跳转)文件下载链接(点我下载) 方法三(python方法 全…

在DataFrame中根据索引值进行排序:sort_index()函数

【小白从小学Python、C、Java】 【Python-计算机等级考试二级】 【Python-数据分析】 在DataFrame中根据索引值进行排序&#xff1a; sort_index()函数 [太阳]选择题 对以下python代码表述有误的选项是&#xff1f; import numpy as np import pandas as pd data np.random.…