当前位置:首页 期刊杂志

基于自动de-skew算法的高速SPI接口设计与实现

时间:2024-07-28

姜冬梅,何卫国,杨瑞瑞

(成都三零嘉微电子有限公司,四川 成都 610041)

0 引 言

传统的串仔外设接口(Serial peripheral Interface,SPI)接口传输速率较低,本设计通过采用多比特传输和双沿采样的方法来提高SPI传输带宽[1,2]。通常印刷电路板(Printed Circuit Board,PCB)布线时不同的数据线、时钟线无法做到等距离传输,接收端不同数据线、时钟线的延迟不同,该延迟差别为skew[3]。skew的引入导致接收端的数据有效采样窗口变小,时钟频率越高,skew对正确采样数据的影响越大。为了实现高速传输,采用自动de-skew 算法解决PCB布线引入的skew问题。此外,传统SPI通信中从接口不能暂停传输,而本文提出一种基于先进先出储存器(First Input First Output,FIFO)空、满状态的流量控制机制,通信的任意一方都可以随时暂停传输,待准备好之后继续通信[4]。

1 SPI控制器设计

1.1 SPI主控制器设计

SPI主接口模块框架如图1所示。

图1 SPI主接口模块框架

SPI主机根据软件配置的工作模式和数据长度发起对SPI从机的读写操作。当SPI主机发起写操作时,软件先配置模式寄存器为写模式,再配置数据长度,然后将命令和数据写到发送异步FIFO中。有限状态机(Finite State Machine,FSM)检测到发送异步FIFO非空时,启动SCLK生成电路,产生SCLK_out时钟,同时启动并串转化电路,从发送FIFO读出TX data,通过并串转化电路转换成TXD输出。状态机根据从机接收FIFO是否快满和主机发送FIFO是否为空来控制SCLK_out输出,当从机接收FIFO快满或主机发送FIFO为空时,停止SCLK_out时钟输出,从而暂停当前传输;当从机接收FIFO非满且主机发送FIFO非空状态时,继续传输。当SPI主机发起读操作时,软件先配置模式寄存器为读模式,再配置读数据长度,然后将命令和数据长度写到发送异步FIFO中。FSM状态机检测到发送异步FIFO非空时,启动SCLK生成电路,产生SCLK_out时钟,同时启动并串转化电路,从发送异步FIFO读出TX data,通过并串转化电路将命令和数据长度发送给从机。从机在接收到读命令后,由接收状态切换到发送状态。主机在完成命令发送后进入等待状态,等到从机完成状态切换后再由发送状态切换到接收状态。RXD和RXD valid经过de-skew模块后,进入串并转化模块,将RX data写入接收FIFO中。

AHB从接口模块完成AHB总线读写信号到内部信号的转换,可以通过该接口访问内部寄存器[5]。发送FIFO是一个异步FIFO,写端口工作在AHB时钟域,读端口工作在SSI clock时钟域。通过写发送数据寄存器可以将数据写入发送异步FIFO,并串转换模块从读端口将发送数据读出[6,7]。SCLK生成器产生SCLK_out时钟,本设计采用双数据速率(Double Date Rate,DDR)模式传输,因此SCLK_out时钟频率是数据传输频率的一半。当SCLK_in有效时,SCLK_out是SSI clock的2分频时钟;当SCLK_in无效时,SCLK_out保持低电平输出。

并串转换模块将32 bit的TX data 转换成8 bit的TXD。为了使从机接收数据建立和保持时间有SCLK_out时钟周期的余量,TXD采用SSI clock下降沿输出,如图2所示[8]。

图2 SPI主机TXD与SCLK_out相位关系

时钟de-skew电路由粗精度可调延迟电路和高精度可调延迟电路组成,粗精度可调延迟电路可以增大延迟范围,高精度可调延迟电路可以提高延迟精度。de-skew模块中,每条接收数据线(RXD[n])和RXD valid分别经过1条高精度可调延迟线后送入串并转化模块。RX en gate信号经过粗精度可调延迟电路后去门控SSI clock,得到门控时钟gate SSI clock,该门控时钟再通过高精度可调延迟线。串并转化电路完成接收信号的串并转化,并将其写入接收FIFO。

