【【迭代七次的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.rhkb.cn/news/222995.html

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

相关文章

Jmeter关联操作

1.首先右键添加一个线程选择线程组,命名为线程组-1&#xff0c;添加取样器选择HTTP请求--城市天气 2.线程组-1右键&#xff0c;添加取样器选择后置处理器中的JSON提取器 3.线程组-1右键,添加取样器选择后置处理器中的BeanShell 后置处理程序(必须平级) 4.首先右键添加一个线程选…

[C++ 从入门到精通] 17.基类与派生类关系的详细再探讨

&#x1f4e2;博客主页&#xff1a;https://loewen.blog.csdn.net&#x1f4e2;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; 如有错误敬请指正&#xff01;&#x1f4e2;本文由 丶布布原创&#xff0c;首发于 CSDN&#xff0c;转载注明出处&#x1f649;&#x1f4e2;现…

微电网优化(Matlab复现)— 微电网两阶段鲁棒优化经济调度方法_刘一欣

论文链接&#xff1a;微电网两阶段鲁棒优化经济调度方法 - 中国知网 代码链接&#xff1a;https://m.tb.cn/h.5Mg7fCo?tkhnpmWgZiv2R 复现效果&#xff1a; 运行环境&#xff1a;Matlab 2020bCplexyalmip 1 微电网结构 图 1 所示为典型的微电网结构&#xff0c;由可控分布式…

如何在Portainer部署一个web站点到Nginx容器并结合内网穿透远程访问

文章目录 前言1. 安装Portainer1.1 访问Portainer Web界面 2. 使用Portainer创建Nginx容器3. 将Web静态站点实现公网访问4. 配置Web站点公网访问地址4.1公网访问Web站点 5. 固定Web静态站点公网地址6. 固定公网地址访问Web静态站点 前言 Portainer是一个开源的Docker轻量级可视…

基于Vite+Vue3 给项目引入Axios

基于ViteVue3 给项目引入Axios,方便与后端进行通信。 系列文章指路&#x1f449; 系列文章-基于Vue3创建前端项目并引入、配置常用的库和工具类 文章目录 安装依赖新建src/config/config.js 用于存放常用配置进行简单封装解决跨域问题调用尝试 安装依赖 npm install axios …

单元测试(超详细整理)

前言 为什么我们需要测试&#xff1f; 让产品可以快速迭代&#xff0c;同时还能保持高质量 对于一些相对稳定的系统级别页面&#xff0c;自动化测试在提高测试的效率的方面起到非常重要的作用。前端的自动化测试主要包括&#xff1a;浏览器测试和单元测试。Vue官方脚手架自带…

Python Opencv实践 - 手势音量控制

本文基于前面的手部跟踪功能做一个手势音量控制功能&#xff0c;代码用到了前面手部跟踪封装的HandDetector.这篇文章在这里&#xff1a; Python Opencv实践 - 手部跟踪-CSDN博客文章浏览阅读626次&#xff0c;点赞11次&#xff0c;收藏7次。使用mediapipe库做手部的实时跟踪&…

2024年【广东省安全员A证第四批(主要负责人)】考试内容及广东省安全员A证第四批(主要负责人)复审考试

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 广东省安全员A证第四批&#xff08;主要负责人&#xff09;考试内容是安全生产模拟考试一点通总题库中生成的一套广东省安全员A证第四批&#xff08;主要负责人&#xff09;复审考试&#xff0c;安全生产模拟考试一点…

二叉树的中序遍历(三种方法)

题目&#xff1a; 原题链接 简述题目就是&#xff1a;给你一颗二叉树的根结点root返回它的中序遍历 方法一&#xff08;递归&#xff09;&#xff1a; 中序遍历&#xff1a; 简单来说就是按照访问左子树——根节点——右子树的方式遍历这棵树&#xff0c;而在访问左子树或者右…

【基础知识】大数据组件HBase简述

HBase是一个开源的、面向列&#xff08;Column-Oriented&#xff09;、适合存储海量非结构化数据或半结构化数据的、具备高可靠性、高性能、可灵活扩展伸缩的、支持实时数据读写的分布式存储系统。 只是面向列&#xff0c;不是列式存储 mysql vs hbase vs clickhouse HMaster …

