【摘要】随着以IP核复用为基础的SoC设计技术的发展,SoC的规模不断扩大,片上各个模块之间的通信问题越来越突出。本文描述了一个可用于传感器网络核心芯片中的SPI接口模块的设计。该设计可灵活配置为主从机模式,同时配置主机时可以支持对基带控制器的操作;最后,通过详细的功能验证表明,该设计能满足SPI通信协议,性能可靠。
【关键词】基带;SPI;接口模块;IP
1.引言
随着以IP核复用为基础的SoC设计技术的发展以及对SoC设计越来越高的功能要求,SoC的规模不断扩大,集成的IP模块不断增多,使得片上各个模块之间的通信问题越来越突出,许多通信协议出现了[1]。然而,随着处理器需要的外设越来越多,这时串行总线相比于并行总线用的接口线数较少的优点就逐渐显现出来了。当我们需要在集成模块,比如微控制器和一些低速外设之间通信时,是没有必要用过于复杂的协议的[2];此时,SPI(Serial Peripheral Interface,串行外围设备)将是很好的选择。它具有电路结构简单(只有四根接口线),通信可靠等优点,比较适合在集成模块和片上外设以中低速传输数据的。实现SPI协议的IP核已经成为业界的设计热点之一[3-7]。本文中,我们将介绍一种可灵活配置为主从机模式,并在配置主机时可以支持对基带控制器的操作的SPI接口的设计。
2.SPI协议分析(SPI工作原理)
SPI有两种工作模式[8]:主模式和从模式;工作在主模式的为Master,工作在从模式的为Slave。SPI接口信号在两种工作模式下的作用是不一样的。
只有Master可以发起数据传输。可以通过对Master的数据寄存器执行写操作启动数据传输。数据传输过程中,串行时钟SCLK同步MOSI和MISO数据线的发送和采样。为了和外设进行数据交换,根据外设要求,其输出串行时钟极性(CPOL)和相位(CPHA)可以进行配置;当然,相连的Master和Slave的时钟极性和相位必须保持一致。其中,时钟相位(CPHA)能够配置用于选择两种不同的传输协议之一进行数据传输。其传输时序分别如图1和图2所示(以传输8bit数据为例)。
在具体应用中,要想完成一次操作,比如读基带控制器,一次需要传输多个比特的数据,包括读写命令、地址、数据等,具体内容与从设备有关。在读写基带寄存器时,在开始每次操作之前将来自APB总线的信号进行组帧。采用加一个头字节的方式,其中,bit[7]代表读写操作,bit[0]~bit[3]为读写地址,依次从MOSI串行输出。若为写操作,则后面紧接着将要写的数据。如写基带控制器的时序如下图3所示,此时CPOL=1’b0,CPHA=1’b0。
相应的Slave将采样Master的MOSI结果分别写入读写指示、地址线、输入数据对应的寄存器;并将寄存器中的数据置入发送移位寄存器通过其MISO输出。
3.SPI接口模块的设计
像很多IP模块的设计一样,我们采用先定义了关键特性和规范,明确设计目标;将目标分解为各个子模块分别实现并集成的自顶而下的方法,之后进行了全面地功能仿真。
3.1 接口模块顶层设计
由我们设计的SPI Controller是一个基于AMBA的APB总线的外设类接口模块,Master Host通过APB总线对模块进行操作;同时另一端通过SPI总线与外部设备相连。根据功能定义和SPI工作原理,可以得出SPI接口模块结构框图如图4所示。
SPI接口模块上除了四个中断信号外,还需要14个I/O端口,主要由APB总线信号和SPI总线信号组成。其中,APB信号是主从模式通用的,对于APB总线信号定义,详见参考文献[9]。对于SPI信号而言,为了满足SPI可配置不同工作模式的需要,在模块内部,需要设计比SPI协议要求更多的接口信号。其中,txd在主模式时,相当于MOSI,从模式时相当于MISO;rxd在主模式时相当于MOSI,从模式时相当于MISO。
3.2 主模式设计实现
本接口模块支持可编程的数据帧格式(数据宽度为4/8/16/32 bit),还支持可编程四种传输模式:读写基带寄存器,发送又接收,只发送,只接收。现将各个组成模块介绍如下:
APB Slave主要负责地址译码,实现接口模块与ARM的APB总线相连接。通过该模块,ARM可以对相应控制寄存器以及Data FIFO严格按照APB总线协议进行读写,从而实现对本模块和外设的控制。
寄存器模块(Registers)则包含各控制寄存器,状态寄存器。在模块使能(spe=1)后,模块才可以开始正常工作。分频逻辑用于在主机模式时通过一个逻辑分频变量实现对pclk信号的分频控制。该分频变量在内部减法计数器为零且SPI处于工作状态时有效(置1),且包含在状态机(FSM)控制逻辑和端口控制逻辑(Port Control Logic)中。
中断逻辑则用于实现中断控制,使ARM可以对SPI进行适当操作,比如读写Data FIFO。如图4所示,本模块可产生spi_txe_intr,spi_txo_intr,spi_rxf_intr,spi_rxo_intr四个独立可屏蔽中断。
Data FIFO用于缓存数据,有RxFIFO和TxFIFO两个FIFO,并且在每一个工作模式下,都相应有两个移位寄存器(Shift Registers)进行串并转换。除此之外,还设置了一个中间变量tx_loaddata。在每次数据传输之前,将tx_loaddata加载到移位寄存器中。tx_loaddata的值与数据传输模式有关。如表1所示。
FSM则控制了SPI模块的数据传输过程,从而完成对SPI传输时序的实现控制。该FSM只用于主模式。其状态转移图如图5所示。
我们采用了两个计数变量:da-
ta_num和phase_cnt来控制数据的传输。其中,data_num大致产生逻辑为:当为只接收模式时,data_num初始值由控制寄存器读入,否则每对Tx FIFO写一次,数目就加1;每传输一个数据后该数目减1。而phase_cnt则由FSM的状态和配置的数据帧宽度格式决定,只有phase_cnt为零时,FSM状态才转移。当处于Data和Head时,其关系如表2所示。其中,dfs为控制寄存器SPCR0中的数据位宽控制位。
当一整个数据传输结束时则按照传输模式决定是否将接收移位寄存器的数据写入RxFIFO或寄存器中。起始状态为Idle,当数据传输请求产生时,根据传输模式分别转入Head和Data(仅读写基带寄存器时进入Head)。Head在将数据帧头传输结束后进入Data。在处于Head或Data时,通过一个对pclk分频后的时钟的计数值phase_cnt进行发送和接收状态的转换:当为偶数时为发送状态,SCLK等于CPOL^CPHA;为奇数时为接收状态,SCLK等于!CPOL^CPHA;SS亦由FSM状态和phase_cnt值进行确定,以保证传输时序。必须考虑到scpha=1时,可连续进行数据传输而SS无须拉高,而scpha=0时,连续传输之间SS需要拉高的情况对两者在开始传输以及连续传输之间进行不同的处理。End和Start可以用于确定在初始传输之前的SS值。
3.3 从模式设计实现
当配置为从机时,FSM和分频部分不工作;它相应的传输控制逻辑包含在Port Control Logic中。它根据接收的SPI信号进行控制以完成数据的接收和发送。其余组成部分的功能与主机相似。
我们将SCLK_in转化成SCLK_s,以使得从SPI模块总是在SCLK_s的上升沿传送数据,下降沿采样数据。其换算逻辑为:
assign SCLK_s=(scpol^scpha)? SCLK_in:~SCLK_in;
在开始传输之前,若传输模式为只发送或即发送又接收,则应保证TxFIFO中不为空。我们设置了一个计数器counter对Sclk_in的上升沿进行计数。当计数到阈值cnt_threshold时则表明一个完整数据传输完成,根据需要决定是否写Rx和加载新的数据到Txshift_reg,之后计数器再归零;cnt_threshold的值由配置的数据帧宽度格式决定。
这样,从机在输入的SPI信号控制下,完成相应数据的传输工作。
4.SPI接口模块的仿真验证
为了保证设计的正确性,我们进行了详细的功能仿真。首先进行VCS进行RTL级仿真。RTL级仿真是将代码文件调入硬件描述语言的仿真软件进行功能仿真,检查逻辑功能是否正确。根据模块的功能,我们先分解出了详细的测试点,并通过搭建不同的测试平台输入不同的激励依次进行仿真。覆盖了包括SPI的主模式下读写基带寄存器模式,主从模式下其他各种传输模式下各种长度的数据帧的数据情形。其中,主模式SPI写基带控制器仿真波形如图6。
首先将SPI模块的SPCR0和SPBRR分别配置为32’h0x603c和16’h0x02,同时各进行一次读操作;之后写SPCR1,同时将启动一次数据传输操作。类似的,图7为主模式SPI发送又接收时的波形。
首先将两SPI模块相应的SPI接口信号连接起来,并进行一次复位,之后分别配置为主从模式。其中Master的SPCR0和SPBRR分别配置为32’h0602d和16’h0x02,Slave的SPCR0为32’h0402d。之后同时各进行一次读操作确认寄存器的值;再先后分别往从机和主机的SPDR1(TxFIFO)中写入数据32’h12345678和32’h55551432。同时将启动一次数据传输。传输完成后分别读主、从机的SPDR1(RxFIFO),得到从机传来的数据32’h12345678以及主机传来的32’h55551432。
由图6、7可知,SPI能正确完成对应的操作。
此外,通过将SPI接在基于APB总线的SoC系统中,该系统包含ARM内核,ROM,AHB,APB以及相连的Bridge,将系统代码修改并移植到FPGA中,完成了FPGA原型验证平台的搭建。通过在该验证平台运行C验证代码验证了其功能的正确性。
5.总结语
本文先比较了现有的接口协议,指出了SPI串行总线接口的优点,以及应用场合。在讨论了SPI接口协议的特点后,基于SPI的多方面应用,完成了一个SPI接口模块的设计,并通过了验证。其设计过程采用了典型的自顶向下方法。本设计可以灵活用于基于AMBA APB的典型SoC系统中。在IP核复用为基础的SoC快速发展的今天,对IP设计的研究具有普遍的实际意义。
参考文献
[1]田泽,张怡浩,于敦山,等.SoC片上总线综述[J].趋势与展望,2003.
[2]A.K,Oudjida,M.L,Berrandjia,A,Liacha,etc,Design and Test of General-Purpose SPI Master/Slave IPs on OPB Bus,International Muti-Conference on Systems,Signals and Devices,2010.
[3]赵杰.基于AMBA总线的SPI协议IP核的实现与验证[D].中国科技大学硕士学位论文,2009.
[4]李跃峰.基于Verilog HDL的SPI可复用IP核的设计与实现[D].西南交通大学硕士学位论文,2008.
[5]赵彧,张楚.多媒体处理器中SPI接口的设计[J].电子测量技术,2007,30(6):126-129.
[6]曹傧,王祥,程野,等.SPI控制器的ASIC设计与实现[J].数字通信,2010,2:94-96.
[7]喻小虎,咸德勇,陈华明.专用SPI从设备接口电路设计[J].微处理机,2009,5:28-30.
[8]Motorola,Inc,SPI Block Guide V04.01,2004.
[9]ARM.AMBATMSpecification(Rev 2.0),1999.
作者简介:
符宏利(1985—),男,湖南泸溪人,硕士研究生,主要研究方向:数字集成电路设计与验证。
田茜(1980—),女,江苏徐州人,博士,东南大学教师,研究方向:无线传感网。
吴金(1965—),男,四川乐山人,工学博士,教授,研究方向:数模混合集成电路设计。