3
振动台控制器架构设计与实现
如前所述,
Zynq-7000
本身已经具有了独特的架构优势,得益于
Zynq
的
ARM+FPGA
架构,可以将控制器的核心功能分为软硬件两部分去开发,软硬件
协同完成对振动台的控制。对实时性和计算性能要求较高的采样、计算、控制等
部分交给硬件逻辑(
PL
)完成,而对实时性要求不高的通信等部分交给软件(
PS
)
完成(注意“实时”和“高速”的区别,通信可能需要高速,但不一定有采样和
控制那么高的实时性要求)。以此为基础,本章设计了
Zynq
振动台控制器的程序
架构。
3.1.2 PL-PS
数据传输
在得到了经信号调理的实际信号后,需要将它上传到上位机,同时为了方便
对比,参考信号也需要与实际信号同时传给上位机,这就需要完成从
PL
到
PS
的
数据传输。本文采用的方案是:先将数据存入
Block RAM
,然后
PS
通过
AXI
总
线进行乒乓读取操作,最后再发送给上位机。
PL-PS
数据传输架构如图
3.2
所示。
这里需要编写
Verilog
逻辑以实现对
Block RAM
的控制信号(详见关键模块的具
体实现)。
其中的乒乓操作指的是:使用两块存储空间,当
A
空间写入指定数量(比如
1000
个)的数据时,通知
PS
端,
PS
触发中断,
PS
开始读取
A
空间的数据,此
时
PL
已经开始向
B
空间继续写入数据。以此类推,两块空间交替读写,互不干
扰而又连续运作,可以保证波形数据的永续传输。
PL
端整体的实际设计效果如图
3.3
所示。
3.2 PL
端关键模块的具体实现
在前一小节中,
PL
基本控制回路及寄存器组、
PL-PS
数据传输两部分均涉
及到了
PL
端即
FPGA
部分的设计,其中的一些模块如
AXI Interconnect
可以由
VIVADO
工具生成,其余大部分模块需要自己编写
Verilog
逻辑来实现。本小节
就介绍
PL
端这些关键模块的设计,包括与数据采集相关的
SSI
驱动模块和
ADC
驱动模块,与数据处理相关的滑动平均滤波模块,与数据调度相关的
BRAM
读
写模块,与软硬件协同设计相关的参数分发同步模块,与输出相关的
DAC
驱动
模块。
本设计中
Zynq PL
端的时钟频率为
100MHz
,每
1ms
完成一次控制,即每
1ms
更新一次控制算法的计算结果,并将
DAC
的输出电压更新一次。
3.2.1 SSI
驱动模块
如果来自模拟输入的反馈噪音会持续地带来一些不良影响,那么带有高精度
串行接口如
SSI
(
Synchronous Serial Interface
,同步串行接口)的数字传感器是
一个行之有效的解决方案。
SSI
接口设计的本意,就是要最大限度地减少信号噪
音。
SSI
是高精度绝对编码器中比较常见的接口方式,它是一种全双工的串行接
口。在主机发出的时钟信号的控制下,从最高有效位(
MSB
,
Most Significant Bit
)
开始传输数据,属于主机主动式读出方式。
SSI
通信的帧格式如图
3.5
所示,共有
Clock+
、
Clock-
、
Data+
、
Data-
四根信
号,图中只展示
Clock+
和
Clock-
,数据传输采用同步方式,在空闲阶段时钟和数
据都维持高电平,此时不进行数据传输,在时钟的第一个下降沿开始载入数据,
然后每个时钟的上升沿编码器会从
MSB
到
LSB
依次送出数据,当传送完此次所
有的位数后,时钟和数据都再次置为高电平
[27]
。
为实现对
SSI
数据的读取,在
FPGA
中设计了
SSI
的驱动模块
SSI_driver
。
模块框图如图
3.6
所示。所用的磁致伸缩
SSI
位移传感器是
25
位二进制(
Binary
)
编码输出的。由于硬件电路中已经支持了差分信号与单端信号的转换,所以这里
只需要单端的
SSI_clk
信号和
SSI_data
信号即可
[28]
。
SSI_driver 模块的仿真结果如图 3.7 所示。
3.2.2 AD7606
驱动模块
AD7606
是
ADI
公司的一款
8
通道逐次逼近型同步采集模数转换器(
ADC
)。
每通道最快采样速度为
200KSPS
,每通道的位数为
16
位
[29]
。
AD7606
具有多种驱动时序。支持串行输出和并行输出,本设计中采用的是
并行输出,即
8
个
16
位的数据通过
16
根并行线依次输出。支持转换期间读取和
转换后读取,本设计采用转换后读取的方式。支持独立的
CS
和
RD
脉冲或相连
的
CS
和
RD
脉冲,本设计采用
CS
和
RD
相连的方式。
在设计
ADC
的驱动时,有一些关键时间务必要满足时序要求。几个重要的
时序特征与时序要求如表
3.2
所示。
为实现对
ADC
数据的读取,在
FPGA
中设计了
AD7606
的驱动模块
AD7606_driver
。模块框图如下图所示。
状态转换图如图
3.10
所示。选用最高的采样率
200k
,所以一个循环为
5us
。
其中检测
busy
下降沿需要打拍操作。
AD7606_driver
模块的仿真结果如下图所示,经过反复修改调试,使其关键
信号符合数据手册中的时序要求。
3.2.4 DAC81416
驱动模块
DAC81416
是
Texas Instruments
(
TI
,德州仪器)的一款
16
通道
16
位数模
转换器(
DAC
),可以通过
SPI
串行接口(最高支持
50MHz
)对其内部一系列寄
存器进行配置
[30]
。支持读操作和写操作,本设计中只用到了
SPI
串行写操作,写
操作的时序图如图
3.14
所示。
在
DAC81416
上电之后、正式开始工作之前,需要进行初始化配置,本设计
中配置的寄存器如表
3.3
所示.
为实现对
DAC
的配置,使其能正确地初始化,并在正式开始工作后能够输
出正确的电压,在
FPGA
中设计了
DAC81416
的驱动模块
DAC81416_driver
。模
块框图如图
3.15
所示。其由两个子模块连接而成,子模块如图
3.16
。
DAC81416_cmd_gen
子模块的工作流程如图
3.17
所示。分为两个阶段:初
始化阶段和正常工作阶段。当接收到来自
PS
端的
start_init_dac
信号时,进入初
始化阶段,对表
3.3
所示的几个寄存器进行配置,并用
init_done_flag
信号指示初
始化的完成与否,当初始化完成后并接收到来自
PS
端的
start
信号时,才会进入
正常工作阶段。正常工作阶段是以主控状态机(控制周期为
1ms
)的
10
个状态
(每个状态
0.1ms
)为基础的,只在
A8
和
A9
状态对
DAC81416
进行配置。
DAC81416_spi
子模块的作用是将并行的
dac_cmd
转化为
SPI
串行信号。值
得注意的是,
DAC
是在
SCLK
的下降沿采集
SDI
数据的,所以
FPGA
在发送
SDI
时最好对齐
SCLK
的上升沿,这样保证
DAC
可以采到稳定的
SDI
数据。
DAC81416_driver
模块的仿真结果如下图所示。
信迈提供ZYNQ+AD7606解决方案。