1)实验平台:正点原子新起点V2开发板 2)平台购买地址:https://detail.tmall.com/item.htm?id=609758951113 2)全套实验源码+手册+视频下载地址:http://www.openedv.com/thread-300792-1-1.html 3)对正点原子FPGA感兴趣的同学可以加群讨论:994244016 4)关注正点原子公众号,获取最新资料更新
第十九章IP核之双端口RAM实验
在“IP核之单端口RAM实验”中,我们成功实现了对单端口RAM IP核的读写操作,本章我们将通过Quartus II软件生成一个双端口的RAM IP核,并对其进行读写操作。 本章包括以下几个部分: 1919.1简介 19.2实验任务 19.3硬件设计 19.4程序设计 19.5下载验证
19.1简介 我们知道,RAM IP核分为单端口RAM和双端口RAM,即表示RAM IP核有几个读写端口。对于单端口RAM来说,由于读写共用一对地址线,所以没有办法同时读写不同地址的数据;而对于双端口RAM来说,由于读写地址线是分开的,所以可以同时读写不同地址的数据。 双端口RAM又分为简单双端口RAM和真双端口RAM,顾名思义,简单双端口RAM虽然有两个端口,但是一个端口只能用来写,另一个端口只能用来读,所以简单双端口RAM也称为伪双端口RAM。而真双端口RAM是指两个端口都可以用来写或者读,可以理解成具有两个独立的单端口的RAM,一般用于需要多路写入和读出的情况,而不用例化两个单端口的RAM,在使用上更为方便。 在实际开发应用中,对于单端口RAM、伪双端口RAM和真双端口RAM的选择,需要根据项目需求来选择合适的RAM。对于不需要同时读写RAM的情况,可以选择单端口RAM;对于需要同时读写RAM,但是只需要一路数据写入,一路数据读出的情况,可以选择简单双端口RAM;而对于需要同时读写RAM,有又两个写入或者读出的情况,可以选择真双端口RAM。双端口RAM一般对于异步数据的缓存使用较多,因此本章使用的是简单双端口RAM IP。 下图为简单双单端口RAM的端口框图。
图 19.1.1 简单双端口RAM端口框图 单端口RAM的端口描述如下: data:RAM写数据端口; wraddress:RAM写地址端口; wren:写使能信号,高电平有效; byteena:字节使能控制,该功能屏蔽了输入数据,这样仅写入数据中指定字节,未被写入的字节保留之前写入的值。当写入数据的位宽为16位、18位、32位和36位时,M9K模块将支持字节使能,wren信号以及字节byteena信号一起控制RAM模块的写操作。byteena信号在RAM IP核创建过程中是可选的,可选择是否使用字节使能控制功能。 wr_addressstall:写地址时钟使能控制,当wr_addressstall信号为高电平时,有效地址时钟使能就会保持之前的地址。wr_addressstall信号在RAM IP核创建过程中是可选的,可选择是否使用地址使能控制功能。 wrclock:写时钟; wrclocken:写时钟使能信号,高电平有效; aclr:异步复位信号,高电平有效; rdaddress:RAM读地址端口; rden:读使能信号,高电平有效; q:从RAM中读出的数据; rd_addressstall:读地址时钟使能控制,当rd_addressstall信号为高电平时,有效地址时钟使能就会保持之前的地址。rd_addressstall信号在RAM IP核创建过程中是可选的,可选择是否使用地址使能控制功能。 rdclock:读时钟; rdclocken:读时钟使能信号,高电平有效; 19.2实验任务 本节实验任务是使用Altera RAM IP核生成一个简单双端口的RAM,然后对RAM进行读写操作,并通过Modelsim软件进行仿真及SignalTap软件进行在线调试。 19.3硬件设计 本章实验只用到了输入的时钟信号和按键复位信号,没有用到其它硬件外设。 本实验中,各端口信号的管脚分配如下表所示。 表 19.3.1 IP核之RAM实验管脚分配
因为引脚数极少这里就不再给出TCL管脚约束语句了。 19.4程序设计 根据实验任务要求和模块化设计的思想,我们需要如下5个模块:简单双端口RAM模块、写RAM模块、读RAM模块、PLL IP核模块以及顶层模块,顶层模块例化其余模块实现前四个模块的数据交互。由于双端口RAM多用于跨时钟域信号的处理,所以本实验我们使用两个不同的时钟分别作为RAM的写时钟和读时钟,这两个时钟由PLL IP核生成,输出的时钟分别是50Mhz和25Mhz。系统的功能框图如下所示:
图 19.4.1 IP核之双端口RAM IP核系统框图 由上图可知,PLL IP核输出两个时钟,分别作为写RAM模块和读RAM模块的时钟;写RAM模块负责向RAM中写入数据,而读RAM模块负责从RAM中读出数据。和“IP核之单端口RAM实验”不同的是,本次试验只在上电后写入一次,然后不断地从RAM中读出数据。 首先创建一个名为ip_2port_ram的工程,在这里我们就不再给出Quartus II软件创建工程的详细过程,如果大家对Quartus II软件的创建过程还不熟悉的话,可以参考“第四章 Quartus II软件的安装和使用”章节中的Quartus II软件的使用部分。新建后的工程如下图所示:
图 19.4.2工程新建完成页面 创建好了工程以后,接下来我们创建RAM IP核。我们在Quartus II软件的菜单栏中找到【Tools】→【MegaWizard Plug-In Manager】按钮并点击打开,Tool工具栏打开页面及打开后弹出的页面如图 18.4.2和图 18.4.3所示。
图 19.4.3 工具栏打开IP核页面
图 19.4.4 创建IP核向导页面 在该页面中,可以看到有三个选项,第一个是创建一个新的IP核,第二个是编辑一个已经创建好的IP核,第三个是复制一个已经创建好的IP核。因为我们这里是首次创建IP核,因此直接选择默认的第一个选项,然后点击【Next>】,进入下图所示页面。
图 19.4.5 选择RAM:2-PORT IP核页面 在该页面中,我们在Memory Compiler下找到RAM:2-PORT,单击选中它,然后我们需要为RAM IP核选择保存的路径及名称。首先大家在工程所在路径par文件夹下创建一个文件夹ipcore,由于本次实验会用到多个IP核,为了方便管理IP核,我们在ipcore文件夹下创建一个ram_2port文件夹,用于存放RAM IP核(如果之前没有创建ipcore和ram_2port文件夹的话)。 然后在“What name do you want for the output file”一栏中输入IP存放的路径及名称,这里我们命名为ram_2port并且选择创建的IP核代码为Verilog HDL。完成这些设置以后,我们点击【Next>】,进入下图所示页面。
图 19.4.6 RAM IP核参数配置页面 “How will you be using the dual port RAM?”:用于指定双端口RAM的类型,第一个选项选择简单双端口RAM,第二个选项选择真双端口RAM,此处选择第一个(With one read prot and one write port)。 “How do you want to specify the memory size?”:用于指定存储器大小,第一个选项以“word”为单位,第二个选项以“bit”为单位,此处选择第一个(As a number of words); 然后我们直接点击【Next>】,进入下图所示页面。
图 19.4.7 RAM存储深度、位宽配置页面 “How many 8-bit words of memory?”:用于设置RAM的存储深度,此处设置为32。 “How wide should the ‘data_a’ input bus be?”:用于RAM的数据位宽,此处设置为8; 其余设置保持默认即可,配置完成后,我们就可以点击【Next】,进入下图所示页面。
图 19.4.8 RAM时钟、读使能配置页面 “What clocking method do you want to use?”:用于设置双端口RAM的时钟,此处选择第二个(Dual clock:use separate ‘read’ and ‘write’ clocks),即写端口和读端口选择独立的时钟。 “Create a ‘rden’ read enable signal”:选择是否勾选读使能信号,如果不勾选则一直在读,此处勾中这个选项。 配置完成后,我们就可以点击【Next】,进入下图所示页面。
图 19.4.9 RAM 输出寄存器配置 Read output port(s) ‘q’:选择是否寄存输出信号q,如果选中的话,从RAM中读到的q会多延时一个时钟周期输出,此处不勾选。 其余设置保持默认即可,配置完成后,我们就可以点击【Next】,进入下图所示页面。
图 19.4.10 RAM初始化配置 从该页面中,我们可以看出,该页面就是对RAM初始化页面。需要注意的是,后面我们还会学习ROM IP核的创建过程,这里和ROM IP核不同的是,ROM IP核不能设置为 No,只能设置为Yes,而我们的 RAM IP 核,我们可以设置为空,也可以进行初始化。在这里我们保持默认设置即可,直接点击【Next】,进入下图所示页面。
图 19.4.11 EDA的配置页面 从该页面中,我们可以看出,如果我们想要仿真RAM IP核,那么我们需要添加altera_mf仿真库。如果我们想要将此RAM IP核用在其他的EDA工具上,我们可以通过选择Generate netlist这个选项来生成IP_syn.v文件,用于其他的EDA工具中。这里需要注意的是,并不是所有的第三方 EDA工具都支持。在这里直接点击【Next】,进入下图所示页面。
图 19.4.12 Summary 的配置页面 此处勾选ram_2port_inst.v和ram_2port_bb.v,方便对IP核的例化,然后我们点击【Finish】完成整个IP核的创建。接下来Quartus II软件会在ipcore文件夹下创建RAM IP核生成的文件,然后询问我们是否添加至工程,点击“YES”按钮将生成的IP核添加至工程,如下图所示页面。
图 19.4.13 IP核添加至工程确认界面 接下来返回到工程界面,在File界面里,我们可以看到生成的ram_2port.qip和ram_2port.v已经添加到工程中。qip是Quartus IP的缩写,我们打开qip的文件可以看到如下图所示的脚本代码。
图 19.4.14 ram_2port.qip文件内容 上图中红色框标注的意思是把ram_2port.v文件添加到工程,如果大家在添加IP核后工程里面只有ram_2port.qip文件,而没有ram_2port.v的话也没有关系,工程中只添加ram_2port.qip文件也是可以的。 添加完RAM IP核后,可以在IP核所在的路径下打开ram_2port.v代码,如下图所示。
图 19.4.15 RAM IP核添加至工程界面 上图中我们可以看到,ram_2port模块的端口分别为:data(ram写数据)、rdaddress(ram读地址)、rdclock(ram读时钟)、rden(ram读使能信号)、wraddress(ram写地址)、wrclock(ram写时钟)、wren(ram写使能信号)和q(ram读出的数据)。当我们需要写入数据时,把wren信号拉高的同时,给出写地址(wraddress)和写数据(data),数据就会按照指定的地址写入对应的存储单元;当我们需要读数据时,把rden信号拉高,给出读地址(rdaddress),q(ram读出的数据)就会根据指定的地址输出对应存储单元的数据。 至此,RAM IP核的创建已经全部完成,如果需要修改IP核的话,点击在Quartus II软件的菜单栏中找到【Tools】→【MegaWizard Plug-In Manager】按钮并点击打开,下图为打开后的页面。
图 19.4.16 修改IP核页面 和我们第一次创建IP核不同的是,这一次我们选择第二个选项,修改已经存在的IP核,然后点击【Next>】,进入选择IP核路径页面,双击ipcore文件夹,进入下图所示页面。然后双击ram_2port.v文件或者选中ram_2port.v文件,点击【Next>】开始重新配置RAM IP核。
图 19.4.17 选择需要修改的IP核路径页面 除此之外,我们再创建一个PLL IP核(命名为pll_clk),共输出两路时钟,时钟频率分别是50Mhz和25Mhz,存放路径为par/ipcore/pll_clk,如下图所示,创建过程此处不再赘述。 接下来我们设计一个verilog文件对ram进行写入数据,文件名为ram_wr.v,编写的verilog代码如下。
1 module ram_wr(
2 input clk, //时钟信号
3 input rst_n, //复位信号,低电平有效
4
5 //RAM写端口操作
6 output ram_wr_en, //ram写使能
7 output reg [4:0] ram_wr_addr, //ram写地址
8 output reg [7:0] ram_wr_data //ram写数据
9 );
10
11 //reg define
12 reg [5:0] wr_cnt; //写计数器
13
14 //*****************************************************
15 //** main code
16 //*****************************************************
17
18 //wr_cnt计数范围在0~31,ram_wr_en为高电平
19 assign ram_wr_en = ((wr_cnt>=6'd0) && (wr_cnt
关注
打赏
最近更新
- 深拷贝和浅拷贝的区别(重点)
- 【Vue】走进Vue框架世界
- 【云服务器】项目部署—搭建网站—vue电商后台管理系统
- 【React介绍】 一文带你深入React
- 【React】React组件实例的三大属性之state,props,refs(你学废了吗)
- 【脚手架VueCLI】从零开始,创建一个VUE项目
- 【React】深入理解React组件生命周期----图文详解(含代码)
- 【React】DOM的Diffing算法是什么?以及DOM中key的作用----经典面试题
- 【React】1_使用React脚手架创建项目步骤--------详解(含项目结构说明)
- 【React】2_如何使用react脚手架写一个简单的页面?