【【迭代七次的CORDIC算法-Verilog实现】】

迭代七次的CORDIC算法-Verilog实现求解正弦余弦函数

COEDIC.v

module CORDIC #(parameter         DATA_WIDTH    =      4'd8  ,     // we set data widthparameter         PIPELINE      =      4'd8)(input                              clk       ,input                              rst_n     ,input       [DATA_WIDTH - 1 : 0]   phase     ,input                              ena       ,output  reg [DATA_WIDTH - 1 : 0]   sin_out   ,output  reg [DATA_WIDTH - 1 : 0]   cos_out);//  ------------------------------------------------  \\//         next is define and parameter               \\//  -------------------------------------------------\\
reg      [DATA_WIDTH - 1 : 0]    phase_reg     ;reg      [DATA_WIDTH - 1 : 0]    X0            ;reg      [DATA_WIDTH - 1 : 0]    Y0            ;reg      [DATA_WIDTH - 1 : 0]    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)beginif(rst_n == 0)for(i = 0 ; i <= PIPELINE ; i=i+1)quadrant[i] <= 0 ;elseif(ena == 1)beginfor(i = 0 ; i <= PIPELINE ; i=i+1)quadrant[i+1] <= quadrant[i] ;quadrant[0] <= phase[DATA_WIDTH - 1 : DATA_WIDTH - 2] ;endend//  we set a new phase to Unify the phase in the first quadrant//  we set 8'h      0010 0000 =>  45度     and  1000 0000 => 180度always@(posedge clk or negedge rst_n)beginif(rst_n == 0)beginphase_reg <= 0 ;endelse if(ena == 1)begincase(phase[DATA_WIDTH -1 : DATA_WIDTH -2])2'b00 :phase_reg <= phase          ;2'b01 :phase_reg <= phase - 8'h40  ; // subtract 902'b10 :phase_reg <= phase - 8'h80  ; // subtract 1802'b11 :phase_reg <= phase - 8'hC0  ; // subtract 270default :;endcaseendend//  start to calculate// we should set x0= 0.607252935    y0= 0  z0always@(posedge clk or negedge rst_n )beginif( rst_n == 0)beginX0 <= 0     ;Y0 <= 0     ;Z0 <= 0     ;endelse if(ena == 1 )beginX0 <= 8'h4D      ;Y0 <= 0          ;Z0 <= phase_reg  ;endend// next is iterationINTERATION#(.DATA_WIDTH ( 4'd8 ),.shift      ( 4'd0 ),.ANGLE      ( 8'h20 ))u_INTERATION0(.clk        ( clk        ),.rst_n      ( rst_n      ),.ena        ( ena        ),.X0         ( X0         ),.Y0         ( Y0         ),.Z0         ( Z0         ),.X1         ( X1         ),.Y1         ( Y1         ),.Z1         ( Z1         ));INTERATION#(.DATA_WIDTH ( 4'd8 ),.shift      ( 4'd1 ),.ANGLE      ( 8'h12 ))u_INTERATION1(.clk        ( clk        ),.rst_n      ( rst_n      ),.ena        ( ena        ),.X0         ( X1         ),.Y0         ( Y1         ),.Z0         ( Z1         ),.X1         ( X2         ),.Y1         ( Y2         ),.Z1         ( Z2         ));INTERATION#(.DATA_WIDTH ( 4'd8 ),.shift      ( 4'd2 ),.ANGLE      ( 8'h09 ))u_INTERATION2(.clk        ( clk        ),.rst_n      ( rst_n      ),.ena        ( ena        ),.X0         ( X2         ),.Y0         ( Y2         ),.Z0         ( Z2         ),.X1         ( X3         ),.Y1         ( Y3         ),.Z1         ( Z3         ));INTERATION#(.DATA_WIDTH ( 4'd8 ),.shift      ( 4'd3 ),.ANGLE      ( 8'h04 ))u_INTERATION3(.clk        ( clk        ),.rst_n      ( rst_n      ),.ena        ( ena        ),.X0         ( X3         ),.Y0         ( Y3         ),.Z0         ( Z3         ),.X1         ( X4         ),.Y1         ( Y4         ),.Z1         ( Z4         ));INTERATION#(.DATA_WIDTH ( 4'd8 ),.shift      ( 4'd4 ),.ANGLE      ( 8'h02 ))u_INTERATION4(.clk        ( clk        ),.rst_n      ( rst_n      ),.ena        ( ena        ),.X0         ( X4         ),.Y0         ( Y4         ),.Z0         ( Z4         ),.X1         ( X5         ),.Y1         ( Y5         ),.Z1         ( Z5         ));INTERATION#(.DATA_WIDTH ( 4'd8 ),.shift      ( 4'd5 ),.ANGLE      ( 8'h01 ))u_INTERATION5(.clk        ( clk        ),.rst_n      ( rst_n      ),.ena        ( ena        ),.X0         ( X5         ),.Y0         ( Y5         ),.Z0         ( Z5         ),.X1         ( X6         ),.Y1         ( Y6         ),.Z1         ( Z6         ));INTERATION#(.DATA_WIDTH ( 4'd8 ),.shift      ( 4'd6 ),.ANGLE      ( 8'h00 ))u_INTERATION6(.clk        ( clk        ),.rst_n      ( rst_n      ),.ena        ( ena        ),.X0         ( X6         ),.Y0         ( Y6         ),.Z0         ( Z6         ),.X1         ( X7         ),.Y1         ( Y7         ),.Z1         ( Z7         ));//   The results of different phases are also different//   phase[DATA_WIDTH -1 : DATA_WIDTH -2]//  00 first  quadrant//  01 second quadrant//  10 third  quadrant//  11 Fourth Quadrantalways@(posedge clk or negedge rst_n)beginif(rst_n == 0)begincos_out <= 0 ;sin_out <= 0 ;endelse if( ena == 1)begincase(quadrant[7])2'b00 :begincos_out <= X6 ;sin_out <= Y6 ;end2'b01 :begincos_out <= ~(Y6) + 1 ;sin_out <= X6        ;end2'b10 :begincos_out <= ~(X6) + 1 ;sin_out <= ~(Y6) + 1 ;end2'b11 :begincos_out <= Y6        ;sin_out <= ~(X6) + 1 ;enddefault:;endcaseendend
endmodule

