ZYNQ学习笔记——12_ps_pl_bram实验

该文描述了一个使用PYNQ-Z2开发板进行PS-PL通信的实验,通过串口接收数据写入BRAM,然后从BRAM中读出并打印,同时PL读取BRAM数据进行ILA观察,确保数据一致性。代码示例展示了如何配置IP核和进行BRAM读写操作。

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

12_ps_pl_bram实验

PS将串口接收到的数据写入BRAM,然后从BRAM中读出数据,并通过串口打印出来;与此同时,PL从BRAM中同样读出数据,并通过ILA来观察读出的数据与串口打印的数据是否一 致

使用 PYNQ-Z2开发板

硬件配置、IP核设计 参考正点原子资料和视频

代码

#include "xil_printf.h"
#include "stdio.h"
#include "xbram_hw.h"
#include "pl_bram_rd.h"

#define PL_BRAM_START			PL_BRAM_RD_S00_AXI_SLV_REG0_OFFSET	//RAM读开始寄存器地址
#define PL_BRAM_START_ADDR		PL_BRAM_RD_S00_AXI_SLV_REG1_OFFSET	//RAM起始寄存器地址
#define PL_BRAM_LEN				PL_BRAM_RD_S00_AXI_SLV_REG2_OFFSET	//PL读 RAM的深度
#define	PL_BRAM_BASE			XPAR_PL_BRAM_RD_0_S00_AXI_BASEADDR	//PL_RAM_RD基地址

#define START_ADDR			0	//RAM起始地址范围:0~1023
#define BRAM_DATA_BYTE		4	//BRAM数据字节个数

char ch_data[1024];		//写入BRAM的字符数组
int  ch_data_len;		//写入BRAM的字符个数

int main()
{
	while(1)
	{
		int i = 0;
		int wr_cnt = 0;
		int read_data = 0;

		printf("Please input data to read and write Bram !\n");
		scanf("%s",ch_data);			//用户输入字符串
		ch_data_len = strlen(ch_data);	//计算字符串的长度

		//将字符串写入BRAM,每次循环向 BRAM中写入 1 个字符
		for(i = START_ADDR*BRAM_DATA_BYTE; i<(START_ADDR + ch_data_len)*BRAM_DATA_BYTE; i+=BRAM_DATA_BYTE)
		{
			XBram_WriteReg(XPAR_BRAM_0_BASEADDR,i,ch_data[wr_cnt]);
			wr_cnt++;
		}
		//配置PL_BRAM_RD起始地址
		PL_BRAM_RD_mWriteReg(PL_BRAM_BASE,PL_BRAM_START_ADDR,START_ADDR*BRAM_DATA_BYTE);
		//配置PL_BRAM_RD长度
		PL_BRAM_RD_mWriteReg(PL_BRAM_BASE,PL_BRAM_LEN,ch_data_len*BRAM_DATA_BYTE);
		//配置PL_BRAM_RD开始读信号,产生一个上升沿
		PL_BRAM_RD_mWriteReg(PL_BRAM_BASE,PL_BRAM_START,1);
		PL_BRAM_RD_mWriteReg(PL_BRAM_BASE,PL_BRAM_START,0);

		//从 BRAM 中读出数据,循环从 BRAM 中读出数据
		for(i = START_ADDR*BRAM_DATA_BYTE; i<(START_ADDR + ch_data_len)*BRAM_DATA_BYTE; i+=BRAM_DATA_BYTE)
		{
			read_data = XBram_ReadReg(XPAR_BRAM_0_BASEADDR,i);
			printf("BRAM address is %d\t,Read data is %c\n",i/BRAM_DATA_BYTE,read_data);
		}

	}

}

串口

Please input data to read and write Bram !
BRAM address is 0	,Read data is 2
BRAM address is 1	,Read data is 0
BRAM address is 2	,Read data is 2
BRAM address is 3	,Read data is 3
BRAM address is 4	,Read data is /
BRAM address is 5	,Read data is 0
BRAM address is 6	,Read data is 7
BRAM address is 7	,Read data is /
BRAM address is 8	,Read data is 1
BRAM address is 9	,Read data is 9
Please input data to read and write Bram !

