| **银杏科技有限公司旗下技术文档发布平台** |||| |技术支持电话|**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分为伪双口RAM和真双口RAM两种,伪双口RAM一个端口只读,另一个端口只写;而真双口RAM两个端口都能读写。在SPI通信实验中,使用的就是伪双口RAM,因此,在本实验中只讲真双口RAM。从整体上讲,真双口RAM和伪双口RAM都能同时进行读写操作;虽然有两个端口,两套数据线和地址线,但是存储数据的空间单元是共享的,因此存储后的数据也是共享的。其基本工作时序和普通RAM一致,都是以时钟上升沿作为触发事件,在上升沿到来前保证地址和数据稳定即可将数据准确的写入对应的地址单元中,读取时,也是如此。其读写时序如图16-1所示。 {{ :icore4:icore4_fpga_16_1_a_.png?direct |16-1(a) 读时序图}} {{ :icore4:icore4_fpga_16_1_b_.png?direct |16-1(b) 写时序图}} * 由于双口RAM有两条相互独立的地址线、数据线和控制线,能实现数据共享,本实验针对双口RAM的工作特点进行实验验证。实验中通过FPGA对RAM的A端口进行读写操作,RAM的A端口先向RAM中写入0到255的数据,然后再读出来,如此循环操作,同时通过Commix向STM32发送命令,STM32收到命令后通过FSMC总线与FPGA实现通信,对RAM的B端口进行都控制,发送一次读命令RAM的B端口把相应地址里的数据发送至ARM,再发送至Commix显示出来以验证实验的成功性。再本实验中验证了双口RAM的两种工作模式: * 1、双口RAM一个端口写操作,另一个端口读操作。 * 2、双口RAM两个端口同时读操作,实验原理图如下图所示。 {{ :icore4:icore4_fpga_16_2.png?direct |图16-2}} ==== 四、 RAM IP核调用 ==== 1、打开Tool ->Megawizard Plug-In Manager,如图16-3所示。 {{ :icore4:icore4_fpga_16_3.png?direct |图16-3}} 2、在下面界面中保持默认,直接Next即可,如图16-4所示。 {{ :icore4:icore4_fpga_16_4.png?direct |图16-4}} 3、在该界面中选择双口RAM IP核、芯片类型、硬件描述语言类型及IP核相关文件存储位置,如图16-5所示。 {{ :icore4:icore4_fpga_16_5.png?direct |图16-5}} 4、在该对话框中选择真双口RAM(两个输入两个输出),存储深度以字节为单位,如图16-6示。 {{ :icore4:icore4_fpga_16_6.png?direct |图16-6}} 5、在该对话框中设置存储深度,如图16-7所示。 {{ :icore4:icore4_fpga_16_7.png?direct |图16-7}} 6、在此对话框选择时钟信号输入方式、增加读使能信号,如图16-8所示。 {{ :icore4:icore4_fpga_16_8.png?direct |图16-8}} 7、直接Next即可,如图16-9所示。 {{ :icore4:icore4_fpga_16_9.png?direct |图16-9}} 8、该对话框直接Next即可,如图16-10所示。 {{ :icore4:icore4_fpga_16_10.png?direct |图16-10}} 9、选择读出的数据是新数据还是老数据,一般设置新数据(New Data),如图16-11所示。 {{ :icore4:icore4_fpga_16_11.png?direct |图16-11}} 10、该对话框设置RAM无初始值,直接Next,如图16-12所示 {{ :icore4:icore4_fpga_16_12.png?direct |图16-12}} 11、直接Next,如图16-13所示。 {{ :icore4:icore4_fpga_16_13.png?direct |图16-13}} 12、选择生成的IP核关联文件类型,如图16-14所示。 {{ :icore4:icore4_fpga_16_14.png?direct |图16-14}} 13、IP核设置完成后出现下面对话框,点击Yes,否则将无法正常调用RAM,如图16-15所示。 {{ :icore4:icore4_fpga_16_15.png?direct&500 |图16-15}} ==== 五、 代码讲解 ==== * IP核调用只是生成相关的模块文件,在应用中要实现存储、读写功能,还需要对IP核进行实例化操作,双口RAM IP核例化代码如下: //------------------------------------------------// //双口RAM的缺点是与单口RAM相比,相同容量的RAM占用逻辑资源比较多。 //优点在于具有2个输入2个输出端口,两个端口都可用于输入输出,可实现同时读写,便于控制。 ram u1( .data_a(data_a), .address_a(address_a), .wren_a(wren_a), .rden_a(rden_a), .clock_a(!clk_a), .q_a(dataout_a), .data_b(db), .address_b(ab), .wren_b(1'd0), .rden_b(!rd), .clock_b(clk_b), .q_b(dataout_b) ); ==== 六、 实验步骤 ==== {{ :icore4:icore4_fpga_16_16.png?direct |图16-16}} - 将硬件正确连接,如图16-16所示。 - 打开Commix串口精灵,找到对应的COM口打开。 - 打开QuartusII开发环境,并打开实验工程。 - 将FPGA程序下载至iCore4上。 - 打开Keil MDK开发环境,并打开实验工程。 - 烧写ARM程序到iCore4上 - 输入串口命令,观察实验现象。 ==== 七、 实验现象 ==== * 一方面,观察FPGA_LED灯的颜色,FPGA向RAM中先写入数据,然后再读出来,读出数据与其地址相等则绿灯常亮。否则红灯亮。 * 另一方面,通过Commix发送读命令读取RAM地址中的数据,对比写入数据与读取的数据,可知道写入与读取的数据相同。 **命令格式:** * 读命令:READ:地址(0-255)\CR\LF * 例如:READ:25\CR\LF {{ :icore4:icore4_fpga_16_17.png?direct |图16-17}}