【FPGA】Xilinx Cordic IP 内核使用记录(输入输出数据格式介绍)及实验仿真
创始人
2025-05-30 21:58:25

功能描述

1、Rotate

Rotate 实现的功能是坐标的旋转。
输入 X, Y, Phase
输出X’, Y’
具体实现的功能对应的数学表达形式如下:
在这里插入图片描述
在做FFT 复乘旋转因子时也可以用这个IP核的Rotate功能来实现。旋转因子-旋转!

2、Translation

Translation 实现的功能是求模,以及向量的夹角
输入 X, Y
输出X’ and Phase
具体实现的功能对应的数学表达形式如下:
在这里插入图片描述
在这里插入图片描述

3、Sin and Cos

功能:求取θ角对应的Sin 和Cos 函数值
输入:Phase
输出:X_OUT = Cos(PHASE_IN), Y_OUT = Sin(PHASE_IN)).

注:角度\相位Phase的数据格式是 2QN format,The output vector, (X_OUT, Y_OUT), is expressed as a pair of fixed-point twos complement numbers with an integer width of 2 bits (1QN format).
下面有关于数据格式的简略解释。

在数据输出时X,Y在同一个接口输出 sin的值在高位,cos的值在低位

在这里插入图片描述

4、Sinh and Cosh

功能:求解sinh 和cosh 在phase下的值
输入:Phase 角度
输出:坐标,注意高低位对应!
在这里插入图片描述

5、ArcTan

功能:求反正切函数值
输入:(X,Y) 坐标值
输出:Phase 角度
在这里插入图片描述

6 ArcTanh

功能:求Arctanh 函数值
输入:(Xin, Yin)
输出:Phase and (Xout,0)
在这里插入图片描述

数据格式

在这个IP内核里面
角度Phase的数据一般都是 1位符号位_2位整数位_N位小数位(2QN格式),
X, Y的输入是1位符号位_1位整数位_N位小数位(1QN格式)
输入,输出的数据都是二进制补码的形式(二补码),并且其他IP运算出来的数据可以直接输入到这个内核进行运算,大概可能都是补码的原因。

但是!!!在IP核运算中需要注意小数点对齐,数据截位的问题。
比如使用Xilinx 的 复数乘法器 CMPY IP 内核时,一个通道输入的仅仅存在符号位而不存在小数位,另外一个通道输入的却是1QN格式的数据,那么输出的结果也会存在着N位小数位。那么需要进行数据截位之后才会得到想要的结果。

详细可参考以下的一篇博文:
Xilinx Vivado复数乘法器Complex Multiplier IP核调用及其仿真

简单来说,就是如果输出选择最大位宽(无截位时),从非小数点的位置开始取,到输入数据位宽一致的位置即可。

例如,Cmpy 输入的一个复数是1位符号位+15位整数位无小数位;另一个输入的数据格式是1符号位+1整数位+14位小数位
那么在无截位输出的数据里[13:0]依旧是小数位,[14+:16](这种表述格式相当于[29:14], 14是开始截取的位置,16是截取的总位宽)位是我们想查看的。

使用教程

使用教程以Rotate 为例。
在 IP Catalog 搜索到我们的Cordic IP内核,点开后按下图所示经行内核设置。

在这里插入图片描述
第二页好像不用怎么配置(以后需要深入了解)
在这里插入图片描述

注意!!!每次数据输入需要延迟一段时间 ,这个延时具体在IP核配置的界面,那个Latency:22就是。

仿真激励文件代码:

`timescale 1ns / 1psmodule cordic_rotate_tb();// cordic_rotate_test Inputs
reg   clk                                  = 0 ;
reg   start                                = 0 ;
reg   [15:0]  x_in                         = 0 ;
reg   [15:0]  y_in                         = 0 ;
reg   [15:0]  pha_in                       = 0 ;
// reg [15:0] X_in [7:0];
// cordic_rotate_test Outputs
wire  over                                 ;
wire  [15:0]  x_out                        ;
wire  [15:0]  y_out                        ;initial
beginforever #5  clk=~clk;
endcordic_rotate  u_cordic_rotate (.clk                     ( clk            ),.start                   ( start          ),.x_in                    ( x_in    [15:0] ),.y_in                    ( y_in    [15:0] ),.pha_in                  ( pha_in  [15:0] ),.over                    ( over           ),.x_out                   ( x_out   [15:0] ),.y_out                   ( y_out   [15:0] )
);initial
begin#5  start<=1;pha_in<=16'b0000000000000000;//0x_in<=16'b0100000000000000;y_in<=16'b0000000000000000;#22 //第二次输入要在第一次输出之后,需要延时 pha_in<=16'b0011001000111101; //pi/2x_in<=16'b0100000000000000;y_in<=16'b0000000000000000;
endalways @(posedge clk)begin#300$stop;endendmodule

rotate代码:

`timescale 1ns / 1ps
//
// Company: SZU
// Engineer: LiangWF22
// 
// Create Date: 2023/03/19 09:42:43
// Design Name: 
// Module Name: cordic_rotate
// Project Name: 
// Target Devices: 
// Tool Versions: 
// Description: 
// 
// Dependencies: 
// 
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
// 
//module cordic_rotate(
input clk,                    //输入时钟信号
input start,                  //输入开始计算信号
input [15:0] x_in,            //输入坐标x
input [15:0] y_in,            //输入坐标y
input [15:0] pha_in,          //输入相角
output wire over,             //输出计算完成标志
output wire [15:0] x_out,     //输出坐标x
output wire [15:0] y_out      //输出坐标y);cordic_0 cordic_rotate0 (.aclk(clk),                                        // input wire aclk.s_axis_phase_tvalid(start),          // input wire s_axis_phase_tvalid.s_axis_phase_tdata(pha_in),            // input wire [15 : 0] s_axis_phase_tdata.s_axis_cartesian_tvalid(start),  // input wire s_axis_cartesian_tvalid.s_axis_cartesian_tdata({y_in,x_in}),    // input wire [31 : 0] s_axis_cartesian_tdata.m_axis_dout_tvalid(over),            // output wire m_axis_dout_tvalid.m_axis_dout_tdata({y_out,x_out})              // output wire [31 : 0] m_axis_dout_tdata
);endmodule

