| **银杏科技有限公司旗下技术文档发布平台** |||| |技术支持电话|**0379-69926675-801**||| |技术支持邮件|Gingko@vip.163.com||| ^ 版本 ^ 日期 ^ 作者 ^ 修改内容 ^ | V1.0 | 2020-03-07 | gingko | 初次建立 | ===== 实验二十:基于单口RAM的ARM+FPGA 数据存取实验 ===== ==== 一、 实验目的与意义 ==== - 掌握单口RAM IP核的调用及例化方法。 - 掌握RAM读写时序。 - 掌握QuartusII的使用方法。 ==== 二、 实验设备及平台 ==== - iCore4T 双核心板。 - iTool A(或相同功能)仿真器。 - USB Type C 线缆。 - Keil MDK 开发平台。 - Quartus开发平台。 - 电脑一台。 ==== 三、 实验原理 ==== * RAM全称是Random Access Memory(随机存取存储器),是与处理器进行数据交互的存储器。既可向指定地址单元写入信息也可从指定地址单元中读取信息,掉电后数据丢失,属于易失性存储器。 * 单口RAM IP核是FPGA内部常用的一种存储单元,只有一组数据线和地址线,因此不能同时进行读写操作。其操控时序比较简单,以时钟上升沿作为触发事件,在上升沿到来前保证地址和数据稳定即可将数据准确的写入对应的地址单元中,读取时,也是如此。其读写时序如图20.1所示。 * 20.1(a) 读时序图 {{ :icore4t:icore4t_fpga_20_1_a_.png?direct |20.1(a) 读时序图}} * 20.1(b) 读时序图 {{ :icore4t:icore4t_fpga_20_1_b_.png?direct |20.1(b) 写时序图}} * 本实验基于ARM+FPGA构架,通过SPI实现ARM与FPGA之间通信,以单口RAM作为FPGA内部的数据存储器,实现ARM对数据的读写功能。 ==== 四、 RAM IP核调用 ==== 1、新建一个工程名为pll的工程,然后点击Tool ->Megawizard Plug-In Manager,如图20.2所示。 {{ :icore4t:icore4t_fpga_20_2.png?direct |图20.2}} 2、在下面界面中保持默认,直接Next即可,如图20.3所示。 {{ :icore4t:icore4t_fpga_20_3.png?direct |图20.3}} 3、在该界面中选择单口RAM IP核、芯片类型、硬件描述语言类型及IP核相关文件存储位置,如图20.4所示。 {{ :icore4t:icore4t_fpga_20_4.png?direct |图20.4}} 4、在该对话框中设置数据位宽及RAM的存储深度,选择单时钟控制还是双时钟控制,本例程选择单时钟控制,如图20.5所示。 {{ :icore4t:icore4t_fpga_20_5.png?direct |图20.5}} 5、在该对话框中设置输出端口是否用寄存器缓存,本例程选择不缓存;增加读使能控制信号,这样方便对时钟的读写进行分时控制,如图20.6所示。 {{ :icore4t:icore4t_fpga_20_6.png?direct |图20.6}} 6、在此对话框保持默认设置,直接Next即可,如图20.7所示。 {{ :icore4t:icore4t_fpga_20_7.png?direct |图20.7}} 7、直接Next即可,如图20.8所示。 {{ :icore4t:icore4t_fpga_20_8.png?direct |图20.8}} 8、该界面选择是否生成网表,默认为不选择,一般直接Next即可,如图20.9所示。 {{ :icore4t:icore4t_fpga_20_9.png?direct |图20.9}} 9、选择要生成的IP核相关文件,没特殊需求直接默认即可,如图20.10所示。 {{ :icore4t:icore4t_fpga_20_10.png?direct |图20.10}} ==== 五、 代码讲解 ==== * IP核调用只是生成相关的模块文件,在应用中要实现存储、读写功能,还需要对IP核进行实例化操作,其例化代码如下: //------------------------------------------------// //spi_ram //负责存储SPI通信的数据(具体的存储位置可通过spi命令寄存器设置) //单口RAM的缺点在于只有一套数据线和地址线、一个时钟信号,需要分时复用。 //有点在于相同容量的RAM占用的逻辑资源小于双口RAM。 spi_ram u0( .clock(clk), .wren(wr_en), .address(address), .data(receive_byte), .rden(rd_en), .q(data_out) ); ==== 六、 实验步骤及实验结果 ==== * 1、将硬件正确连接,如图20.11所示。 {{ :icore4t:icore4t_ide_1_37.jpg?600 |图20.11}} * 2、打开putty串口调试工具,打开设备管理器查看对应的端口信息,在putty中打开对应的端口,用于打印串口信息及控制RAM读写; * 3、将编写好的FPGA代码进行编译,并下载到开发板中; * 4、将编写好的ARM代码编译,并下载到开发板中,putty工具中会打印相应的SPI通信相关信息(若想多次测试,查看结果在putty中输入“test”即可); * 5、观察实验现象及putty终端打印信息——FPGA_LED闪烁,putty终端打印如图20.12所示. {{ :icore4t:icore4t_fpga_20_12.png?direct |图20.12}} ==== 七、 拓展实验 ==== - 通过Signaltap观察RAM读写时序是否和参考时序一致。 - 别设置双时钟和输出端口增加寄存器,看看读取数据有什么变化。