基于SPI高速分时复用/解复用的方法实现数据传输及其FPGA实现
2021-07-22吴必旗李娟娟王兴波
李 淼 吴必旗 李娟娟 王兴波
南京熊猫汉达科技有限公司
0 引言
随着卫星通信系统规模扩大、复杂程度加深,两个或多个芯片的集成在逻辑设计中的应用也越来越多。在芯片之间,数据的互相传递是经常会遇到的问题。两个不同的芯片之间会存在硬件电路的开销有限,为了使数据能够成功、可靠传输,本文在设计FPGA接口时,选择了同步串行接口(Serial Peripheral Inter face,SPI)的高速分时复用/解复用的方式。
1 FPGA实现
与I2C、UART、HDLC等总线接口相比,SPI有全双工模式、电路结构简单、速度快、通信可靠等优点,在集成电路飞速发展的近几年应用非常广泛。利用SPI接口具有硬件开销小的特点,本文设计了一种基于SPI接口高速复用模块的方法,此外,采用XILINX公司的Kintex-7系列开发芯片,实现了电路的硬件验证。在应用于通信系统时,设计过程中很多变量(如:变量1,变量2,变量3等)都采用参数形式,在应用于具体的工程实践中,可以根据实际需要更改参数。FPGA的SPI高速分时复用/解复用实现流程如图1所示,由复用模块、解复用模块、保密机共3个功能模块组成。
图1 FPGA实现流程
复用模块和解复用模块的FPGA设计思路:(1)复用模块,主要功能是通过提速实现数据的分时复用。首先,在复用模块(即FPGA 1)中用主时钟分频的业务速率钟对4路(可变参数1)SPI总线数据,分别采用两个异步fifo进行32 bit(可变参数2)的乒乓缓存,使数据的速率提升至10 MB级别;其次,在每小包前加上8 bit(可变参数3)的接口协议,包括业务类型及包序号,进行4∶1复用。复用输出的1路SPI总线数据以快时钟下降沿输出。(2)解复用模块,主要功能是通过降速还原4路SPI数据。首先,在解复用模块(即FPGA 2)中将快时钟同步至主时钟,并用快时钟上升沿对SPI总线数据进行采样;其次,采用异步双口ram读写进行1∶4解复用,使数据的速率下降到原来的业务速率,从而保证了bit流不会断。解复用将模块FPGA 1中输出的1路SPI总线数据还原成4路SPI总线数据,并将其送入保密机进行加解密。
需要说明的是,快时钟的周期T是主时钟的整数倍,为了保证主时钟能够进行可靠的采样,本文推荐快时钟的周期至少大于6个主时钟周期。
2 实验结果与验证
利用该设计方法在XILINX FPGA器件上实现两个Kintex-7芯片之间的SPI总线数据传输,如图2所示,其中,图2(a)展示了一组利用复用方法实现SPI总线数据高速传输过程的仿真波形图,4路数据同一时刻发送,传输的数据为7 bit固定数“1110100”,方便观察。
(1)复用模块先用主时钟分频的时钟上升沿脉冲clken1、clken2、clken3、clken4分别对4路待发送数据din1、din2、din3、din4进行32 bit的循环计数,并做乒乓缓存,最终实现4∶1高速复用输出。图2中的cout、eout、dout为复用的输出SPI总线,前8 bit为接口协议。图2(b)展示了放大后的时序图,可观察到使能和数据与输出时钟下降沿对齐。
图2 FPGA实例利用复用实现数据传输过程仿真波形图
(2)复用模块中的关键技术难点在于异步fifo需要同时读数时优先级的选择,需要用状态机进行读请求的轮询,实现SPI接口的分时复用。仿真得到的波形如图3所示。仿真代码是通过三段式状态机来实现的,当前状态(current_state)包括4种循环状态:idle = 3'b000,wait = 3'b001,read1 = 3'b011,read2 = 3'b100,其中,idle为初始态,wait等待是对fifo的读请求进行轮询。首先,将8个fifo的读请求从低到高分别存入8位寄存器ok_reg中;其次,轮询方式为flag循环计数,计数器的计数范围为0~8,当ok_reg[flag]=1时,响应读请求,状态跳变至读取状态read1,加上8 bit接口协议,完成后跳变至fifo读取状态read2,对应fifo的读使能拉高,读至fifo为空,并在状态机外清空对应的ok_reg[flag]。上述状态完成后,再次进入初始态idle,开始第二次轮询。FPGA状态机实现过程仿真波形图如图3所示。
(3)进入解复用模块后,先将SPI接口总线同步到模块FPGA 2的主时钟中;然后,将cin上升沿采样输入的SPI数据,并用异步双口ram进行1∶4解复用,从1路SPI数据中还原出4路解复用后的数据SPI1、SPI2、SPI3和SPI4;最后,经下降沿对齐后送入保密机。
为了展示该方法的实用性,本文还对编写好的程序经JTAG端口下载到FPGA开发板上进行实验验证,并利用调制解调进行中频自环,CPU通过hdlc接口与FPGA接口进行数据交互,实验结果显示中频自环无丢包、无误码。
3 结束语
从仿真数据和实验结果可以看出,本文提出的SPI接口复用、解复用实现数据传输的方法不仅适用于芯片之间的传输,也适用于跨板子之间的数据传输,且延时小、操作简单。此外,本方法在无丢包、无误码的前提下还可以有效节省硬件线路的开销(如实例:在模块FPGA 1中节省了3路SPI总线数据),从而大大提高了数据传输效率,具有较强的可操作性和应用价值。