尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
【正点原子ZYNQ领航者7020】PS写ramPL读ram实验
文章目录前言1.创建Vivado工程2.创建AXI BRAM控制器3.创建pl_bram_rd IP核4.搭建block design5.创建vitis工程并执行6.如何对IP核内部信号进行debug7.如何取消debug总结前言无仅作记录不具有参考价值。在hello world实验工程上进行修改。1.创建Vivado工程在hello world的工程上完成block design的搭建。点击OK完成配置2.创建AXI BRAM控制器配置如上以下为添加bram的步骤搜索点击ok完成配置以下为设置bram存储容量变相修改深度axi4-lite无法修改宽度修改容量为4k个字节即深度4k*8/321024先删除wrapper文件防止vivado不更新对bd文件执行generate products生成wrapper文件之后生成bit流文件生成bit流文件之后到处xsa文件3.创建pl_bram_rd IP核根据自定义创建IP核那一节建立编辑IP核工程将创建的文件放到hdl文件夹下这里名字打错了应该是bram_rdbram_rd.v:modulebram_rd(input clk,input rst_n,//PS配置的参数input start_rd,//读开始信号input[31:0]start_addr,//读起始地址input[31:0]rd_len,//读长度以字节为单位//BRAM的端口output ram_clk,output ram_rst,//RAM复位信号高电平有效output reg ram_en,//RAM使能信号高电平有效output[3:0]ram_we,//RAM写使能信号1写 0读output reg[31:0]ram_addr,//RAM读写地址output[31:0]ram_we_data,//RAM写数据input[31:0]ram_rd_data//RAM读数据);reg start_rd_d0;reg start_rd_d1;reg rd_flag;wire pos_start_rd;assign pos_start_rdstart_rd_d0~start_rd_d1;assign ram_clkclk;assign ram_rst1b0;assign ram_we4b0;assign ram_we_data32b0;//对start_rd信号打两拍采上升沿always (posedge clk or negedge rst_n)beginif(!rst_n)begin start_rd_d01b0;start_rd_d11b0;endelsebegin start_rd_d0start_rd;start_rd_d1start_rd_d0;end end//根据读开始信号,读RAM中的数据always (posedge clk or negedge rst_n)beginif(!rst_n)begin rd_flag1b0;ram_en1b0;ram_addr32d0;endelsebeginif(rd_flag1b0)beginif(pos_start_rd)begin//判断读开始信号的上升沿ram_en1b1;ram_addrstart_addr;rd_flag1b1;end endelsebeginif(ram_addrstart_addrrd_len-32d4)begin ram_en1b0;ram_addr32d0;rd_flag0;endelseram_addrram_addr32d4;end end end endmodule在编写bram_rd.v之后编辑pl_bram_rd_v1_0_S00_AXI.v加入以下两节bram_rdu_bram_rd(.clk(S_AXI_ACLK),.rst_n(S_AXI_ARESETN),.start_rd(slv_reg0[0]),.start_addr(slv_reg1),.rd_len(slv_reg2),.ram_clk(ram_clk),.ram_rst(ram_rst),.ram_en(ram_en),.ram_we(ram_we),.ram_addr(ram_addr),.ram_we_data(ram_we_data),.ram_rd_data(ram_rd_data));//BRAM的端口output ram_clk,output ram_rst,//RAM复位信号高电平有效output ram_en,//RAM使能信号高电平有效output[3:0]ram_we,//RAM写使能信号1写 0读output[31:0]ram_addr,//RAM读写地址output[31:0]ram_we_data,//RAM写数据input[31:0]ram_rd_data,//RAM读数据pl_bram_rd_v1_0中加入下面这两段//BRAM的端口output ram_clk,output ram_rst,//RAM复位信号高电平有效output ram_en,//RAM使能信号高电平有效output[3:0]ram_we,//RAM写使能信号1写 0读output[31:0]ram_addr,//RAM读写地址output[31:0]ram_we_data,//RAM写数据input[31:0]ram_rd_data,//RAM读数据.ram_clk(ram_clk),.ram_rst(ram_rst),.ram_en(ram_en),.ram_we(ram_we),.ram_addr(ram_addr),.ram_we_data(ram_we_data),.ram_rd_data(ram_rd_data),综合一下看看有没有问题以下为编辑总线接口右击ram_rst选择remove interfaceram_clk也是点击ok选择Port Mapping做好映射点击ok封装引脚完毕对IP进行重新打包若要添加IP适配型号可以这样做4.搭建block design在原来的工程中添加IP核路径链接pl_bram_rd和bram再次自动连接验证之后发现问题原因是两个总线接口的Master Type参数不匹配重新进入编辑IP核工程填写BRAM_CTRL然后重新打包回到原始工程点击先不对db文件进行编译rerun刷新没问题了再次刷新刷新之后进行更改自定义IP核的makefile文件右击BRAM_PORTB的连接线选择DEBUG点击自动连线添加ILAIP核双击ILAIP核修改深度为20485.创建vitis工程并执行编译最新的bd文件并生成wrapper然后重新生成bit流导出xsa文件打开vitis创建工程及main.c#includexil_printf.h#includestdio.h#includexbram.h#includexparameters.h#includepl_bram_rd.h#defineSTART_ADDR0//BRAM起始地址#defineBRAM_DATA_BYTE4//BRAM数据的字节宽度#definePL_BRAM_BASEXPAR_PL_BRAM_RD_0_S00_AXI_BASEADDR//PL_BRAM_RD_IP核的基地址#definePL_BRAM_STARTPL_BRAM_RD_S00_AXI_SLV_REG0_OFFSET//PL_BRAM_RD_IP核的读开始寄存器#definePL_BRAM_START_ADDRPL_BRAM_RD_S00_AXI_SLV_REG1_OFFSET//PL_BRAM_RD_IP核的读起始地址的寄存器#definePL_BRAM_LENPL_BRAM_RD_S00_AXI_SLV_REG2_OFFSET//PL_BRAM_RD_IP核的读长度寄存器voidstr_wr_bram(void);voidpl_bram_rd_cfg(void);voidstr_rd_bram(void);charch_data[1024];intch_data_len;intmain(void){while(1){printf(please enter data tp write BRAM\r\n);scanf(%1024s,ch_data);//接收用户输入的字符串ch_data_lenstrlen(ch_data);//计算字符串的长度str_wr_bram();//将用户输入的字符串写入BRAMpl_bram_rd_cfg();//配置PL_BRAMstr_rd_bram();//从BRAM中读出数据}}//将用户输入的字符串写入BRAMvoidstr_wr_bram(void){inti0;intwr_cnt0;for(iSTART_ADDR*BRAM_DATA_BYTE;i(START_ADDRch_data_len)*BRAM_DATA_BYTE;ii4){XBram_WriteReg(XPAR_BRAM_0_BASEADDR,i,ch_data[wr_cnt]);wr_cnt;}}voidpl_bram_rd_cfg(void){//配置读起始地址PL_BRAM_RD_mWriteReg(PL_BRAM_BASE,PL_BRAM_START_ADDR,START_ADDR*BRAM_DATA_BYTE);//配置读长度PL_BRAM_RD_mWriteReg(PL_BRAM_BASE,PL_BRAM_LEN,ch_data_len*BRAM_DATA_BYTE);//开始读PL_BRAM_RD_mWriteReg(PL_BRAM_BASE,PL_BRAM_START,1);PL_BRAM_RD_mWriteReg(PL_BRAM_BASE,PL_BRAM_START,0);}//从BRAM中读出数据voidstr_rd_bram(void){inti0;intread_data;for(iSTART_ADDR*BRAM_DATA_BYTE;i(START_ADDRch_data_len)*BRAM_DATA_BYTE;ii4){read_dataXBram_ReadReg(XPAR_BRAM_0_BASEADDR,i);printf(BRAM address is %d, read data is %c\r\n,i/4,read_data);}}复制以上代码给板子上电之后开启xilinx的seial terminal选择对应的串口回到vivado点击open target选择auto connect将触发信号拖到右下角并将触发类型设置为上升沿触发点击运行等待触发随便输入什么比如123456功能是对的6.如何对IP核内部信号进行debug倘若想要测试ip核的内部信号可以在.v文件中添加debug属性例如在IP核中的bram_rd.v代码中添加(* mark_debug “true” *)添加好之后重新打包和封装即可更新bd文件中的ip核接下来对工程进行综合之后打开综合后的设计这一步软件可能会卡死如果卡死了就重新打开vivado点击setup debug右击undefined选择时钟rd_flag信号也是一样时钟设置之后点击next深度选择完毕之后点击nextctrls保存这里会自动跳出创建xdc文件命名debug关闭综合设计之后重新生成bit流文件编程完毕之后到处xsa文件在vitis中更新硬件平台工程重新编译并下载先关闭open hardware manager然后再打开auto connect可以看到有两个ila界面把pos也拉到触发设置那并设置上升沿触发点击运行等待触发依旧随便输入看到信号有跳变沿若要清除block design里的ilaip核可以右击debug的信号线选择clear debug7.如何取消debug若要删除自定义ip核的内部debug要将xdc文件从工程中移除从磁盘中移除再在原来的ip核代码中删除(* mark_debug “true” *)之后重新打包并更新db即可然后重新生成wrapper生成bit流文件导出xsa更新vitis工程总结需要注意的是正点原子的这份程序浪费了整整 3/4 的 BRAM 空间。在 Zynq 的架构中BRAM 控制器挂载在 AXI 总线上标准的数据位宽是 32 位4 个字节。XBram_WriteReg 底层实际上调用的是 Xil_Out32也就是一次性写入 32 位4 字节的数据。当你执行 XBram_WriteReg(BASE, i, ch_data[wr_cnt]) 时你的 ch_data[wr_cnt] 只是一个 8 位的 char比如字符 ‘A’十六进制是 0x41。C 语言编译器会自动将它高位补零强转成 32 位0x00000041。BRAM 控制器一口吞下了这个 32 位数据把它存放在 i 到 i3 这 4 个字节的地址空间里。接着你的循环 i i 4 直接跳到了下一个 32 位地址。结果就是 每 4 个字节的 BRAM 空间里只有最低的 1 个字节存了你的有效字符高 3 个字节全是 0x00。这就是 3/4 空间浪费。工程分享ps_pl_bram_pra.zip
RELATED

相关推荐

AI工程从零开始:环境、数据与模型的契约化实践

AI工程从零开始:环境、数据与模型的契约化实践

1. 这不是“搭个LLM API”——AI工程从零开始的真实含义很多人看到“AI Engineering from Scratch”第一反应是:哦,不就是用LangChain调个OpenAI接口,再加个RAG pipeline?配个Streamlit前端,发个GitHub repo&#xff0…

📅 2026/9/30 8:57:04
TensorFlow工业级部署核心原理与实战

TensorFlow工业级部署核心原理与实战

1. 这不是“又一个深度学习框架”——TensorFlow到底在解决什么问题?你搜“tensorflow”,页面上跳出来的全是安装报错截图、版本冲突日志、CUDA兼容性表格,还有人发帖问“为什么pip install tensorflow老是卡在Downloading…”。但真正该问的…

📅 2026/9/30 8:57:04
越权访问漏洞

越权访问漏洞

第零章:零基础入门如果你完全没有安全基础,从这里开始读。如果你已有基础,可直接跳到第一章。0.1 先搞懂什么是"登录"你每天用手机 App、刷网页时,有没有想过:为什么你打开淘宝就能看到自己的订单&#xff0…

📅 2026/9/30 8:52:00
MORE NEWS

更多资讯

📰

校园网网络系统集成课程设计:三层架构与VLAN/ACL配置详解

简介:这是一份面向计算机网络相关专业学生的《网络系统集成课程设计报告书》Word文档,以某高校校园网为实际场景,完整呈现从需求分析、网络拓扑规划到设备选型的全过程。内容涵盖学校网络现状调研、建设目标设定、千兆主干设计、VLAN划分与三…

📰

STM32 HAL库CubeMX直流电机PID闭环调速与编码器测速调参

很多人第一次做直流电机闭环,代码烧进去之后遇到的现象都差不多:电机要么一动不动静止不动,要么转起来像在打摆子,转速忽高忽低,用手轻轻一按轴转速立刻掉一半,松手又冲上去。我最早做这类项目时也踩过同样…

📰

LSTM时间序列预测实战:从灰色关联度特征筛选到PM2.5浓度预测

简介:《基于LSTM循环神经网络的PM_(2.5)预测》PDF文档面向环境科学、数据建模与机器学习学习者,聚焦PM2.5浓度变化因多因素耦合而呈现突发、非线性且难以用传统方法预测的问题,系统介绍LSTM循环神经网络预测模型的构建流程。内容包括灰色关联…

📰

智能体工程化落地实战:从ReAct到Agentic RAG的架构演进与避坑指南

1. 智能体这波浪潮到底在卷什么 过去一年我几乎每周都在追智能体方向的论文和开源项目,从最早的 ReAct 那套“想一步做一步”的范式,到后来一堆 Agentic RAG、多智能体协作框架,再到最近各大厂开始把智能体往云底座上搬,整个领域的…

📰

项目网盘大文件上传:暂停与取消的操作边界

大文件上传到一半临时需要停下来时,最容易混淆的其实是两个不同问题: 现在能不能把这次上传停下来? 以及: 停下来以后,能不能从原来的位置继续? 前一个问题关注当前有哪些操作,后一个问题关…

📰

UE帧计时与网络同步:从DeltaTime到延迟优化的工程实践

如果你在虚幻引擎里写过哪怕是几个月的Gameplay系统,一定被这样的问题折磨过:为什么玩家明明点了攻击,服务器收到时已经晚了半拍?为什么两个客户端看到的Boss血条不一样?为什么同一个变量,A客户端先变化&am…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