前言
AD9361是一个集成度很高的通信芯片,使用这个芯片能够方便快速地完成通信相关的设计。下图是ad936x的整体的结构框图,整体上看,可以将ad9363分为数字端接口和模拟端接口,还有内部的本振和滤波器。
在数字接口部分,有用于数据收发的接口,P0和P1。这两个接口可以根据需要设置为不同的模式,分别为 cmos 接口和 lvds 接口。
此外在数字接口还有用于控制ad9363的信号,例如spi接口和一些其他的控制信号 txnrx, enable, en_age 等等。
在模拟端口,主要是主要包括和天线连接进行数据收发的接口。从结构框图中可以看到,接收和发送都含有两个通道,这样ad9363就能够组成多天线的应用完成 1r1t 或者 2r2t 的应用模式。
对于接收通道,每个通道又对应着3个可选的接口,这三个接口的性能有所不同。一般来说A接口的性能是最好的。在实际的使用中,可以根据频率范围的不同,动态地调节选择所需要的端口。对于发送部分也是同样的到理。
下图是FreeSRP的射频接收和发送部分的原理图,可以看到,对用于不同的频率,是可以选择使用射频开关来选择具体使用那个接口的。(FreeSRP采用的ad9364,国外的天才少年的一个开源项目)
数字接口
从整体的结构上看,AD9363和BBP之间的数字接口有以下信号。我仅对当前熟悉的信号进行记录,毕竟使用这个芯片也还不是特别熟练。由于手上有的是一块pluto-sdr
(ADI 官方的学习板子,比较便宜,但是相当做FPGA开发板用需要自己去折腾一下)
ad936x支持两种接口,CMOS 接口和 LVDS 接口,由于plutosdr上采用的是CMOS接口,所以,我目前也仅采用CMOS接口。
1.1 数字接口信号(CMOS mode)
1.1.1 数字接口
在CMOS模式下,数据是并行的12位。P0和P1都有这样的12位的接口,这些接口都可以配置成只接收,只发送或者双向的。
1.1.2 DATA_CLK
DATA_CLK 是接收通路上的时钟,DATA_CLK由AD9363提供,输出到BBP。DATA_CLK 提供了一个源同步的时序,DATA_CLK可以是DDR或者SDR的,取决于用户的配置。
1.1.3 FB_CLK
FB_CLK是发送通路的时钟, FB_CLK是由BBP产生的,作用同DATA_CLK相似。
1.1.4 FRAME信号
FRAME信号可以分为RX_FRAME和TX_FRAME,我将其理解为用于标记IQ路数据的信号。在后面有时序图的情况下,一眼就能知道这两个信号的作用。
1.1.5TXNRX和ENABLE信号
这两个信号用于控制AD936x。在当前,我并没有太过关注这两个信号,因为控制是通过SPI接口来实现的。
1.1.6 CMOS接口的最大频率和带宽
如下图所示,展示了CMOS接口下的最大的频率和带宽。在CMOS接口下,速度相对来说较低,不能达到LVDS接口那样高得速率,但是CMOS接口在硬件设计上会更加简单。
1.2 时序分析
由于plutosdr
就是一个1R1T 得CMOS接口,因此目前没有必要分析过多的情况,只需把具体的这种情况分析OK就可以了。
1R1T CMOS 接口的结构如下:包括一个接收通路和一个发送通路。
1.2.1 1R1T CMOS接口的时序图
下面是1R1T CMOS接口的时序图,可以看到时序图还是十分简单的,数据和控制信号在时钟的上下边沿进行传输。当FRAME信号为高的时候,只是当前传递的数据是I路数据,当FRAME信号为低的时候传输的是Q路数据。在上升沿传输I路数据,在下降沿传输Q路数据。
接收通路在DATA_CLK的作用下进行数据的传输,发送通路在FB_CLK的作用下进行传输。
1.2.2 一些时序参数
一些时序参数还是很重要的,在实际设计的时候,还是需要考虑到的。比如在CMOS模式下,最小的时钟周期(最大的时钟频率)为16.276ns。也就60多M,这个速率比LVDS模式下的最大速率要低很多了。
2 FPGA设计
2.1 整体的结构
有了上面的时序图,就可以对接收时序进行设计了。整体的设计框图如下:
可以分为发送部分和接收部分,为了便于数据的采样,可以对输入的数据进行延时,通过使用这种方法达到最佳的采样时间。至于延时的值,是可以通过zynq的ps端进行配置的。
2.2 时序设计
2.2.1 接收时序
对于IDDR,需要注意模式的选择,在上面的时序图中选择的是SAME_EDGE_PIPELINED模式,从上面的时序图和下面的IDDR的时序图也可以看出来具体使用了哪一种模式。
2.2.2 发送时序
对于ODDR就相对于IDDR要简单一些了。
有了上面的时序设计,码代码就是很快的一件事情了。在上面的设计中和,需要使用到一些原语,包括IDDR,IDELAY,ODDR这些。
参考:
- ADI手册 UG1040
- Xilinx手册 UG471 (select IO)
- FreeSRP Github repo
- v3尤老师