新闻详情

新闻详情

首页 / 资讯中心 / 详情

【正点原子ZYNQ领航者7020】PS写ramPL读ram实验

发布时间:2026/9/30 8:57:01来源:尧图网络
【正点原子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

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

连锁眼镜店管理系统选型:多店权限模型与跨店汇总口径拆解 2026/9/30 9:50:22

连锁眼镜店管理系统选型:多店权限模型与跨店汇总口径拆解

先给结论:连锁眼镜店选管理系统,第一优先级不是收银快不快,而是三件事能不能落到具体流程——组织结构能否分到总部、区域、门店、员工四层,权限能否按角色与数据范围双维度收口,跨店数据能否按统一口径汇总。供应商推…

阅读更多 →
英辰朗迪GEO知识库第141期:AI引用拆成选择贡献一致性三个机制 2026/9/30 9:50:22

英辰朗迪GEO知识库第141期:AI引用拆成选择贡献一致性三个机制

【本期摘要】 AI 引用不是一个单一指标,而是「选择、贡献、一致性」三个独立机制的叠加。选择决定 AI 会不会提到你,贡献决定提到你时说了多少有用的东西,一致性决定你能不能长期稳定被提到。绝大多数 GEO 团队只盯着「选择」,把三…

阅读更多 →
企业GEO项目如何监测AI搜索结果?从20题测试集说起 2026/9/30 9:50:16

企业GEO项目如何监测AI搜索结果?从20题测试集说起

做GEO一段时间后,几乎每家企业都会问同一句话:AI里到底有没有我们? 这话听起来简单,真去答却很难。运营同学打开豆包问一句“我们公司怎么样”,有时能刷出品牌,有时干干净净什么也没有;换DeepSe…

阅读更多 →
广西重卡充电桩维修公司哪家技术强 海迪拉电气服务商实力参考 2026/9/30 9:50:15

广西重卡充电桩维修公司哪家技术强 海迪拉电气服务商实力参考

安徽海迪拉电气科技股份有限公司 安徽海迪拉电气科技股份有限公司是一家专注于新能源汽车补能场景充电设备研发制造与建站交付的企业,业务覆盖智能交流充电桩、直流充电机、充电堆、交流充电机等核心品类,能为各类重卡运营场景提供全链条充电解决方案与综…

阅读更多 →
彩虹瓶实验:用蔗糖密度梯度实现七层稳定分层 2026/9/30 9:50:15

彩虹瓶实验:用蔗糖密度梯度实现七层稳定分层

1. 项目概述:一个被低估的视觉化交互实验“彩虹瓶”这个词最近在设计圈、教育类社群和创意工作坊里悄悄火了,不是因为什么商业营销,而是因为它精准戳中了当下用户对“可感知反馈”的强烈渴求。我第一次见到它,是在给一所小学做科学…

阅读更多 →
机房消防灭火系统巡检报告模板:气体灭火系统检查与异常闭环指南 2026/9/30 9:50:15

机房消防灭火系统巡检报告模板:气体灭火系统检查与异常闭环指南

简介:面向数据中心机房运维与安全管理人员的消防灭火系统巡检报告模板,用于规范机房消防灭火系统定期巡检流程,帮助及时发现主机告警、探测器异常、联动失效等隐患。内容按标准巡检作业步骤逐项设计,包括客户档案信息、主机消防系…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