目录
本文针对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,首先将端口信号分组观察,可以看到:
- 输入数据有两个通道,cartesian通道对应数据A,phase通道对应数据B。
- 输出数据只有一个通道,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 通道会告诉上游模块,不能再接收数据了。
数据格式

数据映射
