【LabVIEW FPGA入门】LabVIEW FPGA 实现SPI通信协议

        该实现由两个组件组成:在 LabVIEW FPGA 中实现的 SPI 协议以及用于从主机 PC 或实时控制器与 FPGA 进行通信的 LabVIEW 主机接口。该架构允许从单个主机程序控制多个 SPI 端口,同时仍然允许定制 FPGA VI 以进行其他数据采集和处理。该实现不使用任何DMA(直接内存访问)通道,允许使用NI扫描引擎和RIO扫描接口以及FPGA和主机之间的其他高速/大容量数据传输。

1.SPI协议介绍

        

        SPI 是一种以全双工方式运行的同步串行数据链路。也就是说,携带数据的信号同时在两个方向上传播。设备使用主/从协议进行通信,其中主设备启动数据帧。当主设备生成时钟然后选择从设备时,数据可以同时在一个或两个方向上传输。由主设备和从设备决定接收到的字节是否有意义。这可能需要设备丢弃“仅发送”帧中接收到的字节或为“仅接收”帧生成虚拟字节。  

        四种典型的 SPI 信号包括:

  • 时钟 (SCLK) - 该信号由主机生成。传输中的其他信号根据该时钟的边沿时序而变化。
  • 主数据输出,从数据输入(MOSI) ——该线是从主设备到从设备的输出。与主时钟边沿同步地逐位传输。
  • 主数据输入,从数据输出 (MISO) - 该线是所有连接的从设备的输出。从与主时钟边沿同步的从器件逐位传输。
  • 片选 (CS) 或从机选择 (SS) - 这是一组信号,其中每条线都连接到系统中的各个从机。一次断言一根线以启用与相应从机的通信。片选通常被置为低电平。

 

2.FPGA实现 

        本文档中的 SPI 总线是使用LabVIEW FPGA 实现的,以执行总线主控和时钟信号。单周期定时循环 (SCTL) 用于执行 SPI 主设备 ( LabVIEW FPGA VI) 与每个端口最多 8 个从设备之间通信的每一步。可以使用相同的 FPGA VI 和主机程序接口创建多个端口。

        该总线封装在更高级别的 LabVIEW FPGA VI 中,该 VI 利用状态机在每个 SPI 端口和主机接口之间执行中间通信。该VI同步主机接口和SPI端口,并将从主机发送到指定端口的数据复用。

3.总线实现

        状态机用于执行特定操作,然后确定要转换到哪个状态。由于 SPI 具有总线转换发生的特定顺序,因此状态机是实现该协议的不错选择。每个状态完成通信的一部分,然后按顺序转换到下一步。

        当 FPGA 上的 SPI 引擎收到命令时,一个通信周期开始。每个字节均从 VI 范围 FIFO 中读取,数据从多路复用器传递并作为布尔数组存储在 FPGA 上。

http://zone.ni.com/cms/images/devzone/tut/clip_image002_20090516100343.gif

        接收到要发送到 SPI 总线的数据后,指定要写入的器件的片选 (CS) 线被置位。当器件的片选线被置位时,它就准备好一次一位地接收和发送数据。在执行过程中的任何时刻只能有一条片选线处于活动状态。CS 线作为写入 FPGA 硬件上数字 I/O 端口的整数来实现。每个 CS 端口可以寻址 8 个单独的从站。

        每个器件都需要由 FPGA 主器件生成时钟信号 (SCLK)。对于端口上的所有设备,该时钟的速率可能不一致,因此可以在每个数据传输周期之前设置时钟速率。一旦片选被置位,主机和从机都准备好进行数据传输。状态机转换到等待状态并保持在该状态足够长的时间以考虑所选的时钟速率。

        当延迟完成时,应生成第一个时钟信号以开始数据传输。SPI 设备可能需要四种时钟模式之一进行传输。这些模式取决于时钟极性 (CPOL) 和时钟相位 (CPHA)。CPOL 指定时钟的空闲状态是逻辑低还是逻辑高(分别为 0 或 1)。CPHA 指定数据是在第一个边沿还是第二个边沿(分别为 0 或 1)记入/记出。

        当时钟被设置时,它从空闲状态转换到活动状态。如果 CPHA 为 0,则在此转换期间也会对数据进行计时。如果 CPHA 为 1,则当 SCLK 从活动复位为空闲时对数据进行计时。在设置和重置 SCLK 之间,会出现另一个等待状态,以确保正确的时钟速率。对于必须发送的每个位,这些状态都会按顺序重复。

        每个字节传输完毕后,VI从从设备接收到的数据会被放入另一个VI范围的FIFO中,以便传输回主机。如果发送到状态机的所有数据都已发送完毕,则片选线复位为无效状态,程序等待下一个命令。如果数据多于一个字节,则会转换回设置时钟状态,并传输其余数据。

        除了SPI协议之外,每个端口的VI还具有配置状态。当主机发送的命令为配置时,SCLK 速率、CPOL、CPHA 和端口号将被读取并用于下一个数据传输序列。