状态机模块负责数据收、发过程的流程控制。复位后状态机进入空闲状态,当检测到发送FIFO非空并且从机接收FIFO非满时,状态机进入Assert SS状态,在该状态ss_out_n信号生效,随后进入发送命令状态。若是写模式,在发送完命令后进入发送数据状态,在发送数据过程中若主机发送FIFO空或从机接收FIFO将满,则进入停止发送状态。在该状态下,SCLK_out时钟为低,直到发送条件恢复,回到数据发送状态完成数据发送。若是读模式,在发送完命令后进入等待状态,完成等待状态后进入接收状态,当主机接收FIFO将满时进入停止接收状态。在该状态下,SCLK_out时钟为低,直到接收条件恢复,回到数据接收状态。主机状态转移流程如图3所示。

图3 主机状态转移流程

1.2 SPI从控制器设计

SPI从机默认工作在接收模式,接收到命令字段后根据读写命令切换工作模式。当收到写命令,SPI从机继续工作在接收模式;当收到读命令,SPI从机切换到发送模式。SPI从机结构与主机类似,如图4所示。

图4 SPI从接口模块框架

状态机模块负责数据接收和发送的流程控制,为其他模块提供控制信号。状态机默认为detect状态,当收到写命令时进入接收数据状态,在该状态中完成数据接收。当数据传输完成后,状态机回到初始状态。从机收到读请求命令后进入等待状态,在该状态中完成接收模式到发送模式的切换,完成收发模式切换后进入发送数据状态。当发送FIFO为空时,进入发送停止状态,在停止状态TX valid信号无效;当发送FIFO非空时,回到发送状态,直到发送数据完成,回到初始状态。SPI从机状态转移流程如图5所示。

图5 SPI从机状态转移流程

2 自动de-skew算法设计

自动de-skew算法包含从机接收端de-skew和主机接收端de-skew。

2.1 从机接收端de-skew算法

从机接收端de-skew算法包含数据de-skew和时钟de-skew。数据de-skew完成RXD各比特位对齐,时钟de-skew使时钟的跳变沿对齐数据的中点位置。分别从主机算法和从机算法2个方面进行阐述。

2.1.1 主机算法

步骤一:调整SSI clock,使其处于低频模式。本设计中,SSI clock为50 MHz,数据传输周期为20 ns,从机接收端的建立保持时间均有10 ns的余量。在该频率下,对于skew不敏感,从机能正确接收数据。

步骤二:主机向从机发送训练序列0x00FF00FF00FF00FF,使得传输数据的每一比特都在不断进行0和1的跳变。

步骤三:等待10 μs,以便从机完成数据接收和延迟线的调整,再返回步骤二。重复步骤二、步骤三,直到完成从机接收端de-skew。

步骤四:将SSI clock调到正常工作频率。

2.1.2 从机算法

步骤一:通过逐步增大接收数据线RXD[n]的延迟线长度,寻找RXD[n]的下降沿,得到时钟上升沿与RXD[n]下降沿的间距,记为dn(n=0,1,2,…,7),如图6所示。

图6 RXD[n]下降沿与时钟上升沿间距

找出d0到d7的最小值并记为dmin,将dn与dmin的差值作为RXD[n]的延迟值。如果延迟线调到最大延迟值都无法找到数据的下降沿,则进入步骤二,否则进入步骤三。

步骤二:通过不断增大时钟的延迟长度寻找数据RXD[n]的上升沿,将SCLK_in上升沿和数据RXD[n]上升沿的间距记为Rn(n=0,1,2,…,7),如图7所示。

图7 RXD[n]上升沿和时钟上升沿的间距

找出R0到R7的最大值并记为dmax,将dmax与Rn的差值作为RXD[n]的延迟值。

步骤三:通过步骤一、步骤二完成数据之间的de-skew后,进行时钟de-skew。

若通过第一步完成数据de-skew,则逐步增大时钟延迟寻找数据的上升沿,将SCLK_in上升沿与数据RXD上升沿的间距记为L,如图8所示。

图8 RXD上升沿与时钟上升沿的间距

若通过第二步完成数据de-skew,则通过不断调整数据RXD延迟长度寻找数据的下升沿,将SCLK_in的上升沿与数据RXD的下降沿的间距记为P,如图9所示。

