从资源配置来看,ARM、DSP等处理器集成了运算单元、存储单元及大量的总线接口,工程师通过正确配置各个寄存器参数后即可使总线接口工作在相应的模式下。而FPGA内部为大量逻辑资源,总线接口需根据需要自行设计,其内部仅有部分专用模块,如PLL、DSP单元等。由于在一个由FPGA搭建的系统中,众多接口需要自行设计,因此会占用开发者大量的时间。因此我们做项目时往往将FPGA与ARM、DSP配合使用,而FPGA则往往担任从机的角色,ARM、DSP则作为主控制器使用。SPI则作为两者之间的桥梁,进行一个数据交流的过程。
SPI是串行外围接口(Serial Peripheral Interface) 的缩写,是在CPU和外围低速器件之间进行同步串行数据传输,在主器件的移位脉冲下,数据按位传输,为全双工通信,大多器件按高位在前,低位在后的顺序传输数据,数据传输速度总体来说比I2C总线要快,速度可达到儿Mbps. SPI接口是以主从方式工作的,这种模式通常有一一个主器件和一一个或多个从器件,其接口包括以下四种信号:
(1) MOSI 主器件数据输出,从器件数据输入
(2) MISO 主器件数据输入,从器件数据输出
(3) SCLK 时钟信号,由主器件产生
(4) CS - 从器件使能信号,由主器件控制
实际应用中,主器件可能需要与多个从器件进行数据传输,理论上可以增加多根片选使能信号,但比较比较浪费I/0资源。
本实验SPI通信模块针对多个从器件需要多根片选线的问题,进行了改进,本SPI通信模块主器件是STM32单片机, 从器件是FPGA构建的各个功能模块。SPI 通信模块引脚定义如下: 通信时钟spi_ scl、主器件数据输出线spi sdi、主器件数据输入线spi sdo、模块,选择片选线spi_ cs_ cmd和数据发送片选线spi_ cs_ data。其工作原理过程就是:模块选择片选信号spi_ cs_ cmd低电平有效后,先利用主器件数据输出线spi_ sdi 发送8位的模块选择信号(可以选择256个模块通信)。模块选择信号发送完后,数据发送片选线spi_ cs_ data低电平有效后,利用主器件数据输出线spi_ sdi 发送32位的数据到选中的模块。
FPGA接收数据时,首先模块选择片选信号spi. cs_ _cmd变成低电平, 等到通信时钟spi_ scl. 上升沿到来时,FPGA 通过主器件数据输出线spi_ sdi, 利用左移移位寄存器读取模块选择信号,8个通信时钟后,既可读取完模块选择信号,并存储在8位的模块选择寄存器dcnd中;同时模块选择信号接收结束标志位cmd done 产生高电平。同理,在数据发送片选线spi_ cs_ data 为低电平的情况下,等到通信时钟spi_ scl _上升沿到来时,FPGA 通过主器件数据输出线spi_ sdi,利用左移移位寄存器读取数据信号,32个通信时钟后,既可读取完数据信号,并存储在32位的数据接收寄存器dout中;同时数据接收结束标志位data done产生高电平。当cmddone和datadone为高电平时,dout和demd输出的数据才是有效的。
FPGA发送数据时,首先数据发送片选spi_ cs_ data为高电平时,等到通信时钟spi_ scl下降沿到来时,将FPGA要发送的数据存入数据发送寄存器din reg中;当spi cs data 为低电平时,等到spi_ scl时钟下降沿到来时,寄存器din_ reg数据通过左移移位寄存器,从主器件数据输入线spi_ sdo发送数据给单片机,经过32个通信时钟后,数据发送完毕。
spi.v 文件的Verilog写法
spi.v
(5.49 KB)
(下载次数: 70, 2018-8-31 18:55 上传)
spi层原理图
本帖最后由 从入门到放弃 于 2018-8-31 19:15 编辑