4.FPGA多路复用器

        为了允许以最少的配置实例化多个端口,使用中间FPGA VI在SPI端口VI和主机VI之间进行通信。该VI由一个状态机组成,管理主机/FPGA握手以及将数据复用到正确的端口。

        主机负责传达多路复用器应执行的状态。多路复用器处于空闲状态,等待来自主机的启动命令。当接收到启动命令时,多路复用器将数据指定的端口写入每个端口可访问的全局变量中。在开始执行之前,每个端口VI都会检查它是否是指定端口。

        设置端口信息后,复用器检查主机发送的命令。如果命令是Configure,则将CPOL、CPHA、CS和总字节数写入全局变量,为下一次数据传输做准备。如果命令是读/写 SPI,则从主机接收的数据将传递到每个端口可访问的目标范围 FIFO。该数据从目标范围的 FIFO 传输到目标端口的 VI 范围的 FIFO,以在写入和读取状态下传递到 SPI 总线。

        由于多路复用器设置了数据的目的地,因此即使有多个端口可用,一次也只能有一个端口传输数据。一旦一个端口的所有数据都已传输,下一个端口就可以开始其传输序列。

 5.主机接口

        创建了 SPI 通信状态机的 LabVIEW 接口,以方便主机 PC 或实时控制器与 FPGA 多路复用器之间的简单数据传输。借助此高级 API,多个 SPI 端口可以与应用程序所需的任何其他LabVIEW FPGA代码一起实例化。

        该API由两个VI组成:FPGA SPI_Configure和FPGA SPI_Read Write。FPGA SPI_Configure 设置 SCLK 速率、CPOL、CPHA、CS 和要使用的端口。该信息通过配置命令传递到 FPGA 多路复用器,并存储在 FPGA 全局变量中。

        FPGA SPI_Read Write 需要传输的总位数以及指定该数据的端口。U8字节数组被传递到VI并返回相同大小的数组。主机和 FPGA 之间的所有握手和数据传输都封装在这些 VI 中。

主机API.png

 

        如果其他 FPGA 代码要与 SPI 总线一起使用,来自 FPGA 多路复用器的 SPI 通信循环和所有前面板控件将需要出现在顶层 VI 中。如果没有这些,则需要修改主机 API 以使用正确的标签与前面板控件进行通信。使用Open FPGA Reference VI创建的FPGA参考还需要绑定到API使用的FPGA Reference.ctl typedef。

        FPGA 内核和主机 API 附带的示例程序展示了如何从多个端口写入和读取数据。每次按下 Write 按钮时,Write Data 中的数据会发送到 FPGA,而 Read Data 则会从 SPI 总线返回。在写入之间,可以更改端口和配置数据。

6.添加多个SPI端口

        向 FPGA 添加多个 SPI 端口相对简单。在项目中,必须为新端口的 SCLK、MOSI、MISO 和 CS 添加新的 FPGA I/O。不需要其他项目配置。

项目配置.png

        在 FPGA SPI_FPGA Top Level VI 中,所需要做的就是添加 FPGA SPI_SPI Port VI 的另一个实例,并添加端口号的输入以及用于 SCLK、MOSI、MISO 和 CS 的 FPGA I/O。多路复用器VI中的SPI通信循环处理与新端口之间的数据传递。

多个端口.Png

