vivado生成BRAM ROM表

本文介绍如何在Vivado下使用BRAM作为ROM,并以zc702开发板为例,详细讲解了从添加IP到生成bit文件的过程,包括设置BRAM接口、配置BlockMemoryGenerator以及ROM初始化文件的加载。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


在vivado下使用bram的文章很多,这里我想用的bram作为ROM使用。在zc702开发板上实现。

首先在vivado的block design中添加IP,选择axi bram进行搜索,选择“AXI BRAM Controller”,如下图所示

image

然后输入blk,进行搜索,选择“Block Memory Generator”

image

然后使用推荐的连接自动化“Run Connection Automation”,进行连接。

image

在“AXI BRAM Controller”的设置中,设置BRAM接口为1个,如下图所示

image

然后双击“blk mem”模块,进行属性编辑,在“Basic”标签下设置为single port ROM模式

image

然后在“Other Options”标签下,选择“Load Init File”,如下图所示

image

xilinx支持的ROM初始化文件格式为.coe文件。

coe文件的格式如下,第一行为设置数据的进制,如下图为10进制,然后是数据,以逗号分隔,以分号结尾。

image

在“Other Options”标签下的“Edit”可以对coe文件的有效性(格式)进行验证,验证成功后,再“generate output products”,生成bit文件。需要说明一下,最终起作用的是.mif文件;

image

在vivado的“Address Editor”中查看一下bram对应的ROM的地址,便于在sdk中通过代码读取数据。

image

将生成的bit文件导入SDK,新建sdk工程,由于以前建立的基于ucos的工程,所以在hello world的工程模板中,增加了读取ROM的代码,如下

image

sdk中调试运行结果如下

image

### 如何在Vivado中实例化ROM #### 使用Block Memory Generator IP核实现ROMVivado中,可以通过IP Catalog中的`Block Memory Generator`模块来快速生成和配置ROM。以下是具体的方法: 1. **创建项目并添加IP核** 打开Vivado软件,新建一个FPGA工程或者打开已有的工程。进入`Sources`窗口,在右键菜单中选择`Add Sources -> Add or Create Block Design`。随后在弹出的对话框中选择`Create File`。 2. **搜索Block Memory Generator** 在IP Catalog中输入关键词`Block Memory Generator`进行搜索,并双击该选项以启动向导程序[^3]。 3. **配置参数** 配置界面提供了多种选项供用户调整: - 设置存储器类型为`Single Port ROM`或`True Dual Port ROM`。 - 定义地址宽度(Address Width)以及数据位宽(Data Width)。这些数值决定了最终ROM的实际容量大小。 - 如果有预先定义好的初始化文件,则可以在此处加载`.coe`, `.hex`, 或者其他支持格式的数据文件作为初始内容填充到ROM里去。 4. **生成HDL代码** 当完成所有必要的设定之后点击Generate按钮让工具自动生成对应的硬件描述语言(HDL)源码文件。此过程可能还会连带生产一些辅助性的脚本比如TCL命令集等方便后续集成操作使用。 5. **实例化模板调用** 成功生成后的下一步就是把新建立起来这个特定规格下的ROM单元加入到整个系统架构当中去了。通常做法是从输出目录找到相应版本号命名开头带有“blk_mem_gen”的verilog/vhdl形式接口声明语句复制粘贴至顶层实体或者其他子模块内部合适位置即可完成基本连接工作[^3]。 下面给出一段简单的Verilog示例代码展示如何引用之前由BMG生成出来的ROM资源: ```verilog // Example instantiation of a single port ROM using BMG output ports. bmg_rom_instance_name your_instance_name ( .clka(clk), // input wire clka .addra(addr), // input wire [ADDR_WIDTH-1 : 0] addra .douta(dout)); // output wire [DATA_WIDTH-1 : 0] douta ``` 注意替换其中的关键字部分如`your_instance_name`为你实际想要赋予的名字;还有括弧内的信号名称也要按照自己电路需求重新规划匹配好才行。 另外还有一种方式可以直接利用属性标注的形式指导综合工具采用何种物理结构构建只读存储区域——即所谓rom_style约束条件设置法。如下所示便是典型的应用场景之一: ```verilog (* rom_style = "distributed" *) reg [7:0] my_distributed_rom [0:255]; always @(*) begin data_out = my_distributed_rom[address_in]; end ``` 这里特别强调的是当指定为"distributed"模式时将会优先考虑运用查找(LUTs)LUT-based logic fabric rather than dedicated BRAM blocks within the FPGA device to implement small memories such as this one above which only occupies few bytes worth space.[^1] 最后提醒一点关于timing closure方面由于不同风格的选择可能会带来不一样的延迟特性所以在做高层次优化前最好先了解清楚目标器件特性和预期性能指标再决定采取哪种策略更为合理有效[^1].
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值