孩子都能学会的FPGA:第三十一课——用FPGA实现SPI主机发送数据

news2024/9/24 7:18:47

(原创声明:该文是作者的原创,面向对象是FPGA入门者,后续会有进阶的高级教程。宗旨是让每个想做FPGA的人轻松入门作者不光让大家知其然,还要让大家知其所以然!每个工程作者都搭建了全自动化的仿真环境,只需要双击top_tb.bat文件就可以完成整个的仿真(前提是安装了modelsim),降低了初学者的门槛。如需整个工程请留言(WX:Blue23Light),不收任何费用,但是仅供参考,不建议大家获得资料后从事一些商业活动!

SPI的英文全称为Serial Peripheral Interface,顾名思义为串行外设接口。SPI是一种同步串行通信接口规范,主要应用于嵌入式系统中的短距离通信。该接口由摩托罗拉在20世纪80年代中期开发,后发展成了行业规范。

SPI是一种高速的、全双工的、同步的通信总线,并且至多仅需使用4根线,节约了芯片的管脚,SPI主要应用于EEPROM、FLASH、ADC、DAC等芯片,还有数字信号处理器和数字信号解码器之间。

SPI设备之间采用全双工模式通信,是一个主机和一个或者多个从机的主从模式。主机负责初始化帧,这个数据传输帧可以用于读与写两种操作,片选线可以从多个从机选择一个来响应主机的请求。

SPI通信中有4种不同的操作模式,不同的从机设备可能在出厂时就被设置好了某种模式,并且无法更改。但是SPI通信必须处于同一种模式下才能进行。因此我们应该对自己手里的SPI主机设备进行模式的配置,也就是通过CPOL(时钟极性)和CPHA(时钟相位)来控制SPI主设备的通信模式,具体如下:

时钟极性(CPOL)定义了SCLK时钟线空闲状态时的电平:

CPOL=0,即SCLK=0,表示SCLK时钟信号线在空闲状态时的电平为低电平,因此有效状态为高电平。

CPOL=1,即SCLK=1,表示SCLK时钟信号线在空闲状态时的电平为高电平,因此有效状态为低电平。

时钟相位(CPHA)定义了数据位相对于时钟线的时序(即相位):

CPHA=0,即表示输出(out)端在上一个时钟周期的后沿改变数据,而输入(in)端在时钟周期的前沿(或不久之后)捕获数据。输出端保持数据有效直到当前时钟周期的尾部边缘。对于第一个时钟周期来说,第一位的数据必须在时钟前沿之前出现在MOSI线上。也就是一个CPHA=0的周期包括半个时钟空闲和半个时钟置位的周期。

CPHA=1,即表示输出(out)端在当前时钟周期的前沿改变数据,而输入(in)端在时钟周期的后沿(或不久之后)捕获数据。输出端保持数据有效直到下一个时钟周期的前沿。对于最后一个时钟周期来说,从机设备在片选信号消失之前保持MISO信号线有效。也就是一个CHPA=1的周期包括半个时钟置位和半个时钟空闲的周期。

时钟极性和相位的时序图。红线表示时钟的前沿,蓝线表示时钟的后沿。

SPIFPGA实现,网上有很多的教程,很多是用状态机实现的,本节我们用一种简单的方式来实现SPI的主机通信,先来实现CPOL=0CPHA=0;下节课再用通用方式来实现4种模式。

SPI的时钟一般都是一个范围,这个要看实际芯片的datasheet,所以我们可以采用主时钟的分频来实现,主要在规定的范围内即可。

如下所示,定义了参数DNUM是要发送数据的位宽,FRE_DIV是主时钟的分频数,取2的幂次,如果是4就是主时钟的4分频,假设主时钟是100MHz,那SPI的时钟就是25MHz。FRE_DIV_INDEX就是分频数的那个幂次,FRE_DIV4,FRE_DIV_INDEX就是2,FRE_DIV8,FRE_DIV_INDEX就是3......

用信号spi_conv来标识一次SPI通信,spi_state_cnt的计数最大值是数据位宽和分频数的乘积(总共消耗的系统时钟数),同时根据计数值值完成spi_overspi_cs信号的控制。

根据计数器取分频时钟,即SPI的时钟spi_sck,因为CPOL=0,所以spi_sck在空闲状态时低电平。因为CPHA=0,就是在spi_sck的下升沿SPI的输出spi_mosi进行变化,通过信号shift_enshift_en_d来取spi_sck的下降沿send_en_flag。最后将要发送的数据通过send_en_flag控制放到线spi_mosi上即可。

新建tb测试文件,在文件中设计了2taskspi_data()用来产生16位的随机数据,spi_slave()模拟接收spi_master发送的串行信号,并与spi_master实际发送的并行多位信号进行比较,通过打印信息确定设计的功能是否正确。

双击sim目录下得top_tb.bat文件,完成系统得自动化仿真。

1SPI发送的仿真波形图如下所示。

查看modelsimTranscript窗口,spi_master发送的数据和spi_slave接收的数据一致,设计功能正常。

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

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

相关文章

保障网络安全:了解威胁检测和风险评分的重要性

在当今数字时代,网络安全问题变得愈发突出,而及时发现和迅速应对潜在威胁成为保障组织信息安全的首要任务。令人震惊的是,根据2023年的数据,平均而言,检测到一次网络入侵的时间竟然长达207天。这引起了对安全策略和技术…

java设计模式学习之【代理模式】

文章目录 引言代理模式简介定义与用途实现方式 使用场景优势与劣势在Spring框架中的应用图片加载示例代码地址 引言 在现实生活中,我们经常使用代理来处理我们不想直接参与或无法直接参与的事务,例如,使用律师来代表法庭上的案件。在软件开发…

2023微博AIGC算法工程师一面 面试题

来源:投稿 作者:LSC 编辑:学姐 一面 35min左右,主要是根据简历发问的 1.自我介绍 介绍实习项目, 聊的比较详细,但是我实习项目限制比较多,做的不够深入。 2.多标签分类的损失函数 多标签分类任务&#x…

SOLIDWORKS Motion运动平台减速运动分析

SOLIDWROKS motion是SOLIDWORKS中一个高性能的插件,能够帮助设计中完成虚拟样机的仿真分析工具,motion既可以对众多的机械结构进行运动学和动力学仿真,同时也可以反馈机械设备的速度、加速度、作用力等,在SOLIDWROKS motion完成样…

ArrayList与顺序表(带完整实例)

【本节目标】 1. 线性表 2. 顺序表 3. ArrayList的简介 4. ArrayList使用 5. ArrayList的扩容机制 6. 扑克牌 1.线性表 线性表(linear list)是n个具有相同特性的数据元素的有限序列。 线性表是一种在实际中广泛使用的数据结构,常见的线性表…

骨灰级程序员那些年曾经告诉我们的高效学习的态度

一、背景 以前阅读陈皓老师的左耳听风专栏中关于如何高效学习的总结让我收货颇丰,今天总结了一下,分享给大家 老师说: 学习是一件“逆人性”的事,就像锻炼身体一样,需要人持续付出,会让人感到痛苦&#…

PFA气体吸收瓶耐强酸PFA洗气瓶PFA鼓泡瓶特点分析

洗气瓶的别称有多种,取决于不同的地区和行业。以下是一些常见的别称: 1. 清洗瓶:因其主要用途是清洗气体样品而得名。 2. 干燥瓶:用于干燥气体样品的容器。 3. 气体净化瓶:用于净化气体样品的设备。 4. 气体清洗器…

再回首感知损失在low-level上的应用

《Perceptual Losses for Real-Time Style Transfer and Super-Resolution》是李飞飞团队在2016年发表于ECCV的文章。我近几年的工作中,所训练的模型都离不开感知损失。不得不感慨,大佬之所以是大佬,就是因为他们开创性的工作很多年后依然为人…

淘宝api接口测试方式(item_get-获得淘宝商品详情)

注册淘宝开放平台账号:首先,你需要在淘宝开放平台上注册一个账号,并创建一个应用。获取App Key和Secret Key:在创建应用后,你会获得App Key和Secret Key,这些凭证将用于调用API。了解淘宝商品详情接口&…

探索性能测试的奥秘:流程与工具大揭秘!

一、性能测试 性能测试是通过自动化的测试工具模拟多种正常、峰值以及异常负载条件来对系统的各项性能指标进行测试。 1.1 类别 性能测试包括负载测试、压力测试、基准测试等。 1.1.1 负载测试 通过测试系统在资源超负荷情况下的表现,以发现设计上的错误或验证…

PCL点云处理之反算两块点云的放缩比例 (二百二十三)

PCL点云处理之反算两块点云的放缩比例 (二百二十三) 一、算法介绍二、算法实现1.代码2.结果一、算法介绍 在 PCL点云处理之等比例放大与缩小点云尺寸(七十二)一章中,介绍了如何等比例放大缩小一块点云,这里介绍如何反算得到两片经过放缩的点云之间的比例,这种计算方法应…

事务隔离级别:保障数据库并发事务的一致性与性能

目录 引言 1. 事务隔离级别概述 2. 读未提交隔离级别 3. 读已提交隔离级别 4. 可重复读隔离级别 5. 串行化隔离级别 6. 保障事务隔离级别的机制 7. 如何选择合适的隔离级别 8. 结语 引言 在数据库管理系统(DBMS)中,事务隔离级别是一…

【开源软件】最好的开源软件-2023-第18名 OpenTelemetry

自我介绍 做一个简单介绍,酒架年近48 ,有20多年IT工作经历,目前在一家500强做企业架构.因为工作需要,另外也因为兴趣涉猎比较广,为了自己学习建立了三个博客,分别是【全球IT瞭望】,【…

Qt之Ui样式表不影响子类的配置

Qt之Ui样式表不影响子类的配置 问题 在ui界面上布局时,当对容器进行样试设计时,会对容器内其它成员对象也进行了修改 分析 对应*.ui文件内容 从这个写法来看,它的样式属性会影响其成员对象样式属性。 解决方法 在容器的样式表中写时适…

Numpy 实现C4.5决策树

C4.5 信息增益比实现决策树 信息增益比 g R ( D , A ) g ( D , A ) H ( D ) g_{R}(D, A)\frac{g(D, A)}{H(D)} gR​(D,A)H(D)g(D,A)​ 其中, g ( D , A ) g(D,A) g(D,A)是信息增益, H ( D ) H(D) H(D)是数据集 D D D的熵 代码实现 import numpy as …

AI全栈大模型工程师(二十四)常用的超参

文章目录 七、先介绍几个常用的超参7.1、过拟合与欠拟合7.2、学习率调整策略八、自然语言处理常见的网络结构8.1、文本卷积神经网络 TextCNN8.2、循环神经网络 RNN8.3、Attention (for RNN)后记七、先介绍几个常用的超参 7.1、过拟合与欠拟合 奥卡姆剃刀: 两个处于竞争地位的…

Kafka事务是怎么实现的?Kafka事务消息原理详解(文末送书)

目录 一、Kafka事务性消息1.1 介绍Kafka事务性消息1.2 事务性消息的应用场景1.3 Kafka事务性消息的优势 二、Kafka事务性消息的使用2.1 配置Kafka以支持事务性消息生产者配置消费者配置 2.2 生产者:发送事务性消息创建Kafka生产者开始事务发送消息提交或中止事务 2.…

MATLAB 最小二乘直线拟合方法二 (36)

MATLAB 最小二乘直线拟合方法二 (36) 一、算法介绍二、算法实现1.代码2.结果一、算法介绍 这里介绍另一种拟合直线点云的方法,更为简单方便,结果与前者一致,主要内容直接复制代码使用即可,原理简单看代码即可,下面是具体的实现和拟合结果展示 二、算法实现 1.代码 代…

wappalyzer基于插件的网站开发技术解析工具

一、wappalyzer 解释:这是一款强大的工具,其主要能提供一种快速、可靠地检测网站所使用技术栈的方法,也就说说,服务器发来的信息都会被它剖析,然后分析出前端的技术栈,有时后端所使用的技术栈如果网页特征…

华为配置策略路由(基于IP地址)示例

组网需求 如图1所示,汇聚层Switch做三层转发设备,接入层设备LSW做用户网关,接入层LSW和汇聚层Switch之间路由可达。汇聚层Switch通过两条链路连接到两个核心路由器上,一条是高速链路,网关为10.1.20.1/24;另…