工程链接

CSDN:https://download.csdn.net/download/LiangWF22/87591037
其他:https://leoeinstein.lanzoum.com/ixdrk0qiefnc

Forever young,always tearful.

相关内容

热门资讯

数字操作方法 系列文章目录 前端系列文章——传送门 JavaScript系列文章——传送门 文章目录系列文章目录...
Cartesi 2023 年 ... 查看 Cartesi Machine、Cartesi Rollups 和 Noether 的更新正在...
JavaWeb——jsp概述入... JSP定义:  在如下一个jsp文件里面有如下的代码  <%@ page content...
一切喜怒哀乐都来自于你的认知 01 有个学子,准备出国,父母请来清华的教授宁向东。请问教授࿱...
JAVA并发编程——synch... 引言         Java语言为了解决并发编程中存在的原子性、可见性和有序性问题,...
git学习----3.21 未... 文章目录前言Git :一个分布式版本控制工具目标一、概述1.1 开发中的实际场景1.2...
Qt优秀开源项目之十七:QtP... QtPromise是Promises/A+规范的Qt/C++实现。该规范的译...
【前端八股文】JavaScri... 文章目录Set概念与arr的比较属性和方法并集、交集、差集Map概念属性和方法String用索引值和...
海康硬盘录像机接入RTSP/o... EasyNVR安防视频云服务平台可支持设备通过RTSP/Onvif协议接入平台,能提供...
在混合劳动力时代如何避免网络安... 在混合劳动力时代如何避免安全网络风险 三年多来,混合工作一直是工作生活中不可或缺的一...
2023还不懂Jmeter接口... 这里介绍的Jmeter接口测试的的实战,如果文章内容没遇看懂的话,我这边...
基于4G/5G弱网聚合的多链路... 基于4G/5G多卡聚合(弱网聚合)的智能融合通信设备技术亮点 增强带宽提供可靠连接 通过将多个有线和...
如何使用Synplify综合v... 文章目录使用Synplify综合的好处synplify的教程方法1(无效)...
2023年全国最新高校辅导员精... 百分百题库提供高校辅导员考试试题、辅导员考试预测题、高校辅导员考试真题、辅导员证考试题库等ÿ...
2022年18个值得期待的Le... 有数百个独特的LearnDash附加组件,您可能很难选择您的LearnDash LMS...
【java基础】Stream流... 文章目录基本介绍流的创建流的各种常见操作forEach方法filter方法map方法peek方法fl...
javaweb高校行政办公自动... 本课题基于我国高校管理信息化建设现状,结合在实际工作中所遇到的问题和收获,...
一款专门为自动化测试打造的集成... 你好,我是不二。 随着行业内卷越来越严重,自动化测试已成为测试工程师的...
【go-zero】golang... 一、casbin 概览 1、casbin基本了解 casbin的GitHub:https://git...
现在开发低代码平台算晚吗? 现在开发低代码平台算晚吗?作为低代码的亲戚——零代码厂商,这篇就以“厂商...
【JavaWeb】书城项目(2... 222.书城项目-第三阶段:修改所有html页面为jsp页面 改成jsp页面之后&#x...
基于jeecgboot的大屏设...      通过前面设计好数据源后,就要进行数据集的设计了。      一、还是在onl...
Linux命令小技巧:显示文件... 工作中会有很多千奇百怪的需求,比如:如何在 Linux 命令行中快速找到...
【找工作】-- 大数据工程师找... 目录 1.前言 2.找工作的理论知识 2.1 分析个人特征 2.1.1 你自身优势是什么?
C++基础算法④——排序算法(... 排序算法 1.插入排序 2.桶排序 1.插入排序 基本思想:将初始数据分为有序部分和...
nginx快速入门.跟学B站n... nginx快速入门.跟学B站nginx一小时精讲课程笔记nginx简介及环境准备nginx简介环境准...
ORACLE存过互相调用之间事... 今天在问答区看到一个问题是 假如有procedureA、procedureB和procedureC&...
基于java中Springbo... 基于java中Springboot框影视影院订票选座管理系统 开发语言:Java 框...
CVE-2018-18086 最近闲来无事,看到青少年CTF平台,感觉对新手还是比较友好的࿰...
【深度学习】基于Hough变化... 💥💥💞💞欢迎来到本博客❤️❤️&#x...