7.更改FPGA目标

        如果需要在不同的目标上编译和运行该示例,则应将主机VI和FPGA参考复制到新目标的非FPGA部分。对于CompactRIO和 Single-Board RIO,这将是 RT 控制器。如果移动到R系列智能DAQ目标,主机VI应移动到项目中的“我的电脑”目标。

        项目的 FPGA 部分中必须复制的项目是顶层 FPGA VI 和目标范围的 FPGA FIFO。需要将新的 FPGA I/O 添加到项目中,以便为 SPI 端口创建参考,以便在正确的线路上进行通信。如果FPGA I/O名称与示例中的名称不同,则需要更改端口VI的FPGA I/O常量输入以匹配新项目的FPGA I/O。

 

改变目标.Png

        要使用主机API,当在主机VI中调用Open FPGA VI Reference时,该引用应绑定到项目中的FPGA Reference控件。这会将目标信息传播到主机 API 的子 VI。 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/619458.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【期末不挂科-C++考前速过系列P4】大二C++实验作业-继承和派生(3道代码题)【解析,注释】

前言 大家好吖,欢迎来到 YY 滴C考前速过系列 ,热烈欢迎! 本章主要内容面向接触过C的老铁 主要内容含: 欢迎订阅 YY滴C专栏!更多干货持续更新!以下是传送门! YY的《C》专栏YY的《C11》专栏YY的《…

解密威胁:.kat6.l6st6r 勒索病毒的威胁与恢复

导言: 在当今数字化时代,勒索病毒已经成为网络安全威胁中的一大巨头。其中,.kat6.l6st6r 勒索病毒以其狡猾的传播方式和高级的加密算法备受关注。本文将深入介绍.kat6.l6st6r 勒索病毒的特点、应对措施以及如何预防此类威胁。如果您在面对被…

流量预测中文文献阅读(郭郭专用)

目录 基于流量预测的超密集网络资源分配策略研究_2023_高雪亮_内蒙古大学(1)内容总结(2)流量预测部分1、数据集2、结果对其中的一个网格的CDR进行预测RMSE和R2近邻数据和周期数据对RMSE的影响 (3)基于流量预…

ElasticSearch概述+SpringBoot 集成 ES

