FPGA原理与结构——ROM IP的使用与测试

一、前言

本文介绍Block Memory Generator v8.4 IP核实现ROM,在学习一个IP核的使用之前,首先需要对于IP核的具体参数和原理有一个基本的了解,具体可以参考:

FPGA原理与结构------块RAM(Block RAM,BRAM)https://blog.csdn.net/apple_53311083/article/details/132253916?spm=1001.2014.3001.5501 上文介绍了这个IP核使用的底层资源BRAM
FPGA原理与结构------RAM IP核原理学习https://blog.csdn.net/apple_53311083/article/details/132326228?spm=1001.2014.3001.5501 上文详细介绍了这个IP核的各种功能和原理
FPGA原理与结构------RAM IP核的使用与测试https://blog.csdn.net/apple_53311083/article/details/132359524?spm=1001.2014.3001.5501

上文介绍了这个这个IP核例化RAM的具体使用方式与测试,虽然本文主要介绍ROM,但是ROM其实完全可以看作一个不具备写功能的RAM,所以如果能够理解RAM的使用,那么ROM的使用也就是水到渠成的。

二、ROM 简介

ROM经常被拿来与RAM一起比较,两者最大的区别就在于RAM可读可写,ROM只能读,不能写。ROM(只读存储器(Read-Only Memory)),其特点是特点:非易失性,只能读出不能写入。常见的ROM可以参见下表:

|------------------|--------------------------------------------------------------|
| 掩膜ROM | 由厂家"固化",不可更改 |
| 可编程ROM(PROM) | 熔丝烧断改写存储数据,只可编写一次 |
| 可擦除可编程ROM(EPROM) | 浮栅MOS管,多次编程和擦除数据。可分为紫外线可擦除可编程ROM(UVEPROM)和电可擦除可编程ROM(E2PROM) |

在这里我们使用到的Block Memory Generator v8.4 IP核是使用FPGA硬件底层中的BRAM资源,BRAM可以实现RAM,ROM和FIFO。我们知道BRAM实现的RAM可以分成的单端口,简单双端口和真双端口3种。考虑到ROM只可读不可写,BRAM实现的ROM有单端口和双端口两种。

(1)Single Port :单口 ROM

不能写入,只有一个端口用于数据读

(2)Dual port:双端口 ROM

不可写,但是有2个端口用于读,两个端口读取数据的位宽可以不同,但是必须是整数倍关系

三、ROM IP核定制

1、ROM IP核

step1 打开vivado工程,点击左侧栏中的IP Catalog

step2 在搜索栏搜索ROM,找到Block Memory Generator IP 核

2、ROM IP核定制

step3 Basic界面定制

①Component Name : IP核名字

②Interface Type : 接口类型,可选Native类型和AXI4类型,这里我们选Native类型

Memory Type : 存储器类型选择,对于ROM来说有2种可选,单端口和双端口。

③ECC Options :Error Correction Capability,纠错能力选项,单端口 ROM 不支持 ECC。

④Write Enable:字节写使能选项,ROM不具备写功能。

⑤Algorithm Options:算法选项。可选择 Minimum Area(最小面积)、Low Power(低功耗)和 Fixed Primitives(固定原语),这里选择默认的 Minimum Area。

step4 端口定制

这里我们选择的是单端口模式,所以只需要配置Port A一个端口,如果是双端口模式需要独立配置两个端口。

① Memory Size

Port A Width : 数据位宽

Port A Depth : 数据深度

② Operating Mode : 对于ROM来说是不可选的

Enable Port Type:使能端口类型。Use ENA pin(添加使能端口 A 信号);Always Enabled(取消使能信号,端口 A 一直处于使能状态),这里选择默认的 Use ENA pin。

③ Port A Optional Output Register:端口 A 输出寄存器选项。其中"Primitives Output Register"默认是选中状态,作用是打开 BRAM 内部位于输出数据总线之后的输出流水线寄存器,虽然在一般设计中为了改善时序性能会保持此选项的默认勾选状态,但是这会使得 BRAM 输出的数据延迟一拍,在这里我们只是进行一个简单的例化测试,为了使得我们的效果直观,我们不进行勾选。

④ Port A Output Reset Options:ROM 输出寄存器复位信号选项,这里不添加复位信号,保持默认即可。(注意是对输出寄存器复位,不是对ROM的复位)

⑤ READ Address Change A : 这是对于ultrascale系类的,普通的7系类不适用。

step5 Other Options

① Pipeline Stages within Mux:当使用多个BRAM资源来构成一个较大的RAM时,IP核提供了可选的0~3流水线结构来帮助优化性能,这里我们的ROM很小,一块BRAM(18Kb)就可以实现,所以不需要 。

② Memory Initialization : 内存初始化,简单说就是给ROM进行赋初值,可以有两种方式,一种是通过Coe文件写入,还有一种是直接把RAM赋同一个值,这里我们选择的就是第一种,通过Coe文件的形式写入

radix:使用的进制数,可选2,10,16

vector:初始化使用的数据,写入时用逗号隔开(这里是写入后的状态)

③ :这里都是一些仿真的打印信息,我们保持默认。

step6 Summary

最后通过Summary进行一个回顾和检查

3、IP核例化

step7 例化

例化代码如下:

复制代码
module top(
    input clk,                     //时钟信号
    input ena,                     //使能信号
    input [4:0]addra,              //地址

    output [7:0]douta              //输出信号
    );

    rom_v1 rom_u1(
      .clka(clk),
      .ena(ena),
      .addra(addra),
      .douta(douta)
    );

endmodule

四、IP核测试

首先编写测试文件如下:

复制代码
`timescale 1ns / 1ps
module tb_top();

reg clk;                //时钟
reg ena;                //使能信号
reg [4:0]addra;         //地址
wire [7:0]douta;             //输出信号

initial begin 
    clk = 0;
    ena = 0;
    addra = 0;
#30
    ena = 1;
    repeat(32) begin
    #10 addra = addra + 1;
    end
#20
    ena = 0;
    $finish;
end

always #5 clk = ~clk;

top top_u1(
    .clk(clk),
    .ena(ena),
    .addra(addra),
    .douta(douta)
);

endmodule

得到的仿真结果如下:

可以看到使能信号的拉高后,数据随着地址的增加被依次读出,功能验证正常。

相关推荐
cycf8 小时前
CRC校验
fpga开发
landyjzlai9 小时前
AMBA总线(15)关于AXI-stream(sg模式)
arm开发·fpga开发·amba
白狐_7989 小时前
Quartus Prime 新手完全使用指南
fpga开发
Aaron158820 小时前
三种主流接收机架构(超外差、零中频、射频直采)对比及发展趋势浅析
c语言·人工智能·算法·fpga开发·架构·硬件架构·信号处理
博览鸿蒙20 小时前
一颗数字系统是如何在 FPGA 上“跑起来”的?
fpga开发
雨洛lhw1 天前
FPGA JTAG接口设计全解析
fpga开发·jtag
minglie11 天前
iverilog 配合 Makefile 搭建 Verilog 仿真工程
fpga开发
芒果树技术1 天前
MangoTree案例分享:基于AtomRIO FPGA平台,客户实现自适应主动减振
测试工具·fpga开发·模块测试
雨洛lhw1 天前
按键电路设计的细节
fpga开发
minglie12 天前
vio_uart的浏览器版上位机
fpga开发