这个模块实现与微处理器的通信,接收微处理器的数据和指令,通过指令解析,发出控制信号。该模块定义的寄存器包括发送数据寄存器,接收数据寄存器,测试数据寄存器,接收测试数据寄存器,指令寄存器,配置寄存器,状态寄存器,各寄存器详述如下:
l 发送数据寄存器:可写寄存器,接收微处理器发送的数据,而后暂存于FIFO模块中;
l 接收数据寄存器:可读寄存器,当收到“读数据”指令时,该寄存器将从FIFO中读入数据且通过数据总线发送至微处理器;
l 测试数据寄存器:可写寄存器,用于在测试模式下接收测试数据,而后暂存于FIFO模块中;
l 接收测试数据寄存器:可读寄存器,当收到“读测试数据”指令时,该寄存器读入FIFO中的测试数据,并通过数据总线发送至微处理器,以测试各功能模块工作是否正常;
l 指令寄存器:可写寄存器,接收微处理器的指令,通过指令解析后,往其它模块发出相应的控制信号,包括发送数据指令,读数据指令,复位指令,写测试数据指令,读测试数据指令;
l 配置寄存器:可写寄存器,用于保存SPI配置参数,包括时钟分频倍数、相位、移位顺序、帧长度等。该寄存器的值将被转发至配置模块。
l 状态寄存器:只读寄存器,控制模块将状态机状态写入该寄存器,供微处理器查询SPI工作状态;
2.2控制模块
控制模块是本系统的核心,控制着整个工作流程,为了方便结构化设计,本模块设计了状态机。根据SPI总线的原理可将总线分为五种状态,分别是等待状态、数据发送状态、数据接收状态、数据接收完毕状态、在线测试状态。各状态之间的关系如图2所示:
图3 状态机
2.3 FIFO模块
由于微处理器的写数据速率远比串口输出速率快得多,所以必须先将数据保存于缓冲区,FIFO的容量应根据通信数据量的大小来确定,在本设计中,由于数据量不大,所以定义了一个64 X 8位的异步FIFO寄存器,用于保存收发数据,用VHDL硬件描述语言描述的FIFO是一个64 X 8位的数组。模块包括两个时钟信号,写入和读出数据总线,满标志和空标志信号,当FIFO为满标志时,写入的数据将被忽略。
2.4配置模块
该模块设计了2 个3 X 12位的RAM,一个用于保存主机模块配置参数,另一个用于保存从机模式配置参数,每次主从机模式切换时将配置参数发送到数据收发模块。数据收发模块根据配置参数调整分频倍数、相位、输出顺序(高位先出或低位先出)、帧长度等。
2.5数据收发模块
该模块实现与从设备的通信。在主机模式下,将FIFO的并行数据进行并串变换,然后通过MOSI引脚输出数据,并同时输出驱动时钟和控制信号(低电平)。在从机模式下将串行输入的数据串并变换后写入FIFO模块中。
四、仿真与验证
将用vhdl描述好的SPI接口电路用synplify进行综合,然后用modelsim软件进行仿真。先仿真微处理器通过SPI接口发送数据过程,在地址总线上输入指令寄存器地址,在数据总线上输入发送数据指令,工作时钟为89.6M,然后在地址总线上输入写数据寄存器地址,在数据总线上输入数据01010101。得到如图3所示的部分管脚的波形。
用quartus软件进行编译后,将生成的网表文件通过JTAG下载到altera公司的acex1k系列EP1k30TC144-3运行,配合设计好的单片机程序,分别给FPGA输入44.8M和89.6M工作时钟,在quartus的signal tap的辅助分析下都得到了正确的结果。EP1k30TC144-3芯片共有1728个逻辑单元,本设计使用了138个,占系统资源的7%,是个比较理想的结果。
五、结束语
随着半导体技术的进步,FPGA的价格越来越便宜,工作频率越来越高,使用FPGA实现SPI通信接口是切实可行的,本文作者创新点:
1、 将总线控制信号封装成指令,使用者只需通过发送指令的方式操作,避免了复杂的时序逻辑设计问题。
2、 可以在SPI工作过程中随时调整配置参数。
3、 充分考虑了可测试性设计,使用者可随时查看SPI总线工作状态。
参考文献:
[1] Prophet, Graham. Communications IP adds SPI interface to FPGA. EDN, v 48, n 27, Dec 11, 2003, p 14
[2] 朱海君,敬岚,陆军. 基于MSC1210单片机的串口通讯设计. 微计算机信息,2004(4)
[3] 左东广,魏瑞轩. SPI接口技术与应用. 工业控制计算机 2001 2(14)
华卓立(1980-),男(汉族),华南理工大学微电子专业2005级研究生,研究方向为专用集成电路设计与系统集成。
通信地址:广州市五山路华南理工大学物理科学与技术学院微电05研 邮编:510640