【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。 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

[DL]深度学习_Feature Pyramid Network

FPN结构详解 目录 一、概念介绍 二、结构详解 1、对比试验 2、特征图融合 3、结构详解 4、不同尺度预测 5、Proposal映射到预测特征层 一、概念介绍 Feature Pyramid Network (FPN)是一种用于目标检测和语义分割的神经网络架构。它的目标是解决在处理不同尺度的图像时…

C语言天花板——指针(进阶3)

篇接上文(http://t.csdnimg.cn/Tl42h),今天我们来讲一些有趣的关于指针的问题🚢🚢🚢 首先我们来看个代码: int main() {//一维数组int a[] { 1,2,3,4 };//4个元素,每个元素使int类型(4个字节)printf(&qu…

03.neuvector之组的划分逻辑

neuvector之组的划分逻辑 原文链接,欢迎大家关注我的github账号 一、组的定义 NeuVector 会自动从正在运行的应用程序中创建组。这些组以前缀‘nv‘开头。您也可以使用 CRD 或 REST API 手动添加它们,并且可以在任何模式下创建、发现、监视或保护。网络和响应规则需…

【嵌入式移植】3、编译U-Boot

编译U-Boot 0 U-Boot及本文所选硬件1 获取U-Boot源码2 获取工具链3 BL314 编译4.1 yylloc4.2 u_boot_dtsi 5 烧写6 上电验证 0 U-Boot及本文所选硬件 Das U-Boot,全称 Universal Boot Loader,是遵循GPL条款的开放源码项目。U-Boot的作用是系统引导。U-B…

Android 12.0 系统开启和关闭黑白模式主题功能

1.概述 在12.0的rom系统开发定制化中,在系统SystemUI的下拉状态栏中,产品开发功能需求要求添加黑白模式功能开关的功能,就是打开黑白模式,系统颜色就会变成黑白颜色, 关闭黑白模式开关系统就会变成彩色模式,所以就需要了解下系统是怎么设置黑白模式和彩色模式的,然后添…

好大夫问诊数据爬虫记录

好大夫问诊数据爬虫入库字段记录 获取医生的病程列表 uid Column(Integer, primary_keyTrue, autoincrementTrue) gender Column(String(10)) # 性别 age Column(Integer) # 年龄 # 总交流次数 total_communication_times Column(Integer) # 医生回复次数 doctor_reply_t…

重学Java 4 进制转换和位运算

天赋不好好使用的话,可是会被收回的哦 ——24.1.13 一、进制转换 1.常用的进制 2.十进制和二进制之间的转换 1.十进制转二进制 辗转相除法——循环除以2,取余数,除到商为0为止,除完后,由下往上,得出换算后…

黏菌优化算法MATLAB实战[免费]

一、算法原理 黏菌算法(Slime mould algorithm,SMA)是模拟黏菌捕食行为的一种仿生算法。黏菌根据气味识别到食物后,通过细胞质的流动形成多个叶脉,同时向多个食物进行移动,当叶脉接近食物源时,黏菌的生物振…

PADS 改变图纸和图页边界大小

PADS 改变图纸和图页边界大小 有时候画一画原理图发现画布不够用了,可改变图纸大小,对应的改变图页边界 若图页边界怎么选择都改变不了,可将途中图页边界删除,重新加载 选择对应的图页边距就好啦 分类: PADS

竞赛保研 基于计算机视觉的身份证识别系统

0 前言 🔥 优质竞赛项目系列,今天要分享的是 基于机器视觉的身份证识别系统 该项目较为新颖,适合作为竞赛课题方向,学长非常推荐! 🧿 更多资料, 项目分享: https://gitee.com/dancheng-sen…

软件测试|pycharm关联GitHub的详细步骤

简介 GitHub 是全球最大的开源代码托管平台之一,而 PyCharm 是一款强大的 Python 集成开发环境。将两者结合使用,可以提高团队协作和代码管理的效率。本文将详细介绍如何在 PyCharm 中管理 GitHub 账号,包括如何设置 GitHub 账号、创建新仓库…

伴鱼实时数仓建设案例

伴鱼实时数仓建设案例 文章目录 伴鱼实时数仓建设案例伴鱼实时作业应用场景伴鱼实时数仓的建设体系DWD 层复杂场景数据处理方案1. 数据的去重2. join场景两条实时数据流相关联对于关联历史数据 3. 从数据形态观查join DWS 数据层数据处理方案未来与展望 随着伴鱼业务的快速发展…

JUC之CompletableFuture

Future接口理论 Future接口定义了异步任务执行的一些方法&#xff0c;包括异步任务执行结果&#xff0c;异步任务执行是否中断&#xff0c;异步任务是否完毕等。 Future接口常用实现类FutureTask异步任务 FutureTask<String> futureTask new FutureTask<String>…

企业网盘:实现数据跨境传输,助力企业出海的必备工具

今年是“一带一路”十周年。在这十年间&#xff0c;中国和“一带一路”共建国家携手并行&#xff0c;贸易持续增长发展。在如今经济全球化的大方向下&#xff0c;跨国经济合作将会是各国共识。 目前&#xff0c;中外合作企业、跨境企业已成为国际贸易发展趋势。不过&#x…

扩展欧几里得算法

文章目录 扩展欧几里得算法的内容及证明扩展欧几里得算法的代码实现扩展欧几里得算法的用途 本文的问题场景中&#xff0c;涉及到的变量均为整数。 扩展欧几里得算法的内容及证明 贝祖等式&#xff1a; a x b y g c d ( a , b ) c axby gcd(a, b) c axbygcd(a,b)c 其中 …

PLC数组队列搜索FC(SCL代码+梯形图程序)

根据输入数据搜索输入数据队列中和输入数据相同的数,函数返回其所在队列的位置。这里我们需要用到博途PLC的数组指针功能,有关数组指针的详细使用方法,可以参考下面文章: 博途PLC数组指针: https://rxxw-control.blog.csdn.net/article/details/134761364 区间搜索FC …

软件测试|Git:fatal: refusing to merge unrelated histories错误分析与解决

问题介绍 在使用Git时&#xff0c;有时我们可能会遇到以下错误消息&#xff1a; fatal: refusing to merge unrelated histories这个错误通常发生在尝试合并两个不相关的Git仓库历史时。在本文中&#xff0c;我们将详细解释为什么会出现这个错误以及如何解决它。 问题分析 …

代码随想录算法训练营第四天 | 24. 两两交换链表中的节点、19.删除链表的倒数第N个节点、面试题 02.07. 链表相交、142.环形链表II

代码随想录算法训练营第四天 | 24. 两两交换链表中的节点、19.删除链表的倒数第N个节点、面试题 02.07. 链表相交、142.环形链表II 文章目录 代码随想录算法训练营第四天 | 24. 两两交换链表中的节点、19.删除链表的倒数第N个节点、面试题 02.07. 链表相交、142.环形链表II1 Le…

CSS样式学习

html超文本传输标签&#xff0c;属性等权重 outline 标签轮廓 <input type"text"> <textarea cols"30" rows"10"></textarea> outline: none; 表示无轮廓 &#xff08;开发时用的比较多&#xff09; CSS 轮廓&#xff…

大创项目推荐 深度学习疫情社交安全距离检测算法 - python opencv cnn

文章目录 0 前言1 课题背景2 实现效果3 相关技术3.1 YOLOV43.2 基于 DeepSort 算法的行人跟踪 4 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; **基于深度学习疫情社交安全距离检测算法 ** 该项目较为新颖&#xff0c;适合作为竞赛…