Cordic IP核使用说明以及避坑记录

news2024/9/20 14:55:33

Cordic IP核使用说明以及避坑记录

参考文章:(140条消息) Vivado cordic IP核rotate和translate使用详解(附有代码)_cordic ip核 rotate_迎风打盹儿的博客-CSDN博客
(140条消息) VIVADO cordic IP核_卡布奇诺加勺糖的博客-CSDN博客


文章目录

  • Cordic IP核使用说明以及避坑记录
  • 前言
  • 一、cordic算法的原理
  • 二、cordic IP核主要功能:
    • 1.translate模式IP核配置和踩坑记录
    • 2. rotate模式IP核配置和踩坑记录
    • 3. 代码参考


前言

项目需求使用了cordicIP核取相位然后旋转,这篇文章主要是记录一下学习IP核以及使用IP核过程中遇到的问题。


一、cordic算法的原理

推荐学习视频:FPGA:Cordic算法介绍与实现_哔哩哔哩_bilibili
视频清晰的讲述了cordic算法的原理以及硬件实现,视频下方还提供了代码和资料,其中有一份XILINX-CORDIC算法文档非常推荐一看。

二、cordic IP核主要功能:

CORDIC(Coordinate Rotation Digital Computer)算法即坐标旋转数字计算方法。该算法通过基本的加和移位运算代替乘法运算,使得矢量的旋转和定向的计算不再需要三角函数、乘法、开方、反三角、指数等函数。有以下功能模式:

  • rotate 旋转
  • translate 变换 ——直角坐标转极坐标
  • sin/cos
  • arctan
  • sinh/cosh
  • arc tanh
  • square root 平方根

这次实现主要关注的是:rotate、 translate

1.translate模式IP核配置和踩坑记录

在这里插入图片描述

  1. Functional Selection: 模式选择,此处选择Translate
  2. Architectural Configuration: CORDIC核心有两种架构配置,并行和串行。
  3. Pipelining Mode: CORDIC核心提供了三种流水线模式:无、最优和最大。流水线模式的选择基于功能配置和体系结构配置的选择。

None: CORDIC核心在没有流水线的情况下实现。
优化: CORDIC核心实现了尽可能多的流水线阶段,而不使用任何额外的lut。 最大:CORDIC核心在每个shift-add子阶段之后都有一个管道实现。 此处选择优化。

  1. Phase Format:

radians格式下就是输入正常的弧度制,输入范围是(-π,π) scale
radians则是输入归一化的弧度值,输入范围是(-1,1) 说明白点,radians格式下,你的输入就相当于在scale radians下输入再乘π。 此处选择Radians。

  1. Round Mode: CORDIC核心提供四种舍入模式。

Truncate截断: The X_OUT, Y_OUT, and PHASE_OUT outputs are truncated.

Positive Infinity向上取整: The X_OUT, Y_OUT, and PHASE_OUT outputs are
rounded such that 1/2 is rounded up (towards positive infinity). It is
equivalent to the MATLAB function floor(x + 0.5).

Pos Neg Infinity四舍五入: The outputs X_OUT, Y_OUT, and PHASE_OUT are rounded such that 1/2 is rounded up (towards positive infinity) and -1/2 is rounded down (towards negative infinity). It is equivalent to the MATLAB function round(x).

Nearest Even最近偶数: The X_OUT, Y_OUT, and PHASE_OUT outputs are rounded toward the nearest even number such that a 1/2 is rounded down and 3/2 is rounded up.
根据需要选择Round Pos Neg Inf。

  1. Iterations和 Precision: 不选设为0 IP核根据其他设置默认设置。
  2. Coarse Rotation:如果关闭粗旋转,输入/输出范围将限制在第一象限(-Pi/4,+ Pi/4)。所以应该勾上。
  3. 【坑】Compensation Scaling:补偿方式。cordic这个IP核在使用的时候他的输出是乘了倍数Z的,第一次用的时候没有勾选补偿方式,发现输出结果角度是对的,但是模值不正确,勾选补偿方式后cordic会自己把输出再乘一个Z的倒数,这样就对了。

No Scale Compensation: 输出X和Y没有补偿,并生成,按比例Z缩放。
LUT Based:输出X和Y补偿使用基于LUT的常系数乘法器。
BRAM: 输出X和Y使用块ram为基础的常系数乘法器进行补偿。
Embedded Multiplier: 输出X和Y使用DSP Slice进行补偿。
此处如果选No,不会补偿,输出结果不对。以保证结果正确,必须选择一项补偿方式。此处默认选LUT Based。

  1. 数据范围 需要注意,否则输出可能出错
    在这里插入图片描述
    在这里插入图片描述
    Translation的数据范围,fix格式下数据范围不能超过±1,此外要注意输出的模值会不会超位宽的问题,如果有超需要扩展位宽!!!Fix16_14实际上就是(signed [15:0])/2^14

    Fix16_14: 1(符号位)+1(整数位)+14(小数位)
    仿真器显示定点小数:
    【技巧】Vivado 仿真器simulation显示定点小数_LiangWF22的博客-CSDN博客
    在这里插入图片描述

  2. 输入PADDING:具体是否有补零和补零位数根据IP核配置页面为准。另外如果输入X/Y_IN位宽和IP核位宽不一致需要补符号位。