如何自定义右键弹框并实现位置自适应?

一、问题 右键显示弹框&#xff0c;但是靠近浏览器边缘的部分会被隐藏&#xff0c;需要实现弹框位置自适应 二、 问题分析 如果想要最终弹框的宽高不超过屏幕视口&#xff0c;就等于屏幕视口的总宽/高减去弹框打开时的起点坐标&#xff0c;剩下的部分大于等于弹框的宽/高&…

【快速开发】使用SvelteKit

自我介绍 做一个简单介绍&#xff0c;酒架年近48 &#xff0c;有20多年IT工作经历&#xff0c;目前在一家500强做企业架构&#xff0e;因为工作需要&#xff0c;另外也因为兴趣涉猎比较广&#xff0c;为了自己学习建立了三个博客&#xff0c;分别是【全球IT瞭望】&#xff0c;【…

关于“Python”的核心知识点整理大全37

目录 13.6.2 响应外星人和飞船碰撞 game_stats.py settings.py alien_invasion.py game_functions.py ship.py 注意 13.6.3 有外星人到达屏幕底端 game_functions.py 13.6.4 游戏结束 game_stats.py game_functions.py 13.7 确定应运行游戏的哪些部分 alien_inva…

12.18构建哈夫曼树(优先队列),图的存储方式,一些细节(auto,pair用法,结构体指针)

为结构体自身时&#xff0c;用.调用成员变量&#xff1b;为结构体指针时&#xff0c;用->调用成员变量 所以存在结构体数组时&#xff0c;调用数组元素里的成员变量&#xff0c;就是要用. 结构体自身只有在new时才会创建出来&#xff0c;而其指针可以随意创建 在用new时&…

【音视频】remb twcc原理

目录 twcc简介 WebRTC REMB 参考文档 twcc简介 TWCC全称是Transport wide Congestion Control&#xff0c;是webrtc的最新的拥塞控制算法。其原理是在接收端保存数据包状态&#xff0c;然后构造RTCP包反馈给发送端&#xff0c;反馈信息包括包到达时间、丢包状态等&#xff…

JavaWeb笔记之前端开发CSS

一 、引言 1.1 CSS概念 层叠样式表(英文全称&#xff1a;Cascading Style Sheets)是一种用来表现HTML&#xff08;标准通用标记语言的一个应用&#xff09;或XML&#xff08;标准通用标记语言的一个子集&#xff09;等文件样式的计算机语言。CSS不仅可以静态地修饰网页&…

ffmpeg 硬件解码零拷贝unity 播放

ffmpeg硬件解码问题 ffmpeg 在硬件解码&#xff0c;一般来说&#xff0c;我们解码使用cuda方式&#xff0c;当然&#xff0c;最好的方式是不要确定一定是cuda&#xff0c;客户的显卡不一定有cuda&#xff0c;windows 下&#xff0c;和linux 下要做一些适配工作&#xff0c;最麻…

吴恩达RLHF课程笔记

1.创建偏好数据集 一个prompt输入到LLM后可以有多个回答&#xff0c;对每个回答选择偏好 比如{prompt,answer1,answer2,prefer1} 2.根据这个数据集&#xff08;偏好数据集&#xff09;&#xff0c;创建reward model&#xff0c;这个model也是一个LLM,并且它是回归模型&#…

MySQL数据库 触发器

目录 触发器概述 语法 案例 触发器概述 触发器是与表有关的数据库对象&#xff0c;指在insert/update/delete之前(BEFORE)或之后(AFTER)&#xff0c;触发并执行触发器中定义的soL语句集合。触发器的这种特性可以协助应用在数据库端确保数据的完整性&#xff0c;日志记录&am…

Linux系统LVS+Keepalived群集

目录 一、概述 &#xff08;一&#xff09;群集特性 1.负载均衡 2.健康检查&#xff08;探针&#xff09; 3.故障转移 &#xff08;二&#xff09;Keepalived 1.作用 &#xff08;1&#xff09;支持故障自动转移 &#xff08;2&#xff09;支持节点健康状态检…