| **银杏科技有限公司旗下技术文档发布平台** |||| |技术支持电话|**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核例化代码如下: //------------------------------------------------// //FIFO:先进先出,主要用于缓存数据。 my_fifo u2( .data(data_in), .wrreq(1'd1), .wrclk(wr2), .rdreq(1'd1), .rdclk(!rd), .wrfull(fifo_full_flag), .q(data_out) ); ==== 六、 实验步骤 ==== {{ :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}}