波形图如下,在 enb 拉高期间,doutb 输出的数据和串口助手发送的数据以及打印出的数据一致

在这里插入图片描述

参考

<think>嗯,用户想了解Xilinx ZU19EG的URAM资源使用说明。首先,我需要回忆一下Xilinx UltraScale+系列FPGA的存储资源结构。URAM是Ultra RAM,属于高性能大容量存储模块,通常用于需要大容量存储的应用,比如深度学习、大数据处理等。 记得URAM和BRAM的区别在于容量和结构。每个URAM的容量是288Kb,而BRAM是36Kb。URAM的访问方式可能不同,延迟可能更高,但吞吐量大。需要确认ZU19EG的具体URAM数量,可能需要查阅官方文档,比如产品手册或用户指南。 用户提供的引用内容中提到DDR存储控制器和PMU,这可能与存储子系统有关,但URAM属于FPGA的可编程逻辑资源,应该是在PL部分。需要指出URAM在PL中的位置和使用场景。 接下来,URAM的使用方法通常涉及Vivado中的IP核或直接实例化原语。比如使用Verilog或VHDL中的URAM原语,或者通过Block Memory Generator配置。需要注意URAM的地址位宽、读写时序以及时钟域的问题。 另外,URAM的级联使用可以扩展存储深度,但级联后的时序可能需要特别处理。功耗方面,URAM相比BRAM可能有不同的特性,需要在高密度存储时考虑功耗管理。 用户可能还需要知道URAM的应用场景,比如在哪些情况下应该使用URAM而不是BRAM或LUTRAM。例如,当需要大量数据缓存时,URAM更合适,而小规模存储则用BRAM。 可能需要提醒用户查阅Xilinx的官方文档,如UG573(UltraScale架构存储资源)和ZU19EG的数据手册,以获取准确的资源数量和详细配置参数。同时,参考设计案例或应用笔记可能会有帮助。</think>关于Xilinx ZU19EG URAM资源的使用说明,以下是关键技术要点整理: 1. **基础参数** - ZU19EG属于UltraScale+系列,其可编程逻辑(PL)中集成$288Kb \times 64$的URAM阵列 - 每个URAM模块包含$4 \times 72kb$子单元,支持深度优先或宽度优先配置[^2] - 总URAM容量为69.5Mb,相比BRAM提供$3.5\times$存储密度提升 2. **硬件连接特性** - 通过AXI接口与处理系统(PS)互联,支持128位数据总线宽度 - 可级联实现最大$4608 \times 72$位存储结构 - 支持异步复位和流水线操作,最高时钟频率达800MHz 3. **Vivado开发方法** (1) 原语调用示例: ```verilog URAM288_BASE #( .INIT_FILE("memory_init.mem"), .WRITE_MODE_A("NO_CHANGE") ) uram_inst ( .clka(clk), .addra(addr), .dina(data_in), .douta(data_out) ); ``` (2) 通过IP Integrator调用Block Memory Generator,选择"Ultra RAM"类型 4. **应用场景建议** - 大规模数据缓存(如视频帧缓冲) - 深度学习权重存储(支持FPGA内参数驻留) - 高吞吐量数据库索引 - 雷达信号处理的历史数据窗口 **注意事项**: 1. URAM延迟比BRAM多$1-2$个周期,需优化流水线设计 2. 混合使用URAM/BRAM时建议通过`set_ultraram_priority`约束分配策略 3. 级联使用时需保持地址对齐,建议采用Xilinx提供的级联模板 **相关文档**: - 器件手册:DS925 Zynq UltraScale+ MPSoC Data Sheet - 技术文档:UG573 (UltraScale Architecture Memory Resources) - 应用指南:XAPP1323 (URAM Optimization Techniques)
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值