这里会显示出您选择的修订版和当前版本之间的差别。
后一修订版 | 前一修订版 | ||
基于fifo的arm_fpga数据存取实验 [2019/11/29 10:19] zhangzheng 创建 |
基于fifo的arm_fpga数据存取实验 [2022/03/22 10:30] (当前版本) sean |
||
---|---|---|---|
行 1: | 行 1: | ||
- | [[http://www.cnblogs.com/xiaomagee/p/5687075.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}} |