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

数据格式

数据映射

相关推荐
郝YH是人间理想21 分钟前
Python面向对象
开发语言·python·面向对象
大刀爱敲代码1 小时前
基础算法01——二分查找(Binary Search)
java·算法
大土豆的bug记录2 小时前
鸿蒙进行视频上传,使用 request.uploadFile方法
开发语言·前端·华为·arkts·鸿蒙·arkui
追风少年1553 小时前
常见中间件漏洞之一 ----【Tomcat】
java·中间件·tomcat
yang_love10114 小时前
Spring Boot 中的 @ConditionalOnBean 注解详解
java·spring boot·后端
hhw1991124 小时前
c#知识点补充3
开发语言·c#
Antonio9154 小时前
【Q&A】观察者模式在QT有哪些应用?
开发语言·qt·观察者模式
Pandaconda4 小时前
【后端开发面试题】每日 3 题(二十)
开发语言·分布式·后端·面试·消息队列·熔断·服务限流
郑州吴彦祖7724 小时前
【Java】UDP网络编程:无连接通信到Socket实战
java·网络·udp
mqwguardain5 小时前
python常见反爬思路详解
开发语言·python