文献标识码: A
文章编号: 0258-7998(2015)06-0066-03
0 引言
在现代数据通信与传输领域,系统芯片(System-on-a-Chip,SoC)与不同外设间的数据交换越来越频繁,交换的数据量越来越大,而且不同外设采用的数据通信协议和接口形式也各不相同。SoC与外设间连接的要求越来越高,主要表现在:(1)高带宽,要求通信传输速度越来越高;(2)通用性,要求接口具有对多种标准通信协议有一定的广适性;(3)可再配置,要求通信系统具有用户根据实际需要进行二次配置的特性。
另一方面,外设接口往往采用一定的协议或标准,典型的有UART接口、IIC接口、SPI接口等。芯片实现时,通常将外设接口的逻辑功能固化在芯片内部,但由于芯片资源有限,不可能把所有的协议都集成在片上[1]。为了实现可编程的外设接口,传统的方法是利用通用输入输出(General Purpose Input/Output,GPIO),通过编程方式设置GPIO寄存器的高/低电平,从而控制数据的读写和时钟的生成。但是,GPIO模块采用CPU内核直接控制,模拟外设接口的读写过程会占用大量CPU运行周期,影响系统中其他任务的实现,所以一般只用于低速协议或接口的实现[2]。
本文针对SoC与外围设备多种接口的连接问题,设计了一种通用可编程接口IP核,实现了SoC与外围设备接口间的可编程特性,并以增强型8051内核为基础构建了仿真验证平台,验证了设计的正确性和有效性。
1 通用可编程接口IP的原理
通用可编程接口的工作方式采用主控方式,可通过配置CPU实现对外设接口读写波形的编程,从而完成外设接口的读写。
为了使数据在与外围设备交换过程中不需要CPU的控制,利用通用可编程接口的高速带宽设计了一套FIFO缓存架构,其工作机制使得数据以包的形式被提交到端点FIFO,而不是每次一个字节,并可设置多级缓存[3-4]。
通用可编程接口IP的本质是一个可编程状态机,用户通过编写波形描述符控制状态机。通用可编程接口可生成4个用户定义波形描述符,每个波形描述符最多可定义7个状态,这7个状态通常情况下用于批量读、批量写、单字读、单字写。
2 通用可编程接口IP核设计
2.1 通用可编程接口IP架构
通用可编程接口模块的内部结构如图1所示,主要由4个模块组成。
(1)端点控制模块
端点控制模块(CONTROL)产生控制信号(CTL)控制外部设备,CTL信号可通过编程组合使用,实现复杂的逻辑功能;接收外部准备信号(RDY)触发事件;接收/发送时钟信号(IFCLK);输出状态信号(STATE),显示状态机目前工作状态。时钟信号可选内部产生或外部输入,其他控制信号也可设置为高有效或低有效。
(2)端点缓存模块
端点缓存模块由4个相互重叠的FIFO端点缓存组成,存储与外设通信过程中接收/发送的数据。其读信号(RD)、写信号(WR)、输出使能信号(OE)及时钟信号(CLK)控制数据总线(FD[15:0])的读写,并输出空信号(EF)、满信号(FF)。
(3)波形存储器模块
波形存储器用于存储用户设计的波形描述符。通用可编程接口通过波形描述符控制数据的输入输出,最多可存储4个波形描述符,分别为WF0、WF1、WF3、WF4。
(4)地址生成模块
地址生成器(ADDR_GEN)用于输出地址总线(GPIFADR[8:0]),由控制模块控制。
2.2 波形描述符设计
波形描述符是通用可编程接口的核心,用于描述数据传输的时序。通用可编程接口可以存储4个波形描述符:(1)单字读:从外设中读取1字节/字的数据;(2)单字写:向外设中写入1字节/字的数据;(3)批量读:从外设中读取一个长数据流;(4)批量写,往外设中写入一个长数据流。这些描述符可以动态地配置给任何一个端点FIFO。配置后,通用可编程接口将依据波形描述符产生相应的控制逻辑和握手信号给外界接口,满足向FIFO读写数据的需要。
图2为一种批量写模式下的波形描述符状态转移图。批量写状态机共定义了5个状态,分别是IDLE、State1、State2、State3、State4,每个状态的意义描述如下。
(1)IDLE:当写事件发生,转移到State(1);
(2)State1:将SRAM写信号和使能信号置为有效(=0,=0),触发写事件,转移到State(2);
(3)State2:若外部SRAM模型的“满”标志为真(FF=1),则停留在State(2),否则转移到State(3);
(4)State3:通用可编程接口采样数据线,将内部端点FIFO数据写入外部SRAM模型,转移到State(4);
(5)State4:如有更多数据需要传输,则转移到State(2),否则转移到步骤(1)。
2.3 端点FIFO缓存设计
通用可编程接口内部包含4重端点FIFO缓存,对内部总线端来说,只要有1个FIFO为“半满”,就可以继续发送数据。当前操作的FIFO写“满”时,自动将其转换到外部接口端,排队等候读取;并将队列中下一个为“空”的FIFO转移到SoC内部总线接口上,供其继续写数据。图3为FIFO缓存架构的传输原理图,此时通用可编程接口内部总线接口执行OUT传输,FIFO端点被设置为512 B四重缓存。
3 仿真平台设计
为验证设计的接口IP核,构建了一个以8051 CPU为内核的SoC仿真平台,利用设计的接口IP核访问外部设备。为了充分利用通用可编程接口地址总线、数据总线及控制信号,外设采用SRAM芯片的Verilog模型,并加以改进,添加握手信号,使通用可编程接口能读取该信号并控制数据传输。通过设计波形描述符,SoC控制接口IP向外部存储器执行写/读操作,仿真平台对两次的数据进行比较并报告设计的正确性。
该仿真平台在Linux操作系统下开发,平台系统结构如图4所示。仿真器采用Synopsys公司的VCS仿真器。组成系统的各个模块可以按照需要加入仿真环境中,仿真结果由环境产生、检查并输出到指定目录结构下的文件中。
仿真平台包括Verilog编写的Testbench、SoC模型、外部程序存储器(EXT PROGRAM ROM)、SRAM Verilog模型。SRAM包括地址线(A8~A0)、数据线(I/O15~I/O0)、芯片使能()、输出使能()、写使能()、握手信号E_RDY(“1”表示SRAM未写入数据,“0”代表已写入数据)、F_RDY(“1”表示SRAM存满数据,“0”代表未满)。
仿真平台工作时,由Testbench产生时钟(CLK)和通用可编程接口IP时钟(IFCLK)。
4 仿真结果分析
通用可编程接口单字节写的仿真结果如图5所示,其中IFCLK为内部48 MHz时钟,数据宽度为8 bit。当CTL3()拉低时,外部SRAM有效;当CTL5 ()有效,且RDY1(F_RDY)为低时,数据(5A)被放入数据总线,并经数据总线写入外部SRAM。状态总线STATE(PE[2:0])显示通用可编程接口引擎在每一操作期间循环经过的状态。
通用可编程接口单字读模式与单字写模式类似,仿真结果如图6所示。
图7为通用可编程接口批量写传输的仿真结果,数据宽度为16 bit。当、被拉低,且F_RDY为低时,接口开始执行批量写程序,从内部的FIFO缓存向外部SRAM写入512 B(00-FF,FF-00)。
通用可编程接口批量读传输的仿真结果与批量写类似,仿真结果如图8所示。
由上述仿真波形可看出,通用可编程接口读写数据时,时钟周期为20.8 ns,数据总线宽度为16 bit,对应数据传输速率为96 Mb/s。相比之下,UART的传输速率为1.5 Mb/s,IIC总线为400 Kb/s~3.4 Mb/s,SPI总线为18 Mb/s,GPIO总线的传输速率最高为50 Mb/s[5]。可见,通用可编程接口的传输速率最快,更适合当前大容量存储器之间的数据传输要求。
5 结束语
本方案实现了通用可编程接口与外围设备接口连接的可配性,并通过设计验证了该方案的可行性与准确性。在数据传输过程中,通用可编程接口无需CPU的干预,只需对其进行正确设置就可以正常工作。通用可编程接口的强大功能使其不仅可以与外部SRAM连接,还可以与更复杂的接口(例如ATA接口)实现无缝连接,加快了产品的开发速度,降低了开发成本和提高了产品的可靠性。
参考文献
[1] 王占领,张登福,李云杰,等.便携式ARINC429总线通信接口的设计与实现[J].微电子学与计算机,2013,30(7):133-136.
[2] HASAMNIS M A,LIMAYE S S.Custom hardware interface using NIOS II processor through GPIO[C].The 7th Conference on Industrial Electronics and Applications(ICIEA′12).Singapore,2012:1381-1385.
[3] 刘志华,郭付才,彭新伟,等.基于CY7C68013A的FPGA配置和通信接口设计[J].电子技术应用,2013,39(2):18-21.
[4] 赵林,孟令军,于磊,等.基于CY7C68013A的USB2.0高速接口设计[J].电子技术应用,2014,40(1):131-133.
[5] STMicroelectronics.RM0008 Reference manual[EB/OL].http://www.st.com/,2014.