一种SI串口模块的FGA实现

时间:2022-06-12 05:31:33

【摘要】主要介绍了一种在FPGA中实现SPI总线通信串口模块的方法,并给出了设计方案、仿真结果以及硬件测试结果。本设计可以广泛应用于常规处理控制器件(单片机、DSP等)同外部外设及其它处理器之间进行SPI数据通信的系统中,特别是需要快速构建数据通信系统的应用环境,在通信、消费电子及工业控制等诸多领域有广阔的应用前景。

【关键词】SPI接口;VHDL;FPGA

1.引言

串行外设接口(SPI)是一个高速同步的串行输入/输出口。SPI通常用于处理器和外部外设以及其它处理器之间进行通信。很多新型器件如LCD模块、FLASH、ADC、EEPROM存储器以及时钟芯片等都采用了SPI接口。但在实际开发应用中,若主控制器无SPI接口或需要与多个具有SPI接口的外设通信,就要使用主控制器的I/O口通过软件来模拟,这在很大程度上限制了其应用给数据传输带来不便。所以采用硬件来实现SPI接口扩充的方法最为可行。

当前,基于主从处理器结构的系统架构已经成为一种主流(如DSP+FPGA,MCU+ FPGA等)。FPGA优点主要在于它有很强的灵活性,即其内部的具体逻辑功能可以根据需要配置,对电路的修改和维护很方便。传统SPI接口的FPGA实现往往采用厂家提供的IP核实现,这种方法虽能基本满足SPI通信要求,但设计不够灵活,不利于功能扩展。基于此,提出一种新的基于FPGA的SPI串口模块实现方法。

2.SPI总线接口及时序

SPI串行接口运用4条线可与多种标准中心器件间接接口:串行时钟线SPICLK,主机输出/从机输入数据线SPISIMO,主机输入/从机输出数据线SPISOMI和低电平有效的从机选通信号线SPI_CS。

SPICLK为主机时钟线,是从机的一个输入,为SPISOMI数据的发送和接收提供同步时钟信号。时钟的相位(CPHA)与极性(CPOL)可以用来控制数据的传输。CPOL=“0”表示SCLK的静止状态为低电平,CPOL=“1”则表示SCLK的静止状态为高电平。时钟相位(CPHA)可以用来选择两种不同的数据传输模式。如果CPHA=“0”,数据在信号SPI_CS声明后的第一个SCLK边沿有效。而当CPHA=“1”时,数据在信号SPI_CS声明后的第二个SCLK边沿才有效。因此,主机与从机中SPI设备的时钟相位和极性必须要一致才能进行通信。

SPI有两种工作模式:主模式和从模式。工作在主模式下,不管是发送还是接收数据,SPICLK为整个串行通信网络提供时钟。串行数据发送时,首先发送的是最高有效位(MSB),时钟信号的1次作用对应1位数据的发送(SPISIMO)和另1位数据的接收(SPISOMI)。工作在从模式下,不管是发送还是接收数据,一直必需在SPICLK信号作用下停止,并且SPI_CS信号必需有效。1个典型的SPI系统包括一个主MCU和1个或几个从器件。

SPI主模式的数据接收时序见图1。

SPI主模式的数据发送时序见图2。

3.FPGA设计方案

本设计按一个默认数据通信速率(10Mbps)、时钟模式(无相位延时的下降沿)、主/从工作方式(主SPI模式)进行SPI数据的收发。可通过外部处理控制器对本模块进行各种通信参数的动态配置,以适应不同的通信速率、时钟模式、工作方式、数据长度等情况。配置完毕后,即可开始SPI数据的收发过程。

本设计中增加了一根主/从SPI方的握手信号线SPI_STATUS,该信号线在从SPI方发送数据时被从方拉为低电平,而在从SPI方接收数据时被从方设置为高电平。

根据SPI总线的原理,本设计分为两大功能模块:数据接收及协议解析、数据发送处理。该SPI串口模块系统框图如图3所示。

在这些子模块中,数据接收FIFO和数据发送FIFO用来做接收、发送数据的FIFO。通信参数配置单元供处理控制器读写配置SPI的各种参数。对外并行接口单元负责与外部处理控制器进行数据交互。串行数据接收、命令解析及中断产生单元完成串行数据接收、通信命令解析及产生中断信号通知处理控制器进行数据接收操作。串行时钟产生及收发控制单元用来发生主模式下的时钟信号,同时对数据的接收或者发送进行功能切换。串行数据发送处理单元负责把并行进来的数据串行传出,完成对数据发送的处理。