在这里插入图片描述

第二页不用修改使用默认值即可:
在这里插入图片描述

2. rotate模式IP核配置和踩坑记录

配置和translate模式基本一致,这里我采的一个坑是,我是把translate的输出模值和相位经过一定处理后送到rotate里面,translate的输出位宽是16位,相位是fix16_13,但是我的rotate的输入phase是fix17_14(为了避免rotate输出的模值溢出多给了一位)我刚开始是直接补的符号位,这样子==实际上rotate收到的phase变成原来的一半了!!!==导致一个数据也不对,后来改成低位补一个0就解决了。

在这里插入图片描述


3. 代码参考

参考: (140条消息) Vivado cordic IP核rotate和translate使用详解(附有代码)_cordic ip核 rotate_迎风打盹儿的博客-CSDN博客

1.	`timescale 1ns / 1ps
2.	
3.	 
4.	module cordic_test_tb();
5.	 
6.	// cordic_translate_test Parameters
7.	parameter PERIOD  = 2;
8.	 
9.	// cordic_translate_test Inputs
10.	reg   clk                                  = 0 ;
11.	reg   start                                = 0 ;
12.	reg   [15:0]  x_in                         = 0 ;
13.	reg   [15:0]  y_in                         = 0 ;
14.	reg   [15:0]  pha_in                       = 0 ;
15.	 
16.	// cordic_translate_test Outputs
17.	wire  over1                                 ;
18.	wire  over2                                 ;
19.	wire  [15:0]  x_out1                        ;
20.	wire  [16:0]  x_out2                        ;
21.	wire  [16:0]  y_out2                        ;
22.	wire  [15:0]  pha_out                      ;
23.	 
28.	 
29.	cordic_translate_test  u_cordic_translate_test (
30.	    .clk                     ( clk             ),
31.	    .start                   ( start           ),
32.	    .x_in                    ( x_in     [15:0] ),
33.	    .y_in                    ( y_in     [15:0] ),
34.	 
35.	    .over                    ( over1            ),
36.	    .x_out                   ( x_out1    [15:0] ),
37.	    .pha_out                 ( pha_out   [15:0] )
38.	);
39.	 
40.	 
41.	initial
42.	begin
43.		forever #(PERIOD/2)  clk=~clk;
44.	    #5  start<=1;
45.	    x_in<=16'b0011000000000000;
46.	    y_in<=16'b0011000000000000;
47.	    pha_in<=16'b0011001001000011;
48.	    #2     
49.	    x_in<=16'b1110000000000000;
50.	    y_in<=16'b1110000000000000;
51.	    pha_in<=16'b1001101101111000;
52.	    
53.	    #10
54.	    x_in<=16'b0110000000000000;
55.	    y_in<=16'b1010000000000000;
56.	    pha_in<=16'b0110010010000111;
57.	end
58.	
59.	
60.	
61.	cordic_rotate_test  u_cordic_rotate_test (
62.	    .clk                     ( clk            ),
63.	    .start                   ( start          ),
64.	    .x_in                    ( x_in           ),
65.	    .y_in                    ( y_in           ),
66.	    .pha_in                  ( pha_in         ),
67.	 
68.	    .over                    ( over2           ),
69.	    .x_out                   ( x_out2          ),
70.	    .y_out                   ( y_out2          )
71.	);
72.	 
73.	
74.	
75.	 
76.	endmodule

module cordic_rotate_test(
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 [16:0] x_out,     //输出坐标x
output wire [16:0] y_out      //输出坐标y
    );
wire [16:0]phase ;
wire [40:0] rotate_out;
//assign phase = {pha_in[15],pha_in};
assign phase = {pha_in,1'b0};
wire [16:0] x_in_1;
wire [16:0] y_in_1;
assign y_in_1 = {y_in[15],y_in};
assign x_in_1 = {x_in[15],x_in};
cordic_rotate u_cordic_rotate_ip (
  .aclk(clk),                                        // input wire aclk
  .s_axis_phase_tvalid(start),          // input wire s_axis_phase_tvalid
  .s_axis_phase_tdata(phase),            // input wire [17 : 0] s_axis_phase_tdata
  .s_axis_cartesian_tvalid(start),  // input wire s_axis_cartesian_tvalid
  .s_axis_cartesian_tdata({y_in_1,7'b0000000,x_in_1}),    // input wire [41 : 0] s_axis_cartesian_tdata
  .m_axis_dout_tvalid(over),            // output wire m_axis_dout_tvalid
  .m_axis_dout_tdata(rotate_out)              // output wire [41 : 0] m_axis_dout_tdata
);
assign  x_out = rotate_out[16:0];
assign  y_out = rotate_out[40:24];
endmodule
module cordic_translate_test(
input clk,                    //输入时钟信号
input start,                  //输入开始计算信号
input [15:0] x_in,            //输入坐标x
input [15:0] y_in,            //输入坐标y
output wire over,              //输出计算完成标志
output wire [15:0] x_out,      //输出坐标x
output wire [15:0] pha_out     //输出相角
);
 
 
cordic_translate cordic_translate_inst(
  .aclk(clk),                                        // input wire aclk
  .s_axis_cartesian_tvalid(start),  // input wire s_axis_cartesian_tvalid
  .s_axis_cartesian_tdata({y_in,x_in}),    // input wire [63 : 0] s_axis_cartesian_tdata
  .m_axis_dout_tvalid(over),            // output wire m_axis_dout_tvalid
  .m_axis_dout_tdata({pha_out,x_out})              // output wire [63 : 0] m_axis_dout_tdata
  
);
 
endmodule

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

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

相关文章

面试题:推排序是一种稳定排序吗?

面试题&#xff1a;推排序是一种稳定排序吗&#xff1f; 在回答该问题前&#xff0c;首先需要了解什么是稳定排序。 稳定性就是指对于两个关键字相等的记录&#xff0c;它们在序列中的相对位置&#xff0c;在排序之前和排序之后没有发生改变。通俗地讲就是有两个关键字相等的…

Node.js---菜鸟教程

文章目录 创建第一个应用创建 Node.js 应用 NPM 使用介绍使用 npm 命令安装模块本地安装使用 package.json模块的操作 回调函数阻塞代码实例非阻塞代码 事件循环事件驱动程序 EventEmitterEventEmitter 类方法实例error 事件继承 EventEmitter Buffer&#xff08;缓冲区&#x…

Redis-缓存

新增或者更新数据时,创建以后顺便存到redis中去【维护缓存】 获取的时候先从redis缓存中拿数据 如果拿数据的时候为空,则到数据库中拿数据,后再存到redis缓存中去 大量的商品【包括冷门商品】都进行上面的缓存,那么就很耗内存 针对每个数据进行缓存的时候 维护一个过期时间…

MQTT(一)

MQTT&#xff08;一&#xff09; 1.背景 学习目标&#xff1a;经过了解&#xff0c;Netty占用服务器资源内存大、远距离传感器在极端条件下数据处理兼容较差&#xff08;网络条件差&#xff0c;需要反复重连等&#xff09;。从同行业了解到&#xff0c;现在主流工业传输使用M…

【博学谷学习记录】超强总结,用心分享 | 架构师 zabbix学习总结

文章目录 一、介绍zabbix zabbix专有词汇 二、zabbix zabbix实践修改zabbix zabbix语⾔服务器可视化指标解决zabbix zabbix乱码问题查看监控内容可视化监控agent agent的cpu cpu动态查看模板--监控项⾃定义监控项语法 一、介绍 Zabbix 是由 Alexei Vladishev 开发的⼀种⽹络监…

达梦数据库介绍

文章目录 前言一、达梦数据库的定位二、达梦有哪些工具1、达梦管理工具2、达梦数据迁移工具3、 达梦数据库配置助手4、其它工具 三、Linux下的工具1、数据库初始化工具2、数据库迁移工具3、其它工具 四、其它连接工具总结 前言 近几年由于各种原因&#xff0c;国内开启了一波国…

【Android】-- 如何对APP版本控制/更新?

目录 一、 前提准备 1、获取服务器 2、使用工具操作云服务器 二、Json格式网页 三、创建file_paths.xml及修改AndroidManifest.xml 四、在java代码加入更新检测代码 效果如图&#xff1a; 可以强制更新和非强制更新&#xff0c;和浏览器下载安装包。 一、 前提准备 1、获取…

0001-TIPS-2020-hxp-kernel-rop : ret2user

目的 理解系统调用的过程&#xff1a;从用户态进入内核态&#xff0c;再从内核态返回用户态。细节见文末的参考了解一般性提权方法commit_creds(prepare_kernel_cred (0)); 环境搭建 下载 pwn 2020-kernel-rop wget https://2020.ctf.link/assets/files/kernel-rop-bf9c106…

说精神力量的词,愿力很神奇

说精神力量的词&#xff0c;愿力最神奇&#xff01; ​愿力&#xff0c;心力&#xff0c;精神&#xff0c;精 气 神&#xff0c;气 &#xff0c;能量 【能量】是个外来词 趣讲大白话&#xff1a;200天了&#xff0c;布道的愿力推动我 【趣讲信息科技200期】 ******************…

【换根DP】生活在树上

换根DP板子题 D-生活在树上_牛客小白月赛46 (nowcoder.com) 题意&#xff1a; 思路&#xff1a; 看数据范围是1e6且是统计问题&#xff0c;求的是对于每一个点的统计问题&#xff0c;那就逃不出是换根DP了 首先dfs1一次把树形DP求出来&#xff0c;然后再考虑换根 设dp[u]…

Wireshark抓包分析(ARP TCP DNS HTTP)

目录 一、ARP 二、DNS 三、TCP TCP的总过程&#xff1a; ​TCP三次握手&#xff1a; TCP四次挥手&#xff1a; 四、HTTP 一、ARP 1.ARP&#xff08;Address Resolution Protocol&#xff09;&#xff0c;是根据IP地址获取物理地址的一个TCP/IP协议。 我们要抓ARP 同网段内…

(学习日记)2023.06.15

写在前面&#xff1a; 由于时间的不足与学习的碎片化&#xff0c;写博客变得有些奢侈。 但是对于记录学习&#xff08;忘了以后能快速复习&#xff09;的渴望一天天变得强烈。 既然如此 不如以天为单位&#xff0c;以时间为顺序&#xff0c;仅仅将博客当做一个知识学习的目录&a…

0003-TIPS-2020-hxp-kernel-rop : bypass-KPTI-with-trampoline

KPTI KPTI描述内容摘录自ctf wiki KPTI 机制最初的主要目的是为了缓解 KASLR 的绕过以及 CPU 侧信道攻击。 在 KPTI 机制中&#xff0c;内核态空间的内存和用户态空间的内存的隔离进一步得到了增强。 内核态中的页表包括用户空间内存的页表和内核空间内存的页表。 用户态的页…

minikube 试炼

点我进入 minikube 试炼 今天我们先来尝试使用一下 minikube &#xff0c;可以进入到 https://kubernetes.io/zh/docs/tutorials/hello-minikube/ 页面上直接感受&#xff0c;或者通过如下指令&#xff0c;将 minikube 放入我们的服务器上面进行使用 简单安装 minikube Linu…

在Centos Stream 9上Docker的实操教程(六) - Docker Compose容器编排详解

在Centos Stream 9上Docker的实操教程 - Docker Compose容器编排详解 前言什么是Docker-Compose下载安装和卸载使用仓库安装手动安装卸载 docker compose常用命令项目实战构建SpringBoot项目编写Dockerfile文件编写Docker-Compose.yml文件 运行测试相关注意事项结语 前言 在了…

使用Pyinstall将PyQT5工程打包成.exe应用程序(包含图标一同打包)

1.首先安装pyinstaller。 pip install pyinstaller 2.PyQT5制作程序中使用到的ico等一系列图标文件&#xff0c;要先经过.qrc文件转成.py文件后&#xff0c;才可跟随打包文件一同打包。 首先创建一个.qrc文件&#xff0c;将图片文件全部写进去&#xff0c;例如: <RCC>&…

selenium 调用本地浏览器插件

本文所有教程及源码、软件仅为技术研究。不涉及计算机信息系统功能的删除、修改、增加、干扰,更不会影响计算机信息系统的正常运行。不得将代码用于非法用途,如侵立删!selenium 使用本地浏览器插件 环境 win10Python3.9selenium 4.10查看chrome配置文件路径 地址栏输入 ​​…

Python 请求分页

文章目录 什么是 Python 中的分页带有下一个按钮的 Python 分页没有下一个按钮的 Python 分页无限滚动的 Python 分页带有加载更多按钮的分页 在本文中&#xff0c;我们将了解分页以及如何克服 Python 中与分页相关的问题。 读完本文后&#xff0c;我们将能够了解 Python 分页以…

TensorHouse仓库介绍

目录 1 TensorHouse介绍 2 说明性例子 3模型列表 4基本组件 5方法 6参考 7后续计划 1 TensorHouse介绍 代码仓库&#xff1a;GitHub - ikatsov/tensor-house: A collection of reference machine learning and optimization models for enterprise operations: marketi…

插入排序-C语言实现

&#x1f970;前言 &#x1f354;在学数据结构的第一节课就知道了数据结构课程是要管理并且学会操作数据&#xff0c;当然操作数据首先想到的就是数据的排序&#xff0c;排过顺序的数据的使用价值才够大。前面我们学习了顺序表也学习了链表等等&#xff0c;这些就是储存数据的方…