图9 RXD下降沿与时钟上升沿的间距

2.2 主机接收端de-skew算法

主机接收端de-skew算法包含数据de-skew和时钟de-skew过程,数据de-skew在低频传输模式下完成,时钟de-skew在高频传输模式下完成。

2.2.1 从机算法

当从机发送FIFO处于非满状态时,从机不断向发送FIFO写入训练序列0x00FF00FF00FF00FF,以便主机读回,完成de-skew训练。

2.2.2 主机算法

步骤一:调整SSI Clock,使其处于低频模式。本设计中SSI clock为50 MHz,数据传输周期为20 ns。

步骤二:通过逐步增大接收数据RXD[n]的延迟寻找RXD[n]的下降沿,得到时钟上升沿与RXD[n]下降沿的间距记为dn′(n=0,1,2,…,7)。通过逐步增大RX_valid的延迟寻找RX_valid的上升沿,得到时钟上升沿与RX_valid上升沿的间距记为d8′。找出d0′到d8′的最小值记为dmin′,将dn′与dmin′的差值作为RXD[n]的延迟值。如果步骤二中延迟线调到最大延迟值都无法找到数据的下降沿,则进入步骤三,否则进入步骤四。

步骤三:通过逐步增大时钟的延迟寻找数据RXD[n]的上升沿,将SCLK_in上升沿和数据RXD[n]上升沿的间距记为Rn′(n=0,1,2,…,7)。通过逐步增大时钟的延迟寻找RX_valid的下降沿,将SCLK_in上升沿和RX_valid下升沿的间距记为d8′。找出R0′到d8′的最大值记为dmax′,将dmax′与Rn′ 的差值作为RXD[n]的延迟值,将dmax′与d8′的差值作为RX_valid的延迟值

步骤四:调整SSI clock,使其处于正常工作频率。本设计中SSI clock为200 MHz,数据传输周期为5 ns。

步骤五:完成时钟de-skew,使得SSI clock上升沿对齐数据的中点位置。

de-skew后RXD与SSI clock的相位关系如图10、图11所示。

图10 主机接收数据延迟小于SSI clock周期

图11 主机接收数据延迟大于SSI clock周期

主机若不能正确读到训练序列,则说明接收数据的延迟大于时钟周期,即为图11情况。在该情况下,通过逐步增加时钟延迟,直到第1次能正确读到训练序列,将此时的时钟延迟记为Tstart。继续逐步增加时钟延迟,直到再一次读到错误的训练序列,将最后一次正确读到训练序列时的时钟延迟记为Tend。Tstart和Tend的均值即为时钟的延迟值。

2.3 自动de-skew算法性能分析

采用Synopsys的VCS仿真软件搭建仿真环境,分析de-skew算法的性能[9,10]。SSI clock的低频时钟频率为50 MHz,高频时钟频率为200 MHz,延迟线的最大延迟为15 ns。从机接收端de-skew仿真波形如图12所示,从机接收端de-skew前后对比如图13所示。

图12 从机接收端de-skew仿真波形

从图13中可以看出,接收数据由于传输延迟差别,有效数据窗口较小,无法正确采样数据。经过deskew算法处理后,接收数据有效窗口较大,且SCLK时钟的上升沿和下降沿对齐数据窗口的中间位置。

图13 从机接收端de-skew前后波形对比

主机接收端de-skew仿真波形如图14所示,主机接收端de-skew前后对比如图15所示。

图14 主机接收端de-skew仿真波形

图15 主机接收端de-skew前后波形对比

从图15中可以看出,接收数据由于传输延迟差别,有效数据窗口较小,无法正确采样数据。经过de-skew算法处理后,接收数据有效窗口较大,且SSI clock时钟的上升沿对齐数据窗口的中间位置。

3 结 论

本设计采用双沿采样来提高SPI的传输带宽,通过自动de-skew算法消除后端布局布线和PCB走线引入数据间的skew以及数据与时钟间的skew,降低后端设计和PCB设计的难度。此外,增加流量控制机制,根据FIFO的空、满状态,通信中的任意一方可以暂停数据传输。

免责声明

我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自各大过期杂志,内容仅供学习参考,不准确地方联系删除处理!