ES概述 开源的、高扩展的、分布式全文检索引擎【站内搜索】 解决问题 1.搜索词是一个整体时,不能拆分(mysql整体连续) 2.效率会低,不会用到索引(mysql索引失效) 解决方式 进行数据的存储(只存储…

无缝打通易快报与电子签章系统,合同管理也能如此简单!

客户介绍: 某股份有限公司是一家专注于高端装备制造和智能制造解决方案的高新技术企业。该公司的产品和服务广泛应用于汽车、航空、高铁、智能家居、电子电器、新能源等领域,为全球客户提供了高效、精准、可靠的制造解决方案。 添加图片注释&#xff0c…

​iOS 应用上架指南:资料填写及提交审核

目录 摘要 引言 打开appuploader工具,第二步:打开appuploader工具 第五步:交付应用程序,在iTunes Connect中查看应用程序 总结 摘要 本文提供了iOS新站上架资料填写及提交审核的详细指南,包括创建应用、资料填写-…

【JAVA语言-第12话】API中的工具类 之 Date,DateFormat,SimpleDateFormat,Calendar类的详细解析

目录 日期和时间 1.1 Date类 1.1.1 概述 1.1.2 常用方法 1.1.3 案例 1.2 DateFormat类 1.2.1 概述 1.2.2 常用方法 1.3 SimpleDateFormat类 1.3.1 概述 1.3.2 构造方法 1.3.3 模式字符 1.3.4 日期转字符串 1.3.5 字符串转日期 1.4 Calendar类 1.4.1 概述 1…

Raspbian安装摄像头

Raspbian安装摄像头 1. 源由2. 摄像头2.1 选型2.2 系统2.3 安装 3. 配置&命令3.1 命令3.2 配置 4. 测试4.1 拍照4.1.1 libcamera-jpeg4.1.2 libcamera-still 4.2 视频流4.2.1 RTSP流4.2.2 TCP流 5. 参考资料 1. 源由 家里闲置两块树莓派,打算做个WiFi视频流RTS…

【JaveWeb教程】(21) MySQL数据库开发之多表设计:一对多、一对一、多对多的表关系 详细代码示例讲解

目录 2. 多表设计2.1 一对多2.1.1 表设计2.1.2 外键约束 2.2 一对一2.3 多对多2.4 案例 2. 多表设计 关于单表的操作(单表的设计、单表的增删改查)我们就已经学习完了。接下来我们就要来学习多表的操作,首先来学习多表的设计。 项目开发中,在进行数据库…

MISGAN

MISGAN:通过生成对抗网络从不完整数据中学习 代码、论文、会议发表: ICLR 2019 摘要: 生成对抗网络(GAN)已被证明提供了一种对复杂分布进行建模的有效方法,并在各种具有挑战性的任务上取得了令人印象深刻的结果。然而,典型的 GAN 需要在训练期间充分观察数据。在本文中…

matlab中any()函数用法

一、帮助文档中的介绍 B any(A) 沿着大小不等于 1 的数组 A 的第一维测试所有元素为非零数字还是逻辑值 1 (true)。实际上,any 是逻辑 OR 运算符的原生扩展。 二、解读 分两步走: ①确定维度;②确定运算规则 以下面二维数组为例 >>…

FEB(acwing)

文章目录 FEB题目描述输入格式输出格式数据范围输入样例1:输出样例1:输入样例2:输出样例2:输入样例3:输出样例3:代码题解情况1:xxxxxx:0,1,2,…&a…

AI教我学编程之C#变量及实例演示

前言 在AI教我学编程之AI自刀 这篇文章中,我们知道了变量的基础类型,那么变量在C#中有什么作用呢?我们一起来看看吧! 目录 重点先知 变量 变量类型 实例演示 变量声明 实例演示 提出疑问 初始化变量 自动初始化 多变量声明 实…

【深度学习目标检测】十六、基于深度学习的麦穗头系统-含GUI和源码(python,yolov8)

全球麦穗检测是植物表型分析领域的一个挑战,主要目标是检测图像中的小麦麦穗。这种检测在农业领域具有重要意义,可以帮助农民评估作物的健康状况和成熟度。然而,由于小麦麦穗在视觉上具有挑战性,准确检测它们是一项艰巨的任务。 全…

使用emu8086实现——顺序程序设计

一、实验目的 1. 掌握顺序程序设计方法 2. 掌握汇编语言编程设计方法。 二、实验内容 1.用查表的方法将一位十六进制数转换成它相应的ASCII码。 代码及注释: Data segment ;定义数据段Tab db 30h,31h,32h,33h,34h,35,36h,37h,38h,39h ;定义一个Tab的字节型…

js逆向第20例:猿人学第19题乌拉乌拉乌拉

文章目录 一、前言二、定位关键参数1、JA3/TLS指纹怎么查看2、加密值长度对比三、代码实现四、参考文献一、前言 任务十九:抓取这5页的数字,计算加和并提交结果 此题在以前用python写逆向代码是存在缺陷的,直到今年有个大佬开源了curl_cffi库,并且支持 JA3/TLS 和 http2 指…

npmvue详解

1、npm是node.js的一个软件依赖包管理工具 2、当前目录下面一般会有一个package.json文件 3、npm install 会去按照package.json文件中的依赖去下载依赖包 默认会下载到当前目录中的node_modules文件夹下,-g会进行全局安装 4、package.json文件中有两种依赖关系 …

H7303 无电感,线性恒流,低压差,大电流,车灯/台灯 9V 12V 24V 30V

线性恒流芯片是一种用于控制电流的电子元件,通常用于驱动LED等器件。它的工作原理是通过维持输出电流的恒定来保持被驱动器件的亮度或功率稳定。 具体来说,线性恒流芯片会监测输出电流并调整电压以保持恒定的电流流过被驱动器件。以下是其基本工作步骤&…

MaxKey 单点登录认证系统——实现登录后自动跳转及分析思路

Maxkey单点登录系统集成业务系统应用之后,登录界面登录之后不会自动跳转业务系统,需要在首页点击相应应用之后,才能实现跳转业务系统,故以下本人提供解决方法和分析思路。 环境配置 本例使用的是CAS协议实现单点登录 Maxkey 服务…

企业如何做到安全又极速的分发传输大文件

在当代企业运营中,文件的传输和分发是至关重要的任务。然而,随着文件体积的增大和信息敏感性的凸显,企业需要找到一种既安全又能够高效传输大文件的方法。本文将深入探讨如何在企业环境中实现安全又高效的大文件传输。 一、分发大文件时需要注…