【FPGA开发】Cordic原理推导、Xilinx PG105手册解读

目录

本文针对Cordic算法本身,以及Xilinx官方CORDIC IP做学习记录,如有纰漏,欢迎指正!

Cordic原理推导

PG105手册解读

IP核总览

输入输出格式,内部硬件结构,Cordic算法能配置的信息基本上都引出来了,方便用户配置。

核心计算功能总览

基本握手信号

该IP核的数据接口为 AXI-Stream 协议格式,熟悉AXI的朋友不会对下图3-1感到陌生。

tvalid有主机控制,其指示 tdata、tuser、tlast 等负载信号是有效的。

tready 由从机控制,其指示从机准备好接收数据了。

tvalid 和 tready 两者的控制是独立的。

只有当他们同时 assert 时,传输才会发生。

非阻塞模式 NonBlocking Mode

Codric IP核支持非阻塞模式的数据输入,其目的是方便用户把自己的非AXI协议模块放在上游,与Cordic IP级联。

下面的一句话详细的说明了NonBlocking的含义,初读可能不会有很深的体会:一个通道的数据缺失,不会导致另一个通道的输入数据缓存,这里存疑,后面写到波形图分析时,理解会清晰很多。

NBlock模式是不存在""背压""的,也就是tready信号不起作用,也可认为其保持assert。

这样一来,模块就不需要处理tready的信息,内部的逻辑就会简单,和用户自己的模块继级联时,也很方便。

下面开始分析NBlock模式的波形图

分析图3-2,首先将端口信号分组观察,可以看到:

  1. 输入数据有两个通道,cartesian通道对应数据A,phase通道对应数据B。
  2. 输出数据只有一个通道,dout,输出通道同时依赖两个输入通道A、B。

!特别注意!:这里Xilinx为了简化理解,把核心的计算延时假想成了0,相当于纯逻辑电路,输入立马有输出(原话如下)。


第1次传输分析-B通道握手失败情形:

  • A通道握手成功,数据为A1
  • B通道tvalid为低,握手失败,且数据为无效数据
  • 此时dout通道,tdata无效,tvalid无效
  • 解释:必须A、B通道同时握手成功,才能驱动数据

第2次传输分析-双通道握手成功,数据有效情形:

  • A通道握手成功,数据为A2。
  • B通道握手成功,数据为B1。
  • 此时dout通道,tdata(A2,B1),tvalid有效。
  • 解释:A、B通道同时握手成功,可以输出数据,但是由于当前的工作模式为NBlock,所以A通道上一次输入的A1并未因为B通道握手失败而得到缓存,A1就算是丢了,这里配合B1输出的,只能是A2。

第3次传输分析-A通道握手失败情形:

  • A通道握手失败,且数据为无效。
  • B通道握手成功,数据为B2。
  • 此时dout通道,tdata无效,tvalid无效。
  • 解释:必须A、B通道同时握手成功,才能驱动数据(和第1次传输类似!)。

第4次传输分析-双通道握手成功,数据无效情形:

  • A通道握手成功,数据为A3。
  • B通道握手成功,但数据为无效。
  • 此时dout通道,tdata无效,tvalid有效。
  • 解释:尽管都双通道都握手成功,但是由于输入数据无效,导致输出数据无效。

第5次传输分析-双通道握手成功,数据有效情形:

  • A通道握手成功,数据为A4。
  • B通道握手成功,数据为B3。
  • 此时dout通道,tdata(A4,B3),tvalid有效。
  • 解释:A、B通道同时握手成功,可以输出数据,但是由于当前的工作模式为NBlock,A3、B2等都已经丢失了,只能输出A4和B3。

至此,NBlock的波形分析已经完毕,是否对下图提到的这段话有新的体会?

总结起来:一个握手成功,一个握手失败时,握手失败的数据不会得到保留。且握手失败一定是输入的valid或data引起的,ready信号不起作用,认为其始终assert!

阻塞模式 Block Mode

阻塞模式就是正常AXI的模式,tready信号有背压,在阻塞模式下,模块的 Latency 概念意义不大,因为输出的数据不光有内部计算逻辑造成延时,也会被ready信号影响。

闲言少叙,有了前面NBlock的基础,这里直接分析波形图。


第1段传输分析:

  • A通道连续握手成功3个clk,A1、A2、A3数据都有效
  • B通道在A1有效时刻握手失败,在A2有效时刻握手成功B1,在A3有效时刻握手失败
  • A、B两通道共同有效的时刻对应(A2,B1)
  • 输出dout通道在(A2,B1)时刻输出了(A1,B1)
  • 解释:Block模式下,输入数据有缓冲区,A1虽然独自握手成功,但是不会被丢弃,而是会等待B,像FIFO一样,队列一样出来。

第2段传输分析:

  • A通道握手成功A4,此时A通道已经堆积了A2~A4。
  • B通道握手成功B2,此时B通道无堆积数据。
  • 输出dout通道输出了(A2,B2)
  • 解释:于B通道数据少,来了就能输出;A通道数据多,就堆积住了,但是会以队列的方式依次伴随B输出。

第3段传输分析:

  • A通道握手成功A5,此时A通道已经堆积了A3~A5。
  • B通道握手成功B3。
  • 输出dout通道的ready无效,tvalid有效,tdate无效。
  • 解释:该周期内tdata无效的原因在于tready为低,所以B3也缓存了,等到tready拉高时,直接就输出了(A3,B3)。

至此,Blcok模式的波形图分析完了。

在Block模式下,不光输出有缓冲,输入也有缓冲。

对于输出缓冲的理解:

模块会一直计算并输出,直到下游的信号把ready拉低,拉低之后,模块仍会计算(tvalid有效),但是停止输出(tdata无效),转而在内部buffer中缓存。

如果长时间ready信号都没有再次拉高,缓存buffer肯定会被存满,此时核心会停止计算,保证已经算好的结果数据一个也不被覆盖
对于输入缓冲的理解:

比如两个输入通道,通道A接收握手的数据,通道 B 没握手成功。

此时,A 通道的数据不会被计算或丢弃,只会被缓存到输入缓冲区。

如果 B 很快也握手成功进了数据,那么 A 已经存储的数据就可以和B的数据一起输入进核心计算,A 的 buffer 也就释放了。

但如果 B 迟迟没有握手数据进来,那么 A 的 buffer 会被填满,此时, A 通道会告诉上游模块,不能再接收数据了。

数据格式

数据映射

相关推荐
J2虾虾14 小时前
C 语言 void 完全用法
c语言·开发语言
码语智行14 小时前
地图上图、空间拓扑查询示例
java·arcgis
会Tk矩阵群控的小木14 小时前
基于Python的iMessage短信群发与社媒多账号统一管理系统实现
开发语言·windows·python·新媒体运营·开源软件·个人开发
程序员黑豆14 小时前
AI全栈开发 - Java:变量
java·前端·ai编程
我是一颗柠檬14 小时前
【Java项目技术亮点】分库分表+数据路由策略:单表5000万后的架构升级方案
java·开发语言·分布式·架构
wu_ye_m14 小时前
学习c语言第35天 函数声明和定义
c语言·开发语言·学习
布朗克16814 小时前
25 IO流高级操作——序列化、NIO与Files工具类
java·数据库·io·nio
njsgcs14 小时前
c# solidworks 创建装配体工程图+bom
开发语言·c#·solidworks
小研说技术14 小时前
Spring AI实现rag流程(简易版)
java·后端
亓才孓14 小时前
【本地项目引用外部库的类,想修改字段遇到的请缓存的问题】
java·maven