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

得到的仿真结果如下:

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

相关推荐
上理考研周导师3 小时前
第二章 虚拟仪器及其构成原理
fpga开发
FPGA技术实战4 小时前
《探索Zynq MPSoC》学习笔记(二)
fpga开发·mpsoc
模拟IC攻城狮12 小时前
华为海思招聘-芯片与器件设计工程师-模拟芯片方向- 机试题-真题套题题目——共8套(每套四十题)
嵌入式硬件·华为·硬件架构·芯片
bigbig猩猩15 小时前
FPGA(现场可编程门阵列)的时序分析
fpga开发
Terasic友晶科技20 小时前
第2篇 使用Intel FPGA Monitor Program创建基于ARM处理器的汇编或C语言工程<二>
fpga开发·汇编语言和c语言
码农阿豪21 小时前
基于Zynq FPGA对雷龙SD NAND的测试
fpga开发·sd nand·spi nand·spi nand flash·工业级tf卡·嵌入式tf卡
江山如画,佳人北望21 小时前
EDA技术简介
fpga开发
淘晶驰AK21 小时前
电子设计竞赛准备经历分享
嵌入式硬件·fpga开发
最好有梦想~21 小时前
FPGA时序分析和约束学习笔记(4、IO传输模型)
笔记·学习·fpga开发
檀越剑指大厂1 天前
【基于Zynq FPGA对雷龙SD NAND的测试】
fpga开发