用户工具

站点工具


基于fifo的arm_fpga数据存取实验

差别

这里会显示出您选择的修订版和当前版本之间的差别。

到此差别页面的链接

两侧同时换到之前的修订记录 前一修订版
后一修订版
前一修订版
基于fifo的arm_fpga数据存取实验 [2019/12/21 11:29]
zhangzheng
基于fifo的arm_fpga数据存取实验 [2022/03/22 10:30] (当前版本)
sean
行 1: 行 1:
-[[http://www.cnblogs.com/xiaomagee/p/7721794.html]]+ 
 + 
 +|  **银杏科技有限公司旗下技术文档发布平台** ​ |||| 
 +|技术支持电话|**0379-69926675-801**||| 
 +|技术支持邮件|Gingko@vip.163.com||| 
 +^  版本 ​ ^  日期 ​ ^  作者 ​ ^  修改内容 ​ ^ 
 +|  V1.0  |  2020-07-03 ​ |  gingko ​ |  初次建立 ​ |  
 + 
 +===== 实验十七:FIFO实验——基于FIFO的ARM与FPGA数据存取 ===== 
 + 
 +==== 一、 实验目的与意义 ==== 
 + 
 +  - 掌握双口RAM IP核的调用及例化方法。 
 +  - 掌握RAM读写时序。 
 +  - 掌握QuartusII的使用方法。 
 +==== 二、 实验设备及平台 ==== 
 + 
 +  - iCore4 双核心板[[https://item.taobao.com/item.htm?​spm=a1z10.1-c-s.w4004-22598974120.15.5923532fsFrHiE&​id=551864196684|点击购买]]。 
 +  - Blaster(或相同功能)仿真器[[https:​//item.taobao.com/​item.htm?​id=554869837940|点击购买]]。 
 +  - JLINK(或相同功能)仿真器。 
 +  - Micro USB线缆。 
 +  - Keil MDK 开发平台。 
 +  - Quartus开发平台。 
 +  - 电脑一台。 
 +==== 三、 实验原理 ==== 
 + 
 +  * FIFO(First Input First Output)是一种先进先出的存储器。与之前的RAM相比较而言,FIFO存储器没有地址线,操作起来更加的简单,但其缺点就在于,只能顺序读写数据,不能随意指定读写数据的地址单元。根据读写时钟的相同与否,FIFO可分为异步FIFO和同步FIFO两种,本实验讲的是异步FIFO。 
 +  * FIFO的读写时钟在每个时钟上升沿到来时对数据进行操作;读写请求信号为高电平有效,低电平失能。 
 +  * FIFO读写操作的工作原理:在FIFO内部有读写指针,其中,读指针指向下一个将要读取数据的地址,复位时指针指向0地址;写指针指向下一个将要写入数据的地址,复位指针指向0地址。 
 +  * FIFO的空/​满检测是FIFO应用中的一个重要参数,不过在应用过程中,这两项参数不是必须使用的,可以通过控制读写时钟及读写请求信号来避免溢出,即通过人为的控制数据长度避免读写溢出(本实验即使如此)。 
 +  * 根据上面的介绍可知,FIFO的读写操作时序如图17-1所示。  
 +{{ :​icore4:​icore4_fpga_17-1_a_.png?​direct |17-1(a)读操作时序}} 
 +{{ :​icore4:​icore4_fpga_17-1_b_.png?​direct |17-1(b)写操作时序}} 
 +  * 本实验通过串口发送命令控制FIFO的读写操作。首先,Commix向ARM发送命令,ARM通过FSMC总线向FIFO中写入数据,当ARM读到满标志时,停止写入,自动从FIFO中读取已写入的数据,通过串口显示出来,对比写入与读取数据的顺序与大小。实验原理如下图所示。 
 +{{ :​icore4:​icore4_fpga_17-2.png?​direct |图17-2}} 
 +==== 四、 FIFO IP核调用 ==== 
 + 
 +1、然后点击Tool ->​Megawizard Plug-In Manager,如图17-3所示。 
 +{{ :​icore4:​icore4_fpga_17-3.png?​direct |图17-3}} 
 +2、在下面界面中保持默认,直接Next即可,如图17-4所示。 
 +{{ :​icore4:​icore4_fpga_17-4.png?​direct |图17-4}} 
 +3、在该界面中选择FIFO IP核、芯片类型、硬件描述语言类型及IP核相关文件存储位置,如图17-5所示。 
 +{{ :​icore4:​icore4_fpga_17-5.png?​direct |图17-5}} 
 +4、在该对话框中设置FIFO的位宽、存储深度,并选择同步还是异步FIFO(一般选择异步),如图17-6所示。 
 +{{ :​icore4:​icore4_fpga_17-6.png?​direct |图17-6}} 
 +5、该对话框保持默认直接Next即可,如图17-7所示。 
 +{{ :​icore4:​icore4_fpga_17-7.png?​direct |图17-7}} 
 +6、在此对话框选择空满标志信号及信号的输出方式(一般满标志选择写方向),如图17-8所示。 
 +{{ :​icore4:​icore4_fpga_17-8.png?​direct |图17-8}} 
 +7、选择读请求的模式,如图17-9所示。 
 +{{ :​icore4:​icore4_fpga_17-9.png?​direct |图17-9}} 
 +8、该对话框选择是否禁用“上溢”和“下溢”检测,一般选择禁用,如图17-10所示。 
 +{{ :​icore4:​icore4_fpga_17-10.png?​direct |图17-10}} 
 +9、保持默认值,直接Next即可,如图17-11所示。 
 +{{ :​icore4:​icore4_fpga_17-11.png?​direct |图17-11}} 
 +10、该对话框选择要生成的FIFO相关文件,一般保持默认即可,如图17-12所示 
 +{{ :​icore4:​icore4_fpga_17-12.png?​direct |图17-12}} 
 +11、IP核设置完成后出现下面对话框,点击Yes,否则将无法正常调用FIFO,如图17-13所示。 
 +{{ :​icore4:​icore4_fpga_17-13.png?​direct |图17-13}} 
 +==== 五、 代码讲解 ==== 
 + 
 +  * IP核调用只是生成相关的模块文件,在应用中要实现存储、读写功能,还需要对IP核进行实例化操作,FIFO IP核例化代码如下: 
 +<code Verilog>​ 
 +//​------------------------------------------------//​ 
 +//​FIFO:​先进先出,主要用于缓存数据。 
 +my_fifo u2( 
 + .data(data_in),​ 
 + .wrreq(1'​d1),​ 
 + .wrclk(wr2),​ 
 + .rdreq(1'​d1),​ 
 + .rdclk(!rd),​ 
 + .wrfull(fifo_full_flag),​ 
 + .q(data_out) 
 +); 
 +</​code>​ 
 +==== 六、 实验步骤 ==== 
 +{{ :​icore4:​icore4_fpga_17-14.png?​direct |图17-14}} 
 +  - 将硬件正确连接,如图17-14所示。 
 +  - 打开Commix,找到对应的COM端口打开。 
 +  - 打开QuartusII开发环境,并打开实验工程。 
 +  - 将FPGA程序下载至iCore4上。 
 +  - 打开Keil MDK开发环境,并打开实验工程。 
 +  - 将ARM程序下载至iCore4上。 
 +  - 输入串口命令,观察实验现象。 
 +==== 七、 实验现象 ==== 
 +  * 在Commix界面对比FIFO写入数据与读取数据的大小和顺序,发现数据的大小和顺序保持一致。 
 +    * 写命令:write_fifo\cl\lf 
 +  
 +{{ :​icore4:​icore4_fpga_17-15.png?​direct |图17-15}} 
基于fifo的arm_fpga数据存取实验.1576898985.txt.gz · 最后更改: 2019/12/21 11:29 由 zhangzheng