【【Verilog典型电路设计之CORDIC算法的Verilog HDL 实现】】

news2025/1/17 0:20:09

Verilog典型电路设计之CORDIC算法的Verilog HDL 实现

典型电路设计之CORDIC算法的Verilog HDL 实现

坐标旋转数字计算机CORDIC(Coordinate Rotation Digital Computer)算法,通过移位和加减运算,能递归计算常用函数值,如sin,cos,sinh,cosh等函数,最早用于导航系统,使得矢量的旋转和定向运算不需要做查三角函数表、乘法、开方及反三角函数等复杂运算。J.Walther在1971年用它研究了一种能计算出多种超越函数的统一算法。引入参数m将CORDIC实现的三种迭代模式:三角运算、双曲运算和线性运算统一于同一个表达式下。形成目前所用的CORDIC算法的最基本的数学基础。该算法的基本思想是通过一系列固定的、与运算基数相关的角度不断偏摆以逼近所需的旋转角度。可用下列等式进行描述。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
迭代结构
简单地将CORDIC算法的公式复制到硬件描述上,就可以实现迭代的cORDIC算法,其结构如下图所示。
在这里插入图片描述
流水线结构
流水线结构虽然比迭代结构占用的资源多,但是它大大的提高了数据的吞吐率。流水线结构是将迭代结构展开,因此n个处理单元中的每一个都可以同时并行处理一个相同的迭代运算。其结构如下图所示。
在这里插入图片描述
例:用Verilog HDL设计基于7级流水结构求正余弦的CORDIC算法在CORDIC算法中有一个初始的X、Y值。输入变量Z是角度变量,首先将X、Y输入到固定移位次数的移位寄存器进行移
位,然后将结果输入到加/减就完成了一次迭代,符庥次进行下去,当达到果加减操作,这样就完成了一次迭代,将此次迭代运算进行下去,当达到所需要的迭代次数(本例为((次) 的的恢付石联的加/减法器阵列。。所以整个CORDIC处理器就是一个内部互联的加/减法器阵列。
在这里插入图片描述

module sincos(clk,rst_n,ena,phase_in,sin_out,cos_out,eps);
parameter DATA_WIDTH=8;
parameter PIPELINE=8;
input    clk;
input    rst_n;
input     ena;
input       [DATA_WIDTH-1:0] phase_in;
output     [DATA_WIDTH-1:0] sin_out;
output     [DATA_WIDTH-1:0] cos_out;
output     [DATA_WIDTH-1:0] eps;
reg  [DATA_WIDTH-1:0] sin_out;
reg  [DATA_WIDTH-1:0] cos_out;
reg  [DATA_WIDTH-1:0] eps;
reg  [DATA_WIDTH-1:0] phase_in_reg;
reg   [DATA_WIDTH-1:0] x0,y0,z0;
wire  [DATA_WIDTH-1:0]x1,y1,z1;
wire  [DATA_WIDTH-1:0]x2,y2,z2;
wire  [DATA_WIDTH-1:0]x3,y3,z3;
wire  [DATA_WIDTH-1:0]x4,y4,z4;
wire  [DATA_WIDTH-1:0]x5,y5,z5;
wire  [DATA_WIDTH-1:0]x6,y6,z6;
wire  [DATA_WIDTH-1:0]x7,y7,z7;
reg    [1:0] quadrant[PIPELINE:0];
integer i;
always@(posedge clk or negedge rst_n)
begin
if(!rst_n)
phase_in_reg<=8'b0000_0000;
else
if(ena)
begin
case(phase_in[7:6])
2'b00:phase_in_reg<=phase_in;
2'b01:phase_in_reg<=phase_in-8'h40; 2'b10:phase_in_reg<=phase_in-8'h80;
2'b11:phase_in_reg<=phase_in-8'hc0;
default:;
endcase 
end
end
always@(posedge clk or negedge rst_n)
begin
if(!rst_n)
begin
x0<=8'b0000_0000;
y0<=8'b0000_0000;
z0<=8'b0000_0000;
end
else
if(ena)
begin
x0<=8'h4D;
y0<=8'h00;
z0<=phase_in_reg;
end
end
lteration #(8,0,8'h20)u1(.clk(clk),.rst_n(rst_n),.ena(ena),.xO(xO),.y0(y0),.z0(zO),.x1(x1),.y1(y1),.z1(z1));
lteration #(8,1,8'h12)u2(.clk(clk),.rst_n(rst_n),.ena(ena),
.xO(×1),.yo(y1),.z0(z1),.x1(×2),.y1(y2),.z1(z2));
lteration #(8,2,8'h09)u3(.clk(clk),.rst_n(rst_n),.ena(ena),
.xO(x2),.y0(y2),.z0(z2),.x1(×3),.y1(y3),.z1(z3));
lteration#(8,3,8'h04)u4(.clk(clk),.rst_n(rst_n),.ena(ena),
.xO(x3)..yo(y3),.z0(z3),.x1(x4),.y1(y4),.Z1(z4));
lteration #(8,4,8'h02)u5(.clk(clk),..rst_n(rst_n),.ena(ena),
.x0(x4),.yo(y4),.z0(z4),.x1(×5),.y1(y5),.Z1(z5));
lteration #(8,5,8'ho1)u6(.clk(clk),.rst_n(rst_n),.ena(ena),
.x0(x5),.y0(y5),.z0(z5),.x1(x6),.y1(y6),.z1(z6));
lteration #(8,6,8'ho0)u7(.clk(clk),.rst_n(rst_n),.ena(ena),
.x0(×6),.yo(y6),.z0(z6),.x1(×7),.y1(y7),.z1(z7));
always@(posedge clk or negedge rst_n)begin
if(!rst_n)
for(i=0;i<=PIPELINE;i=i+1)
quadrant[i]<=2'b00;
else
if(ena)
begin
for(i=0;i<=PIPELINE;i=i+1)
quadrant[i+1]<=quadrant[i];
quadrant[0]<=phase_in[7:6];
end
always@(posedge clk or negedge rst_n)
begin
if(!rst_n)
begin
sin_out<=8'b0000_0000;
cos_out<=8'b0000_0000;
eps<=8'b0000_0000;
end
else
if(ena)
case(quadrant[7])
2'b00:begin
sin_out<=y6;
cos_out<=x6;
eps<=z6;
end
2'b01:begin
sin_out<=x6;
cos_out<=~(y6)+1'b1;
eps<=z6;
end
2'b10:begin
sin_out<=~(y6)+1'b1;
cos_out<=~(x6)+1'b1;
eps<=z6;
end
2'b11:begin
sin_out<=~(x6)+1'b1;
cos_out<=y6;
eps<=z6;
end
endcase
end
endmodule
//迭代模块:
module lteration(clk,rst_n,ena,x0,y0,z0,x1,y1,z1);
parameter DATA_WIDTH=8;
parameter shift=0;
parameter constant=8'h20;
input clk,rst_n,ena;
input [DATA_WIDTH-1:0]x0,y0,z0;
output[DATA_WIDTH-1:0]x1,y1,z1;
reg [DATA_WIDTH-1:0]x1,y1,z1;
always@(posedge clk or negedge rst_n)
begin
if(!rst_n)
begin
x1<=8'b0000_0000;
y1<=8'b0000_0000;
z1<=8'b0000_0000;
end
else
if(ena)
if(z0[7]==1'b0)
begin
x1<=x0-{{shift{yO[DATA_WIDTH-1]1},y0[DATA_WIDTH-1:shift]};
y1<=y0+{[shift{xO[DATA_WIDTH-1]),x0[DATA_WiDTH-1:shift]};
z1<=z0-constant;
end
else
begin
x1<=x0+{fshift{yO[DATA_WIDTH-1],y0[DATA_WIDTH-1:shift]};
y1<=y0-f{shift{xO[DATA_WIDTH-1])}.x0[DATA_WIDTH-1:shift]};
z1<=z0+constant;
end
end
endmodule

下面是testbench

module sincos_tb;
reg clk,rst_n,ena;
reg [7:0]phase_in;
wire [7:0]sin_out,cos_out,eps;
sincos U1(.clk(clk),.rst_n(rst_n),.ena(ena),.phase_in(phase_in),.sin_out(sin_out),.cos_out(cos_out),.eps(eps));
initial
begin
clk=0; 
rst_n=0;
 ena=1;
phase_in=8'b0000_0000;
#3 rst_n=1;
end
always #5 clk=~clk;
always #10
phase_in=phase_in+1;
endmodule

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Qt 阴影边框

阴影边框很常见&#xff0c;诸如360以及其他很多软件都有类似效果&#xff0c;了解CSS3的同学们应该都知道box-shadow&#xff0c;它就是来设定阴影效果的&#xff0c;那么Qt呢&#xff1f;看过一些资料&#xff0c;说是QSS是基于CSS2的&#xff0c;既然如此&#xff0c;box-sh…

【附安装包】hyperMILL2018安装教程

软件下载 软件&#xff1a;hyperMILL版本&#xff1a;2018语言&#xff1a;简体中文大小&#xff1a;4.54G安装环境&#xff1a;Win11/Win10/Win8/Win7硬件要求&#xff1a;CPU2.0GHz 内存4G(或更高&#xff09;下载通道①百度网盘丨64位下载链接&#xff1a;https://pan.baid…

时序预测 | MATLAB实现PSO-KELM粒子群算法优化核极限学习机时间序列预测(含KELM、ELM等对比)

时序预测 | MATLAB实现PSO-KELM粒子群算法优化核极限学习机时间序列预测&#xff08;含KELM、ELM等对比&#xff09; 目录 时序预测 | MATLAB实现PSO-KELM粒子群算法优化核极限学习机时间序列预测&#xff08;含KELM、ELM等对比&#xff09;预测效果基本介绍模型介绍程序设计参…

笔试强训选择题错误总结

图文版md文件已上传 1..已知如下类定义&#xff1a;class Base { public Base (){ //... } public Base ( int m ){ //... } public void fun( int n ){ //... } } public class Child extends Base{ // member methods } 如下哪句可以正确地加入子类中&#xff1f; A privat…

AI驱动下的智能制造:工业自动化的新纪元

随着人工智能&#xff08;AI&#xff09;技术的持续进步&#xff0c;其在工业自动化领域的影响日益显著。作为现代科技的代表&#xff0c;AI不仅为各行业带来了前所未有的商机和技术思路&#xff0c;更在工业自动化领域中引发了一场深刻的变革。本文将深入探讨AI对智能制造的影…

IDEA创建Servlet(Web)项目完整教程-2023,并配置tomcat的端口号,以及默认打开的浏览器

文章目录 1. 文章引言2. 创建servlet项目3. 总结 1. 文章引言 今天&#xff0c;粉丝问我一个问题&#xff0c;如下图所示&#xff1a; 他是jsp servlet项目&#xff0c;但启动后&#xff0c;无论如何都无法访问&#xff0c;于是向我咨询如何解决该问题。 我解决了一系列的问…

AMBA总线协议(10)——APB

一、前言 在之前的文章中&#xff0c;我们详细地介绍了AHB的相关内容&#xff0c;在这篇文章里我们会开始APB总线的学习&#xff0c;由于APB总线协议的内容真的非常少&#xff08;手册才34页&#xff0c;比起那些动辄成百上千页的手册来说真的太友好啦&#xff09;&#xff0c;…

【Terraform学习】使用 Terraform 创建应用程序负载均衡器(Terraform-AWS最佳实战学习)

使用 Terraform 创建应用程序负载均衡器 实验步骤 前提条件 安装 Terraform&#xff1a; 地址 下载仓库代码模版 本实验代码位于 task_elb 文件夹中。 变量文件 variables.tf 在上面的代码中&#xff0c;您将声明&#xff0c;aws_access_key&#xff0c;aws_secret_key…

Visio

Visio 简介Office Tool Plus教程 简介 Visio&#xff08;Microsoft Visio&#xff09;是微软公司开发的一款流程图和图表绘制软件。它主要用于创建各种类型的图表、流程图、组织结构图、平面图、网络图等&#xff0c;以帮助用户可视化和呈现复杂的信息、流程和关系。 Office …

智信数科SMS短信平台安装教程

智信SMS客户端下载 使用智信SMS短信平台前&#xff0c;需要前往公司官网或者百度网盘共享地址下载最新版本的短信平台。 下载地址一&#xff1a;公司官网 下载地址二&#xff1a;百度网盘共享&#xff08;推荐&#xff09; 智信SMS客户端安装 安装前&#xff0c;确保您已经正…

抖音seo短视频矩阵系统源码开发源代码分享--开源-可二开

适用于抖音短视频seo矩阵系统&#xff0c;抖音矩阵系统源码&#xff0c;短视频seo矩阵系统源码&#xff0c;短视频矩阵源码开发&#xff0c;支持二次开发&#xff0c;开源定制&#xff0c;招商加盟SaaS研发等。 功能开发设计 1. AI视频批量剪辑&#xff08;文字转语音&#x…

Node基础--Node中的文件系统

我们学习了npm,这是Node中使用很频繁且重要的内容,下面一起来看看Node中的文件系统。 1.buffer缓冲区 (1).概述 从结构上看Buffer非常像一个数组,我们知道在javaScript中,数组是一个比较强大的内容。但是这里也存在着一个比较大的问题,如果你需要存在一张图,这一个时候需…

【音视频】 视频的播放和暂停,当播放到末尾时触发 ended 事件,循环播放,播放速度

video 也可以 播放 MP3 音频&#xff0c;当不想让 视频显示出来的话&#xff0c;可以 给 video 设置宽和高 1rpx &#xff0c;不可以隐藏 <template><view class"form2box"><u-navbar leftClick"leftClick"><view slot"left&q…

抖音短视频seo矩阵系统源码开发代码分享--开源

前言&#xff1a; 适用于抖音seo源码&#xff0c;抖音矩阵源码&#xff0c;抖音短视频seo源码&#xff0c;抖音短视频矩阵源码开发与实践等。 产品开发代码展示&#xff1a; <?php /** * Created by PhpStorm. * User: ikinvin * Date: 2021/2/24 * Time: 11:32 AM …

Ingress 响应超时504故障排除

Ingress 响应超时504故障排除 1. 故障现象: 在阿里云的ACK新上了一套系统.该系统有个将查询结果导出为excle并下载的功能,当第一次下载时等待1分钟后就跳出504,点击返回后再次下载可以正常下载. 2. 分析判断 根据504的页面应该是和Ingress配置相关和超时时间长短有关 3. …

【1448. 统计二叉树中好节点的数目】

来源&#xff1a;力扣&#xff08;LeetCode&#xff09; 描述&#xff1a; 给你一棵根为 root 的二叉树&#xff0c;请你返回二叉树中好节点的数目。 「好节点」X 定义为&#xff1a;从根到该节点 X 所经过的节点中&#xff0c;没有任何节点的值大于 X 的值。 示例 1&#…

vue实现富文本

效果图展示 一、安装依赖 npm install vue-quill-editor --save二、具体使用 html <template><!-- 富文本 --><quill-editorref"myQuillEditor"v-model"content":options"editorOption"blur"onEditorBlur($event)"…

力扣:73. 矩阵置零(Python3)

题目&#xff1a; 给定一个 m x n 的矩阵&#xff0c;如果一个元素为 0 &#xff0c;则将其所在行和列的所有元素都设为 0 。请使用 原地 算法。 来源&#xff1a;力扣&#xff08;LeetCode&#xff09; 链接&#xff1a;力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚…

net start mysql 提示:服务名无效 请键入NET HELPING 2185

解决办法&#xff1a; 使用windowr打开运行&#xff0c;输入services.msc, 可以看到名称是mysql80&#xff0c;而且服务已经启动

Vite知识体系

一、浅谈构建工具 1、前端工程的痛点 &#xff08;1&#xff09;前端项目的组成部分&#xff08;核心要素--文件资源&#xff09; ①逻辑代码&#xff1a;js、ts、jsx ②样式代码&#xff1a;css、scss、less ③静态资源&#xff1a;jpg、png、webp &#xff08;2&#xff0…