【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 通道会告诉上游模块,不能再接收数据了。

数据格式

数据映射

相关推荐
lifallen1 分钟前
Flink task、Operator 和 UDF 之间的关系
java·大数据·flink
南工孙冬梅5 分钟前
RT-Thread Studio SDK管理器安装资源包失败
开发语言·笔记
ifanatic11 分钟前
[每周一更]-(第144期):Go 定时任务的使用:从基础到进阶
开发语言·后端·golang
面朝大海,春不暖,花不开14 分钟前
Spring Data MongoDB 技术指南
java·mongodb·spring
果粒多34 分钟前
JVM 参数调优核心原则与常用参数
java·开发语言·jvm
C++ 老炮儿的技术栈35 分钟前
visual studio 2022更改主题为深色
c语言·开发语言·c++·ide·windows·git·visual studio
java龙王*38 分钟前
python爬虫简便框架,附带百度操作完整案例
开发语言·爬虫·python
安全系统学习1 小时前
网络安全之内核初级对抗技术分析
开发语言·python·算法·安全·web安全
南棱笑笑生1 小时前
20250614在Ubuntu20.04.6下分步骤编译Rockchip的RK3576原厂SDK
java·开发语言·git
源码宝2 小时前
智慧工地云平台源码,基于微服务架构+Java+Spring Cloud +UniApp +MySql
java·大数据·源码·智慧工地·智能监测·智能施工