Interation.v

module INTERATION #(parameter   DATA_WIDTH       =    4'd8      ,parameter   shift            =    4'd0      ,parameter   ANGLE            =    8'h20)(input                                  clk     ,input                                  rst_n   ,input                                  ena     ,input        [DATA_WIDTH - 1 : 0]      X0      ,input        [DATA_WIDTH - 1 : 0]      Y0      ,input        [DATA_WIDTH - 1 : 0]      Z0      ,output  reg  [DATA_WIDTH - 1 : 0]      X1      ,output  reg  [DATA_WIDTH - 1 : 0]      Y1      ,output  reg  [DATA_WIDTH - 1 : 0]      Z1);always@(posedge clk or negedge rst_n)beginif( rst_n == 0)beginX1 <= 0 ;Y1 <= 0 ;Z1 <= 0 ;endelse if( ena == 1)beginif(Z0[DATA_WIDTH - 1] == 0 )beginX1 <= X0 - {{shift{ Y0[DATA_WIDTH - 1] }} ,Y0[DATA_WIDTH - 1 : shift] } ;Y1 <= Y0 + {{shift{ X0[DATA_WIDTH - 1] }} ,X0[DATA_WIDTH - 1 : shift] } ;Z1 <= Z0 - ANGLE                                                    ;endelse if(Z0[DATA_WIDTH - 1] == 1 )beginX1 <= X0 + {{shift{ Y0[DATA_WIDTH - 1 ] }} ,Y0[DATA_WIDTH - 1 : shift] } ;Y1 <= Y0 - {{shift{ X0[DATA_WIDTH - 1 ] }} ,X0[DATA_WIDTH - 1 : shift] } ;Z1 <= Z0 + ANGLE                                                    ;endendendendmodule

cordic_tb.v

module cordic_tb #(parameter       DATA_WIDTH   =    4'd8      
);
reg                                 clk       ;
reg                                 rst_n     ;
reg          [DATA_WIDTH - 1 : 0]   phase     ;
reg                                 ena       ;
wire         [DATA_WIDTH - 1 : 0]   sin_out   ;
wire         [DATA_WIDTH - 1 : 0]   cos_out   ;CORDIC#(.DATA_WIDTH    ( DATA_WIDTH )
)u_CORDIC(.clk           ( clk           ),.rst_n         ( rst_n         ),.phase         ( phase         ),.ena           ( ena           ),.sin_out       ( sin_out       ),.cos_out       ( cos_out       )
);always #5 clk = ~clk ;initial 
begin clk      = 0     ;rst_n    = 0     ; ena      = 1     ;phase    = 8'h00 ;#10rst_n   = 1      ;
end
always #10
phase = phase + 1    ; endmodule 

README.md

