草庐IT

【FPGA】:ip核----cordic

夏凉秋落 2023-08-15 原文

文章目录

一、概述

cordic核主要用来求三角方程, 主要功能为:
 rotate 旋转 ——复数旋转
 translate 变换 ——复数转极坐标
 sin/cos
 arctan
 sinh/cosh
 arc tanh
 square root 平方根

二、端口说明

备注:s_axis_代表核作为丛机,m_axis代表核作为主机,数据宽度一般为8的整数倍

三、ip核的生成

(1)在ip catalog里面选择cordic

(2)配置configuration



compensation Scaling:补偿因子,当选择不补偿时他的输出是乘了倍数Z的,如下所示:
因此,为了让结果为z,则需要选择补偿项
(3)配置Axis Stream Option


与核相关的具体细节如下所示:

四、示例

以arctan函数为例进行仿真说明:

输入: 复数据实部虚部,输入格式:IMAG(31:16),REAL(15:0);范围:− 1 ≤ x o r y ≤ 1
输出: 相位,输出格式:PHASE(15:0);范围:− π ≤ x ≤ π

tb文件:

`timescale 1ns / 1ps
//
// Company: 
// Engineer: 
// 
// Create Date: 2022/06/04 10:14:40
// Design Name: 
// Module Name: cordic_tb
// Project Name: 
// Target Devices: 
// Tool Versions: 
// Description: 
// 
// Dependencies: 
// 
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
// 
//


module cordic_tb();

reg aclk;
reg aresetn;
reg s_axis_cartesian_tvalid;
reg [31:0] s_axis_cartesian_tdata;
wire m_axis_dout_tvalid;
wire [15:0] m_axis_dout_tdata;

wire [15:0]X_in;//real
wire [15:0]Y_in;//imag

assign Y_in = s_axis_cartesian_tdata[31:16];
assign X_in = s_axis_cartesian_tdata[15: 0];

cordic_0 cordic_0_inst0(
  .aclk(aclk),                                        // input wire aclk
  .aresetn(aresetn),                                  // input wire aresetn
  .s_axis_cartesian_tvalid(s_axis_cartesian_tvalid),  // input wire s_axis_cartesian_tvalid
  .s_axis_cartesian_tdata(s_axis_cartesian_tdata),    // input wire [31 : 0] s_axis_cartesian_tdata
  .m_axis_dout_tvalid(m_axis_dout_tvalid),            // output wire m_axis_dout_tvalid
  .m_axis_dout_tdata(m_axis_dout_tdata)              // output wire [15 : 0] m_axis_dout_tdata
);

/*********************************时钟信号*********************************/
 initial aclk = 0;
 always #5 aclk = ~aclk;

initial begin
    aresetn =0;
    s_axis_cartesian_tvalid=0;
    s_axis_cartesian_tdata=32'd0;
    #20;
    aresetn =1;
    s_axis_cartesian_tvalid=1;
    // 前两位为整数部分【第1位符号位,第2位为数字】,后两位为小数部分,,输入必须归一化到-1到1
   // s_axis_cartesian_tdata=32'b0010000000000000_0010100000000000;       //高位为虚部,低位为实部
    s_axis_cartesian_tdata=32'b0010000000_000000_0010100000_000000;
end

endmodule

仿真结果;

其中modelsim显示小数的方法如下:


对于本例而言,输入数据的整数为2bit,输出数据的整数为3bit,均为有符号数。
总结: cordic ip核使用 时候通常情况下输入为【-1,1】,超过此范围会出错,因此,常用办法为,对原来数据的最高位进行扩一位符号位,再送入cordic ip核,或者代码中必定能要保证输入数据的范围限定在-1~1之间。若是不能肯定上级模块向CORDIC中输入数据的范围,能够先仿真,肯定数据的最大值和最小值是否超出了该范围。若是超过能够用相似“{q[15],q[15:1],i[15],i[15:1]}”这样的移位除法,缩小输入数据范围。因为是带符号数二进制补码,移位时注意高位补符号位。

五、参考资料

  1. VIVADO cordic IP核
  2. XILINX CORDIC IP核使用记录
  3. CORDIC(6.0) IP核 与 DDS Compiler(6.0) IP核 使用示例
  4. FPGA----IP核cordic使用
  5. VIVADO cordic IP核
  6. Cordic v6.0 IP CORE使用说明
  7. modelsim调试把信号显示为小数格式
  8. VIVADO cordic IP核(遇到的一些问题)
  9. FPGA数字信号处理(十四)Vivado Cordic IP核计算arctan(使用技巧)

有关【FPGA】:ip核----cordic的更多相关文章

  1. ruby - 从 Ruby 中的主机名获取 IP 地址 - 2

    我有一个存储主机名的Ruby数组server_names。如果我打印出来,它看起来像这样:["hostname.abc.com","hostname2.abc.com","hostname3.abc.com"]相当标准。我想要做的是获取这些服务器的IP(可能将它们存储在另一个变量中)。看起来IPSocket类可以做到这一点,但我不确定如何使用IPSocket类遍历它。如果它只是尝试像这样打印出IP:server_names.eachdo|name|IPSocket::getaddress(name)pnameend它提示我没有提供服务器名称。这是语法问题还是我没有正确使用类?输出:ge

  2. ruby - 在 TCPServer (Ruby) 中,我如何从客户端获取 IP/MAC? - 2

    我想在Ruby的TCPServer中获取客户端的IP地址。以及(如果可能的话)MAC地址。例如,Ruby中的时间服务器,请参阅评论。tcpserver=TCPServer.new("",80)iftcpserverputs"Listening"loopdosocket=tcpserver.acceptifsocketThread.newdoputs"Connectedfrom"+#HERE!HowcanigettheIPAddressfromtheclient?socket.write(Time.now.to_s)socket.closeendendendend非常感谢!

  3. ruby - 没有 nginx 的 Puma - 同一 IP 上的多个 ruby​​ 应用程序 :PORT - 2

    Nginx在生产中的重要性通常基于它为慢速客户端提供服务的能力;在RESTfulAPI的设置中,它似乎是生产堆栈的一个不必要的层,尤其是Puma(不像广泛使用的unicorn可以处理nginx工作)。Pumacanallowmultipleslowclientstoconnectwithoutrequiringaworkertobeblockedontherequesttransaction.Becauseofthis,Pumahandlesslowclientsgracefully.HerokurecommendsPumaforuseinscenarioswhereyouexpect

  4. Java IP归属地查询(离线方式+在线方式,内附查询IP方法) - 2

    一、离线方式1.1.下载ip2region.xdbGitHub项目地址:https://github.com/lionsoul2014/ip2region我们首先需要下载一个ip2region.xdb的文件下载地址:https://github.com/lionsoul2014/ip2region/blob/master/data/ip2region.xdb打开后点击如图的Download图标即可下载。下载完成后,需要将该文件放到我们的项目中。ps:我是直接放到服务器的,因为放在项目的资源文件夹下,当我们调试的时候使用JavaSpring自带的工具去获取该文件的绝对路径时,没有任何问题,能够正

  5. IP数据报格式 - 2

    1、报文格式前几篇总结过较多网络层的知识,ARP,ip地址、子网掩码等等。这次总结一下IP数据报的报文格式IP数据报的格式能够说明IP协议都具有什么功能。在TCP/IP的标准中,各种数据格式常常以32位(4字节)为单位来描述的。wireshark中IP数据报文呈现一个IP数据报文由首部和数据两部分组成。首部的前一部分是固定长度,共20字节。是所有IP数据报文必须具有的。在首部的固定部分的后面是一些可选字段,其长度可变。2、首部个字段意义  1、版本占4位,指IP协议的版本。通信双方使用的IP协议的版本必须一致。目前广泛使用的IP协议版本号为4(即IPv4)。版本号为6(即IPv6)  2、首部

  6. FPGA 之 时钟,时钟域, 以及复位系统的设计 - 2

    FPGA时钟和时钟域时钟树所谓时钟树为FPGA内部资源,分:全局时钟树,区域时钟树,IO时钟树原则上优先使用全局时钟树,在GT接口上使用IO时钟树,一般工具也会对GT时钟加以限制;时钟树使用方式正确的物理连接FPGA会由物理管脚专门用于全局时钟设置,通过查询数据手册可以在PCB设计阶段进行确认,当外部时钟接入此管脚时,工具会自动占有全局时钟树资源,当接入普通信号时不会分配时钟树资源;恰当的代码描述原语的使用,即BUFG的使用,可以将PLL的输出等内部时钟进行全局时钟资源的分配;IO时钟资源需要参考相应接口手册,以ultrascale的GTH为例,其JESD204的时钟方案针对不同的子类会由不同

  7. MicroBlaze在纯FPGA下 Xilinx SDK固化程序到外部SPI FLASH - 2

    外部SPIFLASH:MicronN25Q128A13ESE40G(128Mbit(16MByte))FPGA:XC7A100T CPU:Microblaze第一种情况:Microblaze在简单的应用,比如运行LED,IIC,SPI,UART之类的低俗接口驱动,或做一些简单的辅助型工作时,一般生成的applicationelf文件都不大,在10几KB或者几十,百几KB,此时使用FPGA内部的BRAM资源已经足够。XC7A100T本身就有600几KB的BRAM资源。这种情况下直接将硬件流文件和elf文件合并为download.bit文件,在直接烧录到外部SPIFLAH即可。1.Xilinx--

  8. ruby-on-rails - Ruby/Rails 中 CIDR 的 IP 范围? - 2

    我想做两件事:将IP地址输入转换为CIDR以下是一些示例输入:1.1.1.1192.168.*.*#=>192.168.0-255.0-255192.168.1.2-201.1.1-10.1-100检查给定的IP地址是否属于任何CIDR。这一定是一个非常快速的查询,因为它是我的网络应用程序中非常常见的查找。我正在考虑做这样的事情:defmatches?(request)valid=@ips.select{|cidr|cidr.contains?(request.remote_ip)}!valid.empty?end我认为将IP范围转换为CIDR将使查找速度比我们现在所做的更快,后者将I

  9. ruby - 如何在 ruby​​ 中获取 ip 地址、referer 和用户代理? - 2

    我想记录用户的ip地址、referer和用户代理。在PHP中,我可以从以下变量中获取它们:$_SERVER['REMOTE_ADDR']$_SERVER['HTTP_REFERER']$_SERVER['HTTP_USER_AGENT']如何在ruby​​中获取它们? 最佳答案 PHP嵌入在网络服务器中。Ruby是一种通用语言:如果您需要Web服务器上下文,则必须自己安装。幸运的是,这很容易。最简单的入门方法之一是使用Sinatra。安装gem:geminstallsinatra然后创建myapp.rb:require'sinatr

  10. ruby-on-rails - 如何使用 Ruby/Tor 更改我的 IP 地址? - 2

    我正在使用Rails4.2.7,并且安装了几个Torgem。gem'tor'gem'tor_requests'gem'tor-privoxy'gem'net-telnet'我启动了我的Tor浏览器(在MacElCapitan上运行),我想定期(每20个请求)更改我的TORWeb请求的来源IP地址。所以我试了一下agent=TorPrivoxy::Agent.new'127.0.0.1','',{8118=>9151}do|agent|sleep1puts"NewIPis#{agent.ip}"end但是,这会导致以下错误。我很困惑我还需要如何配置才能完成上述工作。Errorduring

随机推荐