欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 编程资源 > 编程问答 >内容正文

编程问答

fpga电平约束有什么作用_FPGA从串模式

发布时间:2025/6/17 编程问答 58 豆豆
生活随笔 收集整理的这篇文章主要介绍了 fpga电平约束有什么作用_FPGA从串模式 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

自我介绍什么的后面再说,先把原理和实现过程展示出来。

本文主要论述在ARM嵌入式系统中如何实现FPGA从串配置的方法,将系统程序及配置数据存储在片外Flash中,利用ARM的通用I/O口产生配置时序。我们的实验目的就是测试通过单片机外部的MCU给FPGA加载程序,实现一键烧写多个FPGA程序,进而节省操作人员的时间(不用一个一个重复下载同样的程序)
在这里我们选择ARM家族的LPC1768:LPC1768 是NXP 公司推出的基于ARM Cortex-M3 内核的微控制器LPC17XX 系列中的一员。LPC17XX 系列Cortex-M3 微处理器用于处理要求高度集成和低功耗的嵌入式应用。LPC1700 系列微控制器的操作频率可达100MHz。

FPGA采用xilinx公司A系列中的

XC7A50T

,数据手册:A系列数据手册-ug470;

接下来详细讨论FPGA的从串配置的时序,同时论述LPC1768从串配置A7系列FPGA的软、硬件实现方法。


1.从串配置原理
Xilinx公司的A7系列FPGA可采用从串、主串、从并、主并、JTAG等方式进行配置,与从串配置相关的引脚功能及配置如下:
①M[2:0]:配置模式选择位。M2,M1,M0均接上拉电阻,即M[2:O]=111时为从串模式。
②CCLK:配置时钟位,由LPC1768微处理器提供,上升沿有效。
③DIN:串行数据输入位。
④DOUT:串行数据输出位,用于菊花链式配置。
⑤)PROG_B:低电平异步复位FPGA内部逻辑位。内部配置Memory完全复位后,该引脚指示高电平,此时才能开始配置FPGA。
⑥ INIT_B:由低电平到高电平跳变时,采样配置模式选择位M[2:0],确定配置方式;配置过程中若出现配置错误,INIT_B将呈现低电平。
⑦DONE:复位时为低电平,若配置成功则为高电平。

从串模式的时序图如下:

数据手册中对从串模式时序介绍


2.具体来聊聊FPGA的配置过程:
①系统上电后,首先将PROG_B置为高电平,之后将PROG_B置为低电平,复位FPGA内部逻辑重新配置FPGA,延时100 μs充分复位内部逻辑后,将PROG_B置为高电平。
②INIT_B保持低电平,将PROG_B置高电平大于50us后,FPGA将INIT_B置为高电平,在INIT_B由低向高跳变的瞬间,采样配置模式选择位M[2:0],采用从串配置模式。
③FPGA采样配置模式后,微处理器开始配置FPGA时钟CCLK和数据,在CCLK的每个上升沿,每bit数据被传入到DIN,数据字节先发低位,再发高位,配置过程中若发生错误,则INIT_B呈现低电平。
④所有配置数据传送完成,FPGA校验无误,则DONE呈现高电平,否则为低电平。
⑤DONE为高后,FPGA释放全局三态(GTS),激活IO管脚,释放全部置位复位(GSR)和全局写使能(GWE)有效,开始执行配置区里的逻辑,从串模式配置完成。

现在开始动手来手撕代码:

首先生成一个PROG_B由高电平再到低电平延时一段时间再拉高的时序波形,目的是为了给FPGA配置逻辑异步复位,表示设备已清除配置存储器,相关代码如下图:

ARM模拟从串模式初始时序

如果异步复位配置成功接下来我们应该接收到FPGA反馈的INIT_B信号,此时的INIT_B信号会被拉高,所以呢我们应该检测它的上升沿(原理就是持续检测低电平,满足才可以通过while语句再检测高电平,直到两个while语句都通过),代码如下图

添加边沿检测INIT_B信号

接下来我们要开始配置CCLK信号和数据了,这个我们参考的模拟I2C的思路(这个就是浏览器随便一搜,相关讲解很详细,我就不多赘述),一个时钟周期内发bit大小的数据(时钟低电平的时候将数据准备好,高电平的时候发出去)每8个bit为一个byte。代码如下图:

配置时钟和数据

我们前期的准备工作都做好了,之后开始配置其他的一些子模块以及写主函数。打开芯片的数据手册来查找我们要发送多少个字节以及一些注意事项(数据是高位先发还是低位先发等等)根据下面得图可知我们一共需要发送17536096个bits

数据手册相关内容

有了这些信息我们再将SPIFlash里面的数据通过我们的从串模式DATAIN管脚发送给FPGA,我们的FPGA收到数据并且验证成功之后会将DONE信号拉高,最后我们检测到DONE信号拉高就可以判断从串模式配置成功了,部分代码如下

对DONE信号进行验证

主函数调用子模块

这样我们就做好了一个从串模式的代码,经过测试发现我们需要2分钟左右才可以配置成功,这个时间远远达不到我们得要求,需要开始优化代码,首先分析造成配置时间过长的原因:

(1)从SPIFlash读取数据的时间太长了

(2)每次传数据中间的延时时间太久了。为了改善这个问题我们将SPIFlash一次多读取一些数据,还有就是将延时缩小到满足要求的最小值。代码如下图:

讲每次从flash中提取的数据增多

提高读取速率

修改完上面的两处变量我们就可以将配置的时间提升到13s左右(serial clock rate通过查手册是数值越小,速率越快(最小可以取到01)。SPIFlash影响配置速度的主要原因是每次读取数据等待的时间太久,所以我们减少读取的次数,每次多读取一些数据,我们取最大的值1024还可以取64,128,256,512)。

对于缩小延迟时间这个比较特殊,我们需要单独的说明:我们的延时函数

延时函数

经过我测量在i=10000的时候正好生成周期为1us的方波(LPC1768主频是100MHZ),说明我们的延时函数还是比较精准的。再去查询FPGA从串模式下的最小数据传输间隔时间为2.5ns,LPC1768运行一个语句的时间为1/100MHZ等于10ns,综上所述我们即使不给延时也可以满足FPGA对于时间的间隔,最后查询建立时间和保持时间的要求,也是可以满足的所以我们原来加延时的地方都来可以注释掉。

实验过程中的“坑”

!!!仔细看芯片手册,图上面显示的和下面的注释可能不一样。比如这次LPC1768输出数据的时候时序图上面是低位在前,而底下注释的是高位在前,所以导致最后传输数据结束后FPGA没有配置成功。

第一次写这种分享技术贴,哪里不对希望多多指正,介绍一下自己,我就是一个刚开始工作3个月的应届生,这个项目是我进公司领导给颁布的第一个小项目,自己之前没有接触过这个从串模式,刚开始还是很抗拒的,因为是一个全新的内容,一点头绪都没有,而且网上还没有例程之类的参考,完全是0到1。但是还好坚持下来了,最终完成了这个项目,所以写点小经验来记录一下,如果哪里有错误请指出。

我也是第一次写这个,写作的动力还是因为看到了一个B站UP主“老石谈芯”的一个视频,大概的意思是:

1、你不必是个天才2、每天分享一点内容3、教给别人你会的东西。

所以,以后我也会经常分享工作和学习之中的感悟和经验,我是新入职的硬件工程师,你们好

总结

以上是生活随笔为你收集整理的fpga电平约束有什么作用_FPGA从串模式的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。