(1)数据接收及协议解析

当从SPI方发送数据的时刻到来时,本设计检测到状态线SPI_STATUS为“低”,则串行时钟产生及收发控制单元立即启动接收逻辑,对外输出串行时钟SPICLK信号和选通信号SPI_CS,同时在SPICLK上升沿时刻进行数据采样,并将串行数据进行相应缓存。

每当采样数据构成一个完整字节时,由接收模块将收到的数据存入“数据接收FIFO”,同时对串口数据中的特殊字段进行协议解析。过程如下:先检索收全数据同步头字节“AAH AAH”后,对后面接收的完整字节进行+1计数处理,再检索收到串口数据总长度字节后,判断已收到的字节总数是否达到串口数据总长度值。如果达到接收数据总长度值,则表示一帧数据命令接收完整,此处由接收模块置出“命令数据接收完整”标志;同时,当检测到状态线SPI_STATUS的上升沿到来,给出数据接收完毕中断标志信号int_rxd及时中断处理控制器,通知外部控制器读取数据进行处理,而不必每接收到1个字节就中断一次,避免了主程序被频繁中断。

目前,本设计的接收FIFO和发送FIFO深度均设定为2048字节,可以缓存大量的通信数据,而不会将先前收到的数据覆盖,外部处理控制器可以在处理完其它紧要任务后,再来进行SPI数据的读取和后续处理,而不必担心已接收的SPI数据会丢掉。

接收数据的流程图如图4所示。

(2)数据发送处理

当需要发送SPI数据时,外部处理控制器将需要发送的所有数据依次写入本设计的“数据发送FIFO”中,再对本设计另一个地址单元写入“启动发送命令”后,即可启动数据发送模块发送数据。该模块实时判定数据发送FIFO是否为空,若FIFO内有数据则立即对外输出串行时钟SPICLK信号和选通信号SPI_CS,并在SPICLK的下降沿时刻对取出的数据进行发送,首先发送的是最高有效位(MSB)。即对主程序而言,就是向一特定地址写入所有需要发送的数据,再写入一个启动发送命令即可自动完成全部数据的发送,无需进行发送流程控制。

发送数据的流程图如图5所示。

4.电路完成

为了保证代码的准确性,首先应根据模块功能需求来编写相应测试向量作为本SPI模块的输入激励,然后经过查看模块的输出结果,判定本SPI模块的各项功能是否正确。

采用了XILINX公司的EDA编译软件平台ISE10.1,将用VHDL语言描述好的SPI接口模块进行了综合,然后用modelsim软件进行仿真。在建立测试平台时,首先建立模拟从SPI方数据发送的模块,同时建立模拟主SPI方数据发送的模块,再将接收/发送数据内容进行比较、验证。在仿真软件的辅助分析下,得到了正确的结果。仿真结果如图6所示。

仿真通过后,将整个设计工程文件经综合后的EDIF文件提交给ISE进行布局、布线后,把所生成的mcs文件下载到XILINX公司的FPGA芯片XC3S400中运行,结果与在modelsim中的仿真结果一致,该SPI总线接口模块能达到所要求实现的性能,具有很强的实用性。

5.结束语

本设计以FPGA为硬件平台,应用VHDL语言进行程序编制。可实现对SPI通信数据的自动接收和发送,也可由外部程序对该SPI串口进行快速配置,从而完成串口通信速率、时钟模式、工作方式、数据长度等的动态更改。

通过简单的程序复用,该设计可扩充为多路SPI数据通信接口,一方面弥补了常规处理控制器件(单片机、DSP等)所自带的SPI硬件串口操作繁琐、功能受限的不足,另一方面也把单片机、DSP从频繁的数据查询或数据中断中解放出来,从而投入更多精力到其它的功能控制中。

参考文献

[1]侯伯亨,顾新,编著.VHDL硬件描述语言与数字逻辑电路设计[M].西安电子科技大学出版社,1999.

[2]孙丰军,余春暄.SPI串行总线接口的Verilog实现[J].现代电子技术,2005.

上一篇:城市住宅楼配电方案探析 下一篇:有线电视网络阻抗匹配问题分析