| **银杏科技有限公司旗下技术文档发布平台** |||| |技术支持电话|**0379-69926675-801**||| |技术支持邮件|Gingko@vip.163.com||| ^ 版本 ^ 日期 ^ 作者 ^ 修改内容 ^ | V1.0 | 2020-07-03 | gingko | 初次建立 | ===== 实验十五:单口RAM实验——基于单口RAM的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开发平台。 - 电脑一台。 ==== 三、 实验原理 ==== * RAM全称是Random Access Memory(随机存取存储器),是与处理器进行数据交互的存储器。既可向指定地址单元写入信息也可从指定地址单元中读取信息,掉电后数据丢失,属于易失性存储器。 * 单口RAM IP核是FPGA内部常用的一种存储单元,只有一组数据线和地址线,因此不能同时进行读写操作。其操控时序比较简单,以时钟上升沿作为触发事件,在上升沿到来前保证地址和数据稳定即可将数据准确的写入对应的地址单元中,读取时,也是如此。其读写时序如图15-1所示。 {{ :icore4:icore4_fpga_15_1_a_.png?direct |图15-1(a)读时序图}} {{ :icore4:icore4_fpga_15_1_b_.png?direct |图15-1(b) 写时序图}} * 本实验基于ARM+FPGA构架,实验通过Commix向STM32发送读写命令,STM32收到消息后,通过STM32的FSMC总线实现与FPGA通信,FPGA内部建立单口RAM块,FPGA桥接STM32和RAM块,把FSMC总线发送过来的数据放入指定的地址中。 * 本实验首先通过Commix向RAM块的某些地址中写入数据,再通过Commix发送读命令,读取这些地址的数据进行验证。实验的原理如下图所示: {{ :icore4:icore4_fpga_15_2.png?direct |图15-2}} ==== 四、 RAM IP核调用 ==== 1、打开Tool ->Megawizard Plug-In Manager,如图15-3所示。 {{ :icore4:icore4_fpga_15_3.png?direct |图15-3}} 2、在下面界面中保持默认,直接Next即可,如图15-4所示。 {{ :icore4:icore4_fpga_15_4.png?direct |图15-4}} 3、在该界面中选择单口RAM IP核、芯片类型、硬件描述语言类型及IP核相关文件存储位置,如图15-5所示。 {{ :icore4:icore4_fpga_15_5.png?direct |图15-5}} 4、在该对话框中设置数据位宽及RAM的存储深度,选择单时钟控制还是双时钟控制,本例程选择单时钟控制,如图15-6所示。 {{ :icore4:icore4_fpga_15_6.png?direct |图15-6}} 5、在该对话框中设置输出端口是否用寄存器缓存,本例程选择不缓存;增加读使能控制信号,这样方便对时钟的读写进行分时控制,如图15-7所示。 {{ :icore4:icore4_fpga_15_7.png?direct |图15-7}} 6、在此对话框保持默认设置,直接Nrxt即可,如图15-8示。 {{ :icore4:icore4_fpga_15_8.png?direct |图15-8}} 7、直接Next即可,如图15-9所示。 {{ :icore4:icore4_fpga_15_9.png?direct |图15-9}} 8、该界面选择是否生成网表,默认为不选择,一般直接Next即可,如图15-10所示。 {{ :icore4:icore4_fpga_15_10.png?direct |图15-10}} 9、选择要生成的IP核相关文件,没特殊需求直接默认即可,如图15-11 {{ :icore4:icore4_fpga_15_11.png?direct |图15-11}} ==== 五、 代码讲解 ==== IP核调用只是生成相关的模块文件,在应用中要实现存储、读写功能,还需要对IP核进行实例化操作,其例化代码如下: //------------------------------------------------// //单口RAM的缺点在于只有一套数据线和地址线、一个时钟信号,需要分时复用。 //有点在于相同容量的RAM占用的逻辑资源小于双口RAM。 ram u1( .clock(clk), .wren(!wr), .rden(!rd), .address(ab), .data(db), .q(data_out) ); ==== 六、 实验步骤 ==== {{ :icore4:icore4_fpga_15_12.png?direct |图15-12}} - 将硬件正确连接,如图15-12所示。 - 打开Commix串口精灵,打开对应的COM口。 - 打开QuartusII开发环境,并打开实验工程。 - 将FPGA程序下载至iCore4上。 - 打开Keil MDK开发环境,并打开实验工程。 - 将ARM程序烧写如iCore4上。 - 输入串口命令,观察实验现象。 ==== 七、 实验现象 ==== * 通过Commix发送写命令向RAM块中指定的某些地址写入数据,再通过读命令读取这些地址中的某些数据,对比写入与读取数据,可以知道写入数据和读取数据相同。 **命令格式:** * 写FPGA RAM命令 : write:地址(0-255),数据\cr\lf * 读FPGA RAM命令 : read:地址(0-255)\cr\lf 例如: * write:100,60001\cl\lf * read:100\cl\lf {{ :icore4:icore4_fpga_15_13.png?direct |图15-13}} {{ :icore4:icore4_fpga_15_14.png?direct |图15-14}}