系列文章目录
前言
最近在学习小梅哥的xilinx型FPGA开发板,一边学习一边记录,简化整理一下笔记
ROM IP
在 Memories &Storage Elements 下可以看到有两个与 ROM 相关的 IP,一个是 Distributed Memory Generator,另一个是 Block Memory Generator
两种生成的 Core所占用的 FPGA 资源不一样
Distributed Memory Generator 生成的 ROM/RAM Core 占用的资源是 LUT(查找表,查找表本质就是一个小的 RAM);
可以生成:Distributed ROM、Distributed Single-Port RAM、Distributed Dual-Port RAM、Distributed Simple Dual-Port RAM
Block Memory Generator 生成的 ROM/RAM Core 占用的资源是 Block Memory(嵌入式的硬件 RAM)
ROM即随机只读存储器,所以一般只能读,我们可以编写COE文件,与生成的ROM进行绑定,这样从ROM读出来的数据就是我们自定义的
这里还有一种URAM,Ultra RAM是一种高性能、低延迟的存储器资源,实现大容量的存储和高带宽的存储访问,暂时还没有涉及该方面
分布式ROM生成
ROM配置
选择Distributed Memory Generator来生成IP核
Depth:设置 ROM 深度
Data Width:设置数据位宽
Memory Type:选择存储类型,这里选择 ROM
Input Options:设置是否对输入的地址增加一级寄存器,设置选择 Registered,对输入的地址增加一级寄存器,会发现多了一个CLK
Output Option:设置是否对输出的地址增加一级寄存器,这里选择 Both,输出数据信号 spo 和增加一级寄存器后的输出数据信号 qspo 都从端口引出。下面还有个 SinglePort Output CE 可选配,当勾选后,ROM Core 就会多出一个 qspo_ce 的端口,这个信号是用来控制使能输出寄存器的时钟。
Pipeline Stages:流水线级数,在生成 ROM 模式下,不可配。
添加 COE 文件位置,可以通过选择路径添加已有的 COE 文件,软件会通过 COE 文件生成 ROM 初始化文件 MIF 文件。
没有也可以直接创建编辑
COE Options:设置 ROM 中初始化数据没有覆盖的区域的数值,比如 ROM 深度 256,添加的 COE 文件中仅初始化了 200 个数据,这里就是统一设置剩下的 56 个数据的数值。Radix是进制
Reset Options:添加输出寄存器复位信号,可添加同步复位或异步复位
ce overrides 设置:
CE Overrides Sync Controls:在选择了输出寄存器同步复位和时钟使能才能启用,启用后,同步控制由时钟使能限定。
Sync Controls Overrides CE:在选择了输出寄存器同步复位和时钟使能才能启用,启用后,同步控制信号会工作,不受时钟使能限定。
前面未勾选时钟使能信号 CE,这里就不可设置,保持默认即可。
这里的a是输入地址,clk是时钟,qspo_ce是qspo的使能,不要也行,qspo是寄存一级的输出,spo是直接输出,qspo会比spo慢一个时钟周期
创建COE文件
新建行,添加进制和数据信息
memory_initialization_radix 是 ROM 初始化数值进制设置,对应后面 Value 值可设置 2,10,16,分别表示 2 进制,10 进制,16 进制。
memory_initialization_vector 是 ROM 初始化数据向量,对应后面 Value 值就是填写 ROM 初始化的数据,数据与数据之间通过空格或逗号隔开,数据个数不允许超过设置 ROM 的深度(可以少于设置的深度),数据不允许为负数。
注:Key 和 Value 里面填写内容不区分大小写。
设置完成后保存即可(软件会自动validate验证编写对否)
IP Source 窗 口 IP Synthesis 下 看 到 有dist_mem_rom_ip.mif 文件,这个文件就是 IP 生成过程中通过我们添加的 coe 文件自动生成的,这点和 quartus 有所不同(quartus 是用户直接添加指定 mif 文件)。有一点比 quartus 好的就是在 ROM Core 建立时 vivado 软件会根据用户添加 coe 文件以及设置 ROM 参数(深度,位宽)对 coe 文件进行校验,如果不符合要求会提示相关错误,可以有效避免初始化文件不匹配的问题。
mif文件可以用matlab来写txt生成一个我们想要的数据,当我们想要更换COE文件的时候,对 rom IP 进行重新的设置
重新绑定COE文件就行
块ROM生成
使用硬件块 RAM 资源的 ROM IP,点击 Block Memory Generator
Interface选项有两种接口,一种是常规接口,一种是AXI 接口
memory type有 ROM 和 RAM 两种类型,ROM 又分为单端口 ROM 和双端口ROM。对于 RAM 而言,有三种可选项,单端口 RAM、简单双端口 RAM 和真双端口 RAM。
单端口 ROM,一个时钟,一个地址通道,一个数据通道。
双端口 ROM,两个时钟,两个地址通道,两个数据通道,可同时在两个时钟域下读取地址 ROM 中的数据。(相当于两个ROM)
Algorithm Options 算法类型:有三种选项可选,最小面积、低功耗、固定原语。(可查手册)
memory size设置位宽和深度
端口使能信号类型设置,一个是一直使能,一个是通过一个 ENA 信号管脚控制
Prot A Output Reset Options: 端口 A 输出置位/复位设置,这里置位/复位并不复位RAM 中的数据而是只复位寄存器上的值。
勾选 Load Init File,加载初始化文件,这里可以加载上面生成的 coe 文件,下面的 Fill Remaining Memory Location 是用来填充初始化文件没有覆盖的地址区域的数值(类似前面介绍的意思)
Latentcy 指的是相对于某个时钟起始位的 1 个或多个时钟后数据才有效,一般以时钟为单位,这里表示的是时钟采集到读数据地址到数据有效的时间间隔
这里 Latency 等于 3,是因为我们前面配置同时勾选了Primitives Output Register和 Core Output Register,相当于数据打了两拍。
如何快速生成Example Design
在 PROJECT 窗口的 IP Sources 中找到我们生成的 block ROM IP ,右键找到 Open IP Example Design。
会生成一个新的项目,会用VHDL帮我们写一个测试文件,然后我们自己Run Simulation就行了
两种ROM对比
在这里面可以看到具体资源使用情况,包括每个模块使用后的资源情况。
使用了 29 LUT、8 个触发器、12 个 F7 的选择器、6 个 F8 的选择器、17 个 IO资源(1 个时钟输入,8 个地址输入线,8 个数据输出线)
还有消耗了 Slice 和 Slice LUTs
CLB(Configurable Logic Block,可配置逻辑快)资源:包含了 2 个 Slice,每个 Slice 包含 4 个 6 输入 LUT、进位链、3 个多路复用器和 8 个寄存器,一个 LUT 逻辑容量为 2^6bit,
Block RAM生成的块 ROM IP,只使用了寄存器和 Block
RAM 资源。没有消耗 LUT 资源。