学习不能稀里糊涂,要学会多思考,发散式学习以及总结:
FPGA作为一种器件,只是实现目的的一种方法,过度追求实现的技术细节(用hdl还是hls,用啥芯片,用啥接口)容易只见树木不见森林。工具软件的用法也好,器件的架构也好,语言孰优孰劣的争论也罢。工程应用里大概更多应该去考虑适合的实现方式,现在software define network/flash/xxx,已然大势所趋,算法是纲,纲举目张。是因为在实现上需要有流水线,多路并行,快速部署的目的所以考虑使用FPGA,而不是为了使用而使用。
不管实现目的的方法是FPGA还是DSP甚至是GPU,这些都是工具,工程师的核心竞争力除了在于熟练地掌握开发的技巧。更重要的在于信号与系统、数字信号处理、图像处理之类的让你了解算法、优化算法的基石;以及数字电路、微机原理、处理器体系结构这些让你了解为什么这些工具要这样设计,要这样发展的课程(系统学习一点体系结构,那么这些数据级并行、指令级并行、线程级并行的处理器就不再陌生了)工程师应该顶天(了解应用,了解算法)也应该立地(了解工具,掌握技巧)。
——引用某个大佬的话,作为学习共勉
简单来说就是:FPGA是工具用来搬砖,更多的知识在FPGA之外
板卡内不同芯片间通讯最常用的三种串行协议:UART、I2C、SPI。UART在FPGA平台的ZYNQ系列上使用过,而且只用于PS端的串口打印,没有做过多了解,I2C根本就没有接触使用过,本系列是对所学知识进行学习记录。
SPI是Serial Perripheral Interface的简称,是由Motorola公司推出的一种高速、全双工的总线协议,它没有指定的流控制,也没有应答机制确认是否接收到数据,所以跟IIC总线协议比较在数据可靠性上有一定的缺陷。本次学习记录是基于采用SPI通信的方式配置ADC。
SPI,I2C和UART比USB,以太网,蓝牙和WiFi等协议要慢很多,但它们更简单,使用的硬件和系统资源也更少。SPI,I2C和UART非常适用于微控制器之间以及不需要传输大量高速数据的微控制器与传感器之间的通信。
SPI采用主从方式工作,主机通常为FPGA、MCU或DSP等可编程控制器,从机通常为EPROM、Flash,AD/DA,音视频处理芯片等设备。一般由SCLK、CS、MOSI,MISO四根线组成,有的地方可能是:SCK、SS、SDI、SDO等名称,都是一样的含义,当有多个从机存在时,通过CS来选择要控制的从机设备。和标准SPI类似的协议,还有TI的SSP协议,区别主要在片选信号的时序上。
SPI接口在使用的时候通常会见到四线和三线的情况。默认情况下都是指标准的4线制Motorola SPI协议,一般的四线模式都会支持三线模式。
以下两个是我目前在实际项目中出现过的SPI通信设计,均采用三线模式。
(1)3线制SPI,在用于单工通讯时,主机只发送或接收数据,在配置射频模块的时候,经常采用单工通信。下图电路在设计的时候采用的是四线,实际使用的时候只用了其中三线,MOSI,SCK,CS完成对射频模块增益的控制。
变频模块SPI配置要求
(2)3线制SPI,在用于半双工通讯时,比如ADI的多款ADC芯片都支持双向传输。在使用FPGA操作双向端口时,作为输入时要设置为高阻态z。下图电路在设计的时候采用的也是四线,实际使用的时候只用了其中三线,SDIO,SCLK,SDENB完成对ADS5401的寄存器配置,并通过SDIO口进行配置状态读回。
ADS5401寄存器SPI配置时序图
1、SCLK/SCK (Serial Clock)
串型时钟信号线,确保数据的正常传输。由通讯主机产生,决定了通讯的速率,不同的设备支持的最高时钟频率不同,可根据从机的支持速率,设置主机速率,确保从机正常接收到数据。
2、MOSI /SDI(Master Output, Slave Input)
主设备输出/从设备输入引脚。主机的数据从这条信号线输出,从机由这条信号线读入主机发送的数据,数据方向由主机到从机。
3、MISO/SD0 (Master Input,Slave Output)
主设备输入/从设备输出引脚。主机从这条信号线读入数据,从机的数据由这条信号线输出到主机,数据方向由从机到主机。
4、CS/SS (Chip Select):片选信号线
当有多个 SPI 从 设备与 SPI 主机相连时,设备的其它信号线 SCK、MOSI 及 MISO 同时并联到相同的 SPI 总线上,即无论有多少个从设备,都共同使用这 3 条总线;而每个从设备都有独立的片选信号线,即有多少个从设备,就有多少条片选信号线。相当于由SPI构成的通信系统中,通过CS片选信号来决定通信的从机设备是哪一台。通信期间低电平有效,表示对应从机被选中。
SPI通信有4种不同的模式,这4种模式分别由时钟极性(CPOL,Clock Polarity)和时钟相位(CPHA,Clock Phase)来定义,其中CPOL参数规定了SCK时钟信号空闲状态的电平,CPHA规定了数据是在SCK时钟的上升沿被采样还是下降沿被采样。
不同的从设备可能在出厂时就已经配置了某种模式,这是不能改变的,因此主设备与其通信必须要在同一模式下,通过CPOL(时钟极性)和CPHA(时钟相位)来控制我们主设备的通信模式,具体如下:
1、时钟极性:决定SPI总线空闲时的时钟信号是高电平还是低电平。CPOL = 1:表示空闲时是高电平;CPOL = 0:表示空闲时是低电平。
2、时钟相位:决定SPI总线从哪个跳变沿开始采样数据。CPHA = 1:表示第2个跳变沿进行数据采样CPHA=0:表示第1个跳变 沿采样。
MODE0:CPOL=0,CPHA=0:空闲态时,SCLK处于低电平,数据采样是在第1个边沿(上升沿),数据变换是在第2个边沿(下降沿)。
MODE1:CPOL=0,CPHA=1:空闲态时,SCLK处于低电平,数据变换是在第1个边沿(上升沿),数据采样是在第2个边沿(下降沿)。
MODE2:CPOL=1,CPHA=0:空闲态时,SCLK处于高电平,数据采样是在第1个边沿(下降沿),数据变换是在第2个边沿(上降沿)。
MODE3:CPOL=1,CPHA=1:空闲态时,SCLK处于高电平,数据变换是在第1个边沿(下降沿),数据采样是在第2个边沿(下降沿)。
应用中多采用MODE0和MODE3两种模式,也不难发现这两个模式本质上是一样的,只是空闲状态下他们SCK电平不一样,但是数据采样的时间都发生在时钟上升沿,因此从设备支持MODE0模式也就等于支持MODE3模式。具体采用哪种方式需要根据从机要求而定。如下图示:
需要注意的是:我们的主设备能够控制时钟,因为我们的SPI通信并不像UART或者IIC通信那样有专门的通信周期,有专门的通信起始信号,有专门的通信结束信号,这些SPI都没有。所以我们的 SPI协议能够通过控制时钟信号线,当没有数据交流的时候我们的时钟线要么是保持高电平要么是保持低电平。
本次仿真实验基于ADS5401寄存器配置,根据AS5401 数据手册进行SPI配置,学习和熟悉SPI的实际应用。
1、 手册时序图:
上图为ADS5401寄存器配置时序图,这里的SPI配置采用的是三线模式,含时钟SCLK,使能SDENB以及输入输出接口SDIO,根据时序可以看到该芯片采用SPI的MODE0模式,数据端读写模式、地址以及数据三部分组成。
当采用写模式的时候,最高位拉低,并写入7位地址和16位数据;采用读模式的时候,最高位拉高,输入相应地址,就会读回寄存器配置的相应数据。
2、 仿真介绍
在上述通信模式介绍中提到过,模式MODE0和模式MODE3本质上是一样的,从设备支持MODE0模式,那它也一定支持MODE3模式,本次设计采用的是MODE3模式状态进行仿真,(程序是之前在实际工程中应用过)
(1)以下为MODE3模式下配置,先进行写操作,0100_1000_1000_1000_1000_1001。
MODE3模式下,对配置的寄存器状态进行读回,1000_1000_XXXX_ XXXX _ XXXX _ XXXX,因为此次是仿真操作,读回数据段16位处于高阻态模式,上板测试时通过ILA即可观测到相应的数据。
(2)同理模式MODE1和模式MODE2本质上是一样的,数据采样均是发生在时钟沿的下降沿进行采样,只是时钟空闲状态不一样。以下为MODE1模式下配置,先进行写操作,0100_1000_1000_1000_1000_1001。
MODE1模式下,对配置的寄存器状态进行读回,1000_1000_XXXX_ XXXX _ XXXX _ XXXX,因为此次是仿真操作,读回数据段16位处于高阻态模式,上板测试时通过ILA即可观测到相应的数据。
在第一节中的介绍部分,我遇到的SPI配置均采用的是MODE0模式和MODE3模式。
参考文章
关于SPI协议,看这一篇文章就够了! - 腾讯云开发者社区-腾讯云 (tencent.com)
FPGA实现的SPI协议(一)----SPI驱动_fpga spi_孤独的单刀的博客-CSDN博客
SPI的原理以及Verilog HDL实现_spi读写verilog_李锐博恩的博客-CSDN博客
SPI协议详解(图文并茂+超详细)_小麦大叔的博客-CSDN博客
记录美好学习,从总结开始;