# 本文参考自 西电的verilog 课程实验 还有网上的 CORDIC算法详解
对于CORDIC的算法 关键是学会迭代和 掌握自 不同象限角度的换算
我在参阅网上资料的时候 发现有些角度的换算存在了错误这里我再写入一下 
| 第一象限 | 第二象限 | 第三象限 | 第四象限 |
| --------| --------| --------| --------|
| (x,y)   | (x,y)   | (x,y)    |  (x,y)   |
| (x,y)   | (-y,x)  | (-x ,-y) | (y , -x) |最关键的是在于理清如何计算的 实际操作起来的  圆周旋转求旋转模式下的正余弦
并不用考虑太多的 角度旋转 选取初始值之后 直接迭代开干 

在这里插入图片描述

## 波形很奇怪 我也不懂为什么做不到像其他人的这么顺滑 但是应该没错吧

纠正一下 把进制改成 Signed Decimal 就可以得到顺滑的常规正弦函数波形
在这里插入图片描述

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

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

相关文章

深入理解 Nginx 工作原理:Master-Worker 架构与性能优化

目录 前言1 Nginx 的 Master-Worker 架构2 Worker 进程的工作原理3 Master-Worker 架构的优势3.1 热部署的便利性3.2 进程间独立性3.3 系统稳定性和容错性提升3.4 系统风险降低 4 Worker 数量的设置5 Worker 连接数&#xff08;worker_connections&#xff09;结语 前言 Nginx…

nodejs微信小程序+python+PHP购物商城网站-计算机毕业设计推荐

目 录 摘 要 I ABSTRACT II 目 录 II 第1章 绪论 1 1.1背景及意义 1 1.2 国内外研究概况 1 1.3 研究的内容 1 第2章 相关技术 3 2.1 nodejs简介 4 2.2 express框架介绍 6 2.4 MySQL数据库 4 第3章 系统分析 5 3.1 需求分析 5 3.2 系统可行性分析 5 3.2.1技术可行性&#xff1a;…

Ubuntu 常用命令之 tar 命令用法介绍

tar 命令在 Ubuntu 系统中是用来打包和解包文件的工具。tar 命令可以将多个文件或目录打包成一个 tar 文件&#xff0c;也可以将 tar 文件解包成原来的文件或目录。 tar 命令的常用参数如下 c&#xff1a;创建一个新的 tar 文件。x&#xff1a;从 tar 文件中提取文件。v&…

198|鸭的喜剧,也是蝌蚪的悲剧

​ 第一次读鲁迅的《鸭的喜剧》&#xff0c;平平淡淡的文字&#xff0c;没有一丝辛辣&#xff0c;讲了一个给小朋友的故事。如果不知道&#xff0c;都不会觉得这是鲁迅的作品。 故事很简单&#xff1a;友人先是买了蝌蚪&#xff0c;想等蝌蚪长大听蛙鸣&#xff1b;后来买了四只…

机器学习之逻辑回归,一文掌握逻辑回归算法知识文集

&#x1f3c6;作者简介&#xff0c;普修罗双战士&#xff0c;一直追求不断学习和成长&#xff0c;在技术的道路上持续探索和实践。 &#x1f3c6;多年互联网行业从业经验&#xff0c;历任核心研发工程师&#xff0c;项目技术负责人。 &#x1f389;欢迎 &#x1f44d;点赞✍评论…

H5聊天系统聊天网站源码 群聊源码 无限建群创群

H5聊天系统聊天网站源码 群聊源码 无限建群创群 1.支持自助建群 管理群 修改群资料 2.支持自动登录 登陆成功可自助修改资料 3.后台可查看群组聊天消息记录 4.支持表情 动态表情 图片发布 5.支持消息语音提醒 测试环境&#xff1a;NginxMySQL5.6PHP5.6 1.将压缩包解压到…

VueCron使用方法

1&#xff09;什么是vueCron Vue Cron 是基于 Vue.js 的定时任务管理组件&#xff0c;它提供了一种简单易用的方式来设定和管理定时任务。Vue Cron 提供了一个类似于 Linux crontab 的界面&#xff0c;用户可以通过它来创建、编辑和删除定时任务。 2&#xff09;安装依赖及应…

数据安全扫描仪荣膺网络安全优秀创新成果大赛优胜奖 - 凸显多重优势

近日&#xff0c;由中国网络安全产业联盟&#xff08;CCIA&#xff09;主办、CCI数据安全工作委员会中国电子技术标准化研究院等单位承办的“2023年网络安全优秀创新成果大赛”获奖名单公布。天空卫士数据安全扫描仪&#xff08;DSS&#xff09;产品获得创新成果大赛优胜奖。 本…

Kubernetes 容器编排(6)

