【Cordic,NCO】基于Cordic算法的NCO的FPGA设计实现
1.软件版本
quartusii12.1
2.本算法理论知识
ROM资源,作为产生离散正弦信号的另一种有效途径,CORDIC(坐标旋转数值计算)算法已越来越受到青睐。其基本思想是通过一系列逐次递减的、与运算基数相关的往复偏摆以逼近最终需要达到的旋转角度。该算法仅利用加法和移位两种运算通过迭代方式进行矢量旋转, CORDIC算法由于只采用加法和移位运算,因此很适合在FPGA中实现,它可以用来实现数字下变频中的NCO、混频器和坐标变换等功能。
实现NCO的另一种方法是采用基于坐标旋转数字式计算机的算法,即CORDIC算法,基本思想是采用逐次逼近的方法实现三角函数的计算。该算法的突出优点是,仅做加减和移位运算,结合流水线,可以实现每一个时钟周期输出一个经过n次迭代的结果。
3.核心代码
module cordic_top(i_clk,i_reset,i_phase_in,o_sin_out,o_cos_out);input i_clk; //?????
input i_reset; //???????
input [7:0]i_phase_in; //??????????
output[7:0]o_sin_out; //??
output[7:0]o_cos_out; //??reg[7:0]reg_phase = 8'd0;reg[7:0]o_sin_out = 8'd0;
reg[7:0]o_cos_out = 8'd0;reg[7:0]x0 = 8'd0;
reg[7:0]y0 = 8'd0;
reg[7:0]z0 = 8'd0;reg[7:0]x1 = 8'd0;
reg[7:0]y1 = 8'd0;
reg[7:0]z1 = 8'd0;reg[7:0]x2 = 8'd0;
reg[7:0]y2 = 8'd0;
reg[7:0]z2 = 8'd0;reg[7:0]x3 = 8'd0;
reg[7:0]y3 = 8'd0;
reg[7:0]z3 = 8'd0;reg[7:0]x4 = 8'd0;
reg[7:0]y4 = 8'd0;
reg[7:0]z4 = 8'd0;reg[7:0]x5 = 8'd0;
reg[7:0]y5 = 8'd0;
reg[7:0]z5 = 8'd0;reg[7:0]x6 = 8'd0;
reg[7:0]y6 = 8'd0;
reg[7:0]z6 = 8'd0;reg[7:0]x7 = 8'd0;
reg[7:0]y7 = 8'd0;
reg[7:0]z7 = 8'd0;integer i;
reg[1:0]quadrant[8:0];always @(posedge i_clk or posedge i_reset)
beginif(i_reset)beginreg_phase <= 8'h00;end
else begincase(i_phase_in[7:8-2])2'b00: reg_phase <= i_phase_in;2'b01: reg_phase <= i_phase_in - 8'h40; //-pi/22'b10: reg_phase <= i_phase_in - 8'h80; //-pi2'b11: reg_phase <= i_phase_in - 8'hc0; //-3pi/2default:reg_phase <= 8'h00;endcaseend
endalways @(posedge i_clk or posedge i_reset)
beginif(i_reset)beginx0 <= 8'h00;y0 <= 8'h00;z0 <= 8'h00;end
else beginx0 <= 8'h4d;y0 <= 8'h00; z0 <= reg_phase; end
end//?????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 always @(posedge i_clk or posedge i_reset)
beginif(i_reset)beginfor(i=0; i<=8; i=i+1)beginquadrant[i]<=2'b00;end end
else beginfor(i=0; i<8; i=i+1)beginquadrant[i+1] <= quadrant[i];quadrant[0] <= i_phase_in[7:6];end end
endalways @(posedge i_clk or posedge i_reset)
beginif(i_reset)begino_sin_out <= 8'b0000_0000;o_cos_out <= 8'b0000_0000;end
else begincase(quadrant[7])2'b00:begino_sin_out <= y6; o_cos_out <= x6;end2'b01:begino_sin_out <= x6; o_cos_out <= ~(y6) + 1'b1;end2'b10:begino_sin_out <= ~(y6) + 1'b1; o_cos_out <= ~(x6) + 1'b1;end2'b11:begino_sin_out <= ~(x6) + 1'b1; o_cos_out <= y6;enddefault:begino_sin_out <= 8'b0000_0000;o_cos_out <= 8'b0000_0000; end endcaseend
endendmodule
4.操作步骤与仿真结论
其RTL级的电路图如下所示:
从上面的仿真介绍可知,基于查找表的NCO,这种方式的固有特点决定了不仅需要大量的FPGA资源,而且混频器在实现过程中需要占用一定的乘法器资源,这对乘法器资源有限的FPGA而言很不利。
基于CORDIC算法的NCO,通过一系列固定的与运算基数相关的角度不断偏摆来逼近所需的旋转角度,其硬件结构简单,易于并行化处理。
5.参考文献
[1]朱涛玉,余志勇. 高效实现FPGA数字下变频的多类滤波器分组级联技术[J]. 现代电子技术, 2008, 31(23):4.
A01-115
6.完整源码获得方式
方式1:微信或者QQ联系博主
方式2:订阅MATLAB/FPGA教程,免费获得教程案例以及任意2份完整源码
【Cordic,NCO】基于Cordic算法的NCO的FPGA设计实现相关推荐
- sobel算子原理_「学术论文」基于Sobel算法图像边缘检测的FPGA实现
摘要: 针对嵌入式软件无法满足数字图像实时处理速度问题,提出用硬件加速器的思想,通过FPGA实现Sobel边缘检测算法.通过乒乓操作.并行处理数据和流水线设计,大大提高算法的处理速度.采用模块的硬件设 ...
- 【Cordic】基于Cordic算法的NCO的设计实现
1.软件版本 ISE14.7 2.本算法理论知识 ROM资源,作为产生离散正弦信号的另一种有效途径,CORDIC(坐标旋转数值计算)算法已越来越受到青睐.其基本思想是通过一系列逐次递减的.与运算基数相 ...
- matlab adaptfilt.rls,基于RLS算法的多麦克风降噪
<信息处理课群综合训练与设计> 课程设计任务书 学生姓名: 专业班级: 指导教师: 工作单位: 题 目: 基于RLS算法的多麦克风降噪 设计任务: 给定主麦克风录制的受噪声污染的语音信号和 ...
- CORDIC算法的matlab和FPGA实现
目录 1.算法原理 2.matlab实现 2.1 在已知坐标,用cordic算法计算相角 2.2 在已知相角,用cordic算法计算正余弦 3.FPGA实现 3.1 简单的状态机结构 3.1.1 ve ...
- 基于LightGBM算法实现数据挖掘!
↑↑↑关注后"星标"Datawhale 每日干货 & 每月组队学习,不错过 Datawhale干货 作者:黄雨龙,中国科学技术大学 对于回归问题,Datawhale已经梳理 ...
- R语言基于Bagging算法(融合多个决策树)构建集成学习Bagging分类模型、并评估模型在测试集和训练集上的分类效果(accuray、F1、偏差Deviance):Bagging算法与随机森林对比
R语言基于Bagging算法(融合多个决策树)构建集成学习Bagging分类模型.并评估模型在测试集和训练集上的分类效果(accuray.F1.偏差Deviance):Bagging算法与随机森林对比 ...
- R语言基于机器学习算法进行特征筛选(Feature Selection)
R语言基于机器学习算法进行特征筛选(Feature Selection) 对一个学习任务来说,给定属性集,有些属性很有用,另一些则可能没什么用.这里的属性即称为"特征"(featu ...
- #研发解决方案#基于Apriori算法的Nginx+Lua+ELK异常流量拦截方案
郑昀 基于杨海波的设计文档 创建于2015/8/13 最后更新于2015/8/25 关键词:异常流量.rate limiting.Nginx.Apriori.频繁项集.先验算法.Lua.ELK 本文档 ...
- vins中imu融合_基于非线性优化算法—当视觉SLAM遇到VINS会碰撞出怎样的火花?
今天来给大家分享一个视觉SLAM中比较综合且复杂的系统-VINS.VINS旨在通过融合两个传感器测量数据获得移动机器人的位姿和特征点在空间中的位置,在现代控制理论学科中属于最优估计问题.在移动智能机器 ...
最新文章
- SVM+二分类+多分类
- skill alpha protocol
- c语言平年表示方法,C语言平年闰年问题
- 如何利用express新建项目(上)
- bat窗口大小设置_8-Flink中的窗口
- 强化管理远程分支机构利器之coreRODC[为企业部署Windows Server 2008系列九]
- LeetCode 刷题隔天忘怎么办?
- 50. Element removeChild() 方法
- C# 仿windows资源管理器
- 如何使用使用PS批量制作字幕
- xbox360fsd更新游戏封面_xbox360自制系统fsd更新封面教程
- c语言绝对值函数作用,C语言实现abs和fabs绝对值
- Java判断图片文件格式,不是根据文件后缀判断
- 发射功率dBm 换算表
- linux操作系统课程内容,《linux操作系统及应用》课程标准
- piblic class 和class的区别
- 计算机系统维护工作内容
- OpenCV——PS 滤镜, 浮雕效果
- Tuxera NTFS2023免费版Mac电脑系统读写软件
- html5项目心得体会,HTML5开发心得。