关于zynq block ram使用时的问题记录

zynq 真双端口block ram仿真:

在准备进行ZYNQ ps和pl大量数据通信的时候,采用block ram进行数据交互,其中部分区域用于读,部分区域用于写。为了分解项目难度,先在PL端例化了block ram ip核,并且写了两个读写模块,用于测试仿真相关读写逻辑。但是在寻址的时候遇到了问题,已经找到问题并解决,在此记录一下。


问题描述

分别对block ram的两个端口写了互相读写的两个读写模块,其中一个模块在某地址中只写,另一个则只读,仿真的时候故意时序不同步模拟PS和PL的异步读写。出现的问题是,在仿真的时候:端口0对地址28-540分别写入32bit数据1、2、3、4…,对地址554-1052分别读出数据,对地址1056-1560分别写入32bit数据101、102、103、104…,对地址1564-2076分别读出数据;另一个端口正好相反,端口1对地址28-540分别读出数据,对地址554-1052分别写入32bit数据1、2、3、4…,对地址1056-1560分别读出数据,对地址1564-2076分别写入32bit数据101、102、103、104…。也就是一个读一个写,如图所示:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
理论上讲,端口0对554-1052分别读出的数据应该是1、2、3、4…,对地址1564-2076分别读出数据101、102、103、104…;另一个端口正好相反,端口1对地址28-540分别读出数据1、2、3、4…,对地址1056-1560分别读出数据101、102、103、104…。但是实际上无论那个端口,读出的数据都是101、102、103、104…。
Block Ram相关IP核的配置如图所示:
在这里插入图片描述
在这里插入图片描述在这里插入图片描述

在这里插入图片描述

原因分析:

网上查找相关资料后发现,应该是由于IP核配置的时候,下图所示标签没有勾选。
在这里插入图片描述
这个标签不勾选,地址的偏移就会按照配置的端口宽度进行,比如端口的write width配置为32bit,则地址每次增加1表示一个32bit。而这里我下意识的认为地址应该按照byte偏移(因为在block中例化block ram的时候,如果选择bram控制器模式则默认会把这个标签勾选从而按照byte寻址),比如地址0-3表示一个32bit,地址4-7表示另一个32bit,并且我的端口深度配置为1024,所以在读写模块中寻址的时候最大回到1564,已经超过1024的寻址范围,因此我猜测如果超出地址寻址范围则会绕回到0地址重新写,从而导致一直写入的是101、102、103、104这样的数据。端口宽度和深度配置如下图所示:
在这里插入图片描述


解决方案:

这里参考了这篇文章Block Memory Generator之TDPRAM应用知识点记录。将Generate address interface 32bit进行勾选,就能够正常按照byte进行寻址了。但是另外要注意的是如果将Generate address interface 32bit进行勾选,则wea写使能信号变成了4bit,每个bit对应一个字节的读写控制操作。如下图所示:

在这里插入图片描述

### Zynq 设备中的 RAM 配置与使用方法 #### 1. 使用 Vivado 提供的 IP 核实例化 RAM 在 Xilinx 的开发工具 Vivado 中,可以通过调用预定义的 IP 核快速创建和配置 RAM 模块。这些模块可以根据设计需求灵活调整参数,例如宽度、深度以及读写模式等。通过这种方式生成的 RAM 可以被集成到 FPGA 或 SoC 的逻辑电路中,并按照指定的序完成数据存取操作[^1]。 为了验证所构建 RAM 的功能是否正常工作,在调试阶段可借助 ILA(Integrated Logic Analyzer)在线逻辑分析仪捕获其运行期间的关键信号波形,从而确认实际硬件行为是否符合预期的设计目标。 #### 2. BRAM 特性及其双端口支持能力 Xilinx 7 系列芯片内部集成了大量的 Block RAM (BRAM),它们均属于真双端口结构 True Dual Port Ram (TDP)[^2]。这意味着每一个 BRAM 单元都具备两套完全独立的操作接口 A 和 B,允许同由不同控制器发起针对同一物理存储区域的不同请求——既可以是从同一个处理器发出连续寻址指令序列下的交替访问动作;也可以是由多个异步进程分别控制各自的通道执行各自的任务而互不干扰。 这种特性使得开发者能够在单一资源基础上搭建更加复杂高效的数据流架构模型,比如流水线处理单元或者多路缓冲池管理方案等等应用场合下显得尤为重要。 #### 3. 利用 OCM 实现伪双端口机制 对于某些特定应用场景而言,除了利用内置 BRAM 构建标准意义上的双端口内存之外,还可以考虑基于 On-Chip Memory(OCM) 来模拟类似的解决方案。尽管传统意义上讲 OCM 属于单端口性质的随机访问型静态RAM ,但在 Zynq 平台之上则提供了额外的可能性:即借助 DMA 技术配合精心规划好的地址映射关系及同步策略之后,则有可能达到近似效果 —— 让原本受限于串行交互瓶颈的传统单端口 SRAM 表现出类似于具有更高并发性能特征的新形态表现形式出来 [^3]. 值得注意的是当采取这种方法论去解决问题候需要注意保持严格的字节边界对齐约束条件不变动才行 , 这样做不仅有助于维持整个系统的稳定性同也利于提升整体效率水平. ```python def configure_ram(): """ Example function to demonstrate how a RAM might be configured using Python-like pseudocode. This is purely illustrative and does not represent actual HDL code used within an FPGA design flow. """ ram_instance = instantiate_ip_core('ram', width=32, depth=1024) # Configure read/write timing parameters as needed set_read_latency(ram_instance, cycles=2) set_write_latency(ram_instance, cycles=1) return ram_instance ``` 上述代码片段展示了如何可能地设置一个假想中的RAM组件的一些基本属性设定过程的一个简化版本表示法而已并非真实可用HDL源码内容本身。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大翔子子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值