企业级镜像仓库Harbor 上传harbor安装包并安装 $ tar xf harbor-offline-installer-v2.5.3.tgz $ cp harbor.yml.tmpl harbor.yml $ vim harbor.yml hostname: 192.168.246.217# http related config http:# port for http, default is 80. If https enabled, this port will…

人工智能的发展之路:时间节点、问题与解决办法的全景解析

导言 人工智能的发展历程充满了里程碑式的事件&#xff0c;从早期的概念到今天的广泛应用&#xff0c;每个时间节点都伴随着独特的挑战和创新。本文将详细描述每个关键时间节点的事件&#xff0c;探讨存在的问题、解决办法&#xff0c;以及不同阶段之间的联系。 1. 195…

Selenium库编写爬虫详细案例

一、引言 Selenium作为一个强大的自动化测试工具&#xff0c;其在网络爬虫领域也展现出了许多技术优势。首先&#xff0c;Selenium可以模拟浏览器行为&#xff0c;包括点击、填写表单、下拉等操作&#xff0c;使得它能够处理一些其他爬虫工具无法应对的情况&#xff0c;比如需…

华为配置IPv4静态路由与静态BFD联动示例

组网需求 如图1所示&#xff0c;SwitchA通过SwitchB和NMS跨网段相连。在SwitchA上通过静态路由与NMS进行正常通信。在SwitchA和SwitchB之间实现毫秒级故障感知&#xff0c;提高收敛速度 配置思路 采用如下思路配置IPv4静态路由与静态BFD联动&#xff1a; 在SwitchA和SwitchB上…

基于ssm在线交友系统论文

基于VUEssm框架的在线交友系统 摘要 本文介绍了在线交友系统的开发全过程。通过分析企业对于在线交友系统的需求&#xff0c;创建了一个计算机管理在线交友系统的方案。文章介绍了在线交友系统的系统分析部分&#xff0c;包括可行性分析等&#xff0c;系统设计部分主要介绍了系…

使用VSC从零开始Vue.js——备赛笔记——2024全国职业院校技能大赛“大数据应用开发”赛项——任务3:数据可视化

使用Visual Studio Code&#xff08;VSC&#xff09;进行Vue开发非常方便&#xff0c;下面是一些基本步骤&#xff1a; 一、下载和安装Vue 官网下载地址Download | Node.js Vue.js是基于Node.js的&#xff0c;所以首先需要安装Node.js&#xff0c;官网下载地址&#xff1a;No…

基于Java+Springboot+Vue+elememt宠物用品商城系统设计实现

基于JavaSpringbootVueelememt宠物用品商城系统设计实现 &#x1f345; 作者主页 程序开发 &#x1f345; 欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; &#x1f345; 文末获取源码联系方式 &#x1f4dd; 文章目录 基于JavaSpringbootVueelememt宠物用品商城系统设计实…

基于SSM+Vue的新闻管理系统

基于SSMVue的新闻管理系统的设计与实现~ 开发语言&#xff1a;Java数据库&#xff1a;MySQL技术&#xff1a;SpringSpringMVCMyBatisVue工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 系统展示 主页 新闻列表 管理员界面 用户界面 摘要 新闻管理系统基于SSM&#xff08;Spr…

界面控件DevExpress v23.2全新发布 - 官宣正式支持.NET 8

DevExpress拥有.NET开发需要的所有平台控件&#xff0c;包含600多个UI控件、报表平台、DevExpress Dashboard eXpressApp 框架、适用于 Visual Studio的CodeRush等一系列辅助工具。屡获大奖的软件开发平台DevExpress 今年第一个重要版本v23.1正式发布&#xff0c;该版本拥有众多…

C# WPF上位机开发(多线程中锁的使用)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 多线程编程一般都会涉及到锁的时候&#xff0c;很多人可能觉得很意外&#xff0c;为什么会需要这么一个锁。本质上&#xff0c;这主要还是因为多线…

【超详细】基于单片机控制的十字道路口交通灯控制

目录 最终效果 一、设计任务 二、设计报告 1 设计说明 1.1功能分析 1.1.1整体系统功能分析 1.1.2显示状态功能分析 1.1.3设置状态功能分析 1.1.4紧急状态功能分析 1.2方案比选 1.2.1车辆LED数码管倒计时显示板块 1.2.2车辆信号灯显示板块 1.2.3行人信号灯显示板块 …

常见可视化大屏编辑器有哪些?

前言&#xff1a; 在当今数字化时代&#xff0c;可视化大屏编辑器成为了数据展示和决策支持的重要工具。大屏编辑器不仅仅是数据的呈现&#xff0c;更是数据背后的故事的讲述者。它通过图表、图形和实时数据的呈现&#xff0c;为用户提供了全面的信息视图&#xff0c;帮助用户更…