RAM 的英文全称是 Random Access
Memory,即随机存取存储器,它可以随时把数据写入任一指定地址的存储单元,也可以随时从任一指定地址中读出数据,其读写速度是由时钟频率决定的。RAM主要用来存放程序及程序执行过程中产生的中间数据、运算结果等。
ISE软件自带了BMG IP核(Block Memory Generator,块 RAM 生成器),可以配置成 RAM 或者ROM。 这两者的区别是 RAM
是一种随机存取存储器,不仅仅可以存储数据,同时支持对存储的数据进行修改;而 ROM
是一种只读存储器,也就是说,在正常工作时只能读出数据,而不能写入数据。需要注意的是,配置 成 RAM 或者 ROM 使用的资源都是 FPGA 内部的
BRAM,只不过配置成 ROM 时只用到了嵌入式 BRAM 的读数据端口。
Spartan-6 系列器件内部的 BRAM 全部是真双端口 RAM(True Dual-Port ram,TDP),这两个端口都可以独立地对 BRAM
进行读/写。但也可以被配置成伪双端口 RAM(Simple Dual-Port ram,SDP)(有两个 端口,但是其中一个只能读,另一个只能写)或单端口
RAM(只有一个端口,读/写只能通过这一个端口来 进行)。单端口 RAM 只有一组数据总线、地址总线、时钟信号以及其他控制信号,而双端口 RAM 具有两
组数据总线、地址总线、时钟信号以及其他控制信号。
首先创建ip核,在搜索栏中输入 block,然后会弹出 Block Memory Generator,选中它然后点击 Next, 会进入 Summary
界面,可以在Summary 界面再次检查一下工程名,工程路径等信息,直接点击 Finish 进入RAM IP 核的参数配置界面。
参数配置第一页:选择接口类型。Native为普通接口,AXI4为总线接口。一般选择Native。
参数配置第二页:可配置的参数较多其中:
Memory Type:存储器类型。可配置成 Single Port RAM(单端口 RAM)、Simple Dual Port RAM(伪 双端口
RAM)、True Dual Port RAM(真双端口 RAM)、Single Port ROM(单端口 ROM)和 Dual Port ROM (双端口
ROM)。
ECC Options:Error Correction Capability,纠错能力选项,单端口 RAM 不支持 ECC。
Write Enable:字节写使能。勾中后可以单独将数据的某个字节写入 RAM 中,这里不使能。
Algorithm:算法选项。可选择 Minimum Area(最小面积)、Low Power(低功耗)和 Fixed Primitives (固定的原语)。
参数配置第三页:主要是配置读写数据的位宽、深度、模式和使能。
Write Width:端口 A 写数据位宽,单位为Bit。
Read Width:端口 A 读数据位宽,一般和写数据位宽保持一致。
Write Depth:写深度,这里设置成32,即RAM所能访问的地址范围为 0-31。
Read Depth:读深度,默认和写深度保持一致。
Operating Mode:RAM 读写操作模式。共分为三种模式,分别是 Write First(写优先模式)、Read First (读优先模式)和
No Change(不变模式)。写优先模式指数据先写入 RAM 中,然后在下一个时钟输出该 数据;读优先模式指数据先写入 RAM 中,同时输出 RAM
中同地址的上一次数据;不变模式指读写分开操作,不能同时进行读写。
Enable Port Type:使能端口类型。Use ENA Pin(添加使能端口 A 信号);Always
Enabled(取消使能信号,端口A一直处于使能状态)。可以设置为一直使能,即代码中可不写使能信号。
参数配置第四页:不需要设置。
参数配置第五页:选择是否添加复位引脚。
参数配置第六页:类似 Summary 界面,保持默认设置即可,直接点击 Generate 生成 RAM IP 核。
接下来就可以对 RAM IP 核进行读写操作了。需要创建一个读写模块和一个顶层模块,读写模块顾名思义,顶层模块主要用来例化 RAM IP 核模块和读写模块。
当代码全部写好后,会发现编译过不了报错,因为所有的逻辑都是在 FPGA 内部进行,内部产生数据,
内部读写,对外界没有产生任何影响,软件会给我们报错。这个时候可以定义一些冗余输出端口,把想要观察的信号赋值给冗余输出端口,这样既方便我们仿真和在线调试,编译也不会再报错。
我们可以看到我将想要观察的信号全部重新定义了一遍加上后缀为_tb,并把它们作为输出端口,然后把想要观察的信号赋值给这些输出端口,这样软件就不会报错了。