一、背景描述
二、时钟芯片初始化模块
三、时钟芯片控制切换模块
四、时钟芯片SPI驱动模块
五、调试技巧
一、背景描述
在项目中,以一款SPI接口的时钟芯片为例,通常启动的时候需要通过SPI接口对时钟芯片的寄存器进行初始化配置,从而实现一种默认工作模式的时钟频率输出。当系统设备运行起来后,若收发设备之间需要动态调整时钟芯片的输出频率,从而实现扫频功能,此时就需要软件通过SPI接口,FPGA完成底层时钟芯片的驱动,最终输出不同的时钟频率。
这个过程中需要FPGA实现两个功能,一是时钟芯片的初始化配置;二是支持软件通过一种通用接口实现底层SPI时钟芯片的驱动。
二、时钟芯片初始化模块
初始化功能,芯片的上电寄存器配置的功能。时钟芯片,一旦上电就会运行默认配置,为了配合业务,通常通过MCU或者FPGA实现芯片的初始化配置,从而输出业务所需要的时钟频率。对于zynq系列的fpga来说,可以借助于PS的spi驱动来实现初始化,当然也可以采用Verilog的方式进行初始化配置。此处笔者采用纯PL的开发模式来实现。
初始化需要储存一系列的寄存器数值,同时也要与底层SPI驱动进行握手交互,完成一组初始化数据的配置。常规操作,采用计数器的方式来实现一系列的寄存器数值写入底层时钟器件。
三、时钟芯片控制切换模块
控制切换模块,实现两种通路的选择,一是初始化配置数据,通过SPI接口驱动时钟芯片,从而完成初始化配置;二是axilite的数据通道,上位机通过通用接口实现SPI接口的二次映射,控制时钟芯片。思路提供给读者,可根据实际项目进行开发。
四、时钟芯片SPI驱动模块
SPI的驱动,四线制SPI和三线制SPI,这些取决于时钟芯片的手册要求,具体以手册为准,开发SPI的驱动,从而实现底层时钟芯片的控制。SPI驱动支持时钟频率修改,时钟极性和时钟相位的修改,以及数据有效字节的选择。由于代码在实际项目开发,故无法不提供。当然,设计思路清楚,笔者自行开发代码。
五、调试技巧
时钟调试技巧,尤其是针对于时钟芯片或者其他SPI的接口芯片,通常芯片都会有只读版本寄存器,可用于验证SPI的读控制是否成功,通过与手册比对版本号确认SPI的读时序无误。根据手册中的可读可写的寄存器,然后用于验证SPI的写入时序,通过对选中的寄存器进行写入指定数值,然后读取该寄存器的数值,比对一致则表明SPI的写入时序无误。最后搭建初始化验证的环境,测量输出的时钟频率是否符合业务设计要求。