当前位置: 首页 > news >正文

MYIR-ZYNQ7000系列-zturn教程(16):对axi_lite IP核进行仿真以及axi总线的初步讲解

我这里一共调用了两个自定义的IP都是基于axi_lite的IP核,一个是主机master一个是从机slave,然后将这两个调用的IP例化到一个新创建的fpga工程,最好写一个仿真脚本让这个master主机对这个从机slave进行读写。

工程链接

主机:

从机:

将master和slave都例化到fpga工程的顶层文件如下图所示

`timescale 1ns / 1ps ////////////////////////////////////////////////////////////////////////////////// // Company: // Engineer: // // Create Date: 2018/05/21 10:27:22 // Design Name: // Module Name: test_axi // Project Name: // Target Devices: // Tool Versions: // Description: // // Dependencies: // // Revision: // Revision 0.01 - File Created // Additional Comments: // ////////////////////////////////////////////////////////////////////////////////// module test_axi( input axi_aclk, input axi_aresetn, input app_txn, output state_err, output state_done ); parameter integer C_AXI_ADDR_WIDTH = 32; parameter integer C_AXI_DATA_WIDTH = 32; wire w_err; // 状态指示,出现错误 wire w_txn_done; // 状态指示,发送完毕 assign state_err = w_err; assign state_done = w_txn_done; wire [C_AXI_ADDR_WIDTH-1 : 0] axi_AWADDR; // AXI总线信号:AWADDR wire [2 : 0] axi_AWPROT; // AXI总线信号:AWPROT wire axi_AWVALID; // AXI总线信号:AWVALID wire axi_AWREADY; // AXI总线信号:AWREADY wire [C_AXI_DATA_WIDTH-1 : 0] axi_WDATA; // AXI总线信号:WDATA wire [C_AXI_DATA_WIDTH/8-1 : 0] axi_WSTRB; // AXI总线信号:WSTRB wire axi_WVALID; // AXI总线信号:WVALID wire axi_WREADY; // AXI总线信号:WREADY wire [1 : 0] axi_BRESP; // AXI总线信号:BRESP wire axi_BVALID; // AXI总线信号:BVALID wire axi_BREADY; // AXI总线信号:BREADY wire [C_AXI_ADDR_WIDTH-1 : 0] axi_ARADDR; // AXI总线信号:ARADDR wire [2 : 0] axi_ARPROT; // AXI总线信号:ARPROT wire axi_ARVALID; // AXI总线信号:ARVALID wire axi_ARREADY; // AXI总线信号:ARREADY wire [C_AXI_DATA_WIDTH-1 : 0] axi_RDATA; // AXI总线信号:RDATA wire [1 : 0] axi_RRESP; // AXI总线信号:RRESP wire axi_RVAILD; // AXI总线信号:RVAILD wire axi_RREADY; // AXI总线信号:RREADY myip_master_0 u1 ( .m00_axi_awaddr(axi_AWADDR), // output wire [31 : 0] m00_axi_awaddr .m00_axi_awprot(axi_AWPROT), // output wire [2 : 0] m00_axi_awprot .m00_axi_awvalid(axi_AWVALID), // output wire m00_axi_awvalid .m00_axi_awready(axi_AWREADY), // input wire m00_axi_awready .m00_axi_wdata(axi_WDATA), // output wire [31 : 0] m00_axi_wdata .m00_axi_wstrb(axi_WSTRB), // output wire [3 : 0] m00_axi_wstrb .m00_axi_wvalid(axi_WVALID), // output wire m00_axi_wvalid .m00_axi_wready(axi_WREADY), // input wire m00_axi_wready .m00_axi_bresp(axi_BRESP), // input wire [1 : 0] m00_axi_bresp .m00_axi_bvalid(axi_BVALID), // input wire m00_axi_bvalid .m00_axi_bready(axi_BREADY), // output wire m00_axi_bready .m00_axi_araddr(axi_ARADDR), // output wire [31 : 0] m00_axi_araddr .m00_axi_arprot(axi_ARPROT), // output wire [2 : 0] m00_axi_arprot .m00_axi_arvalid(axi_ARVALID), // output wire m00_axi_arvalid .m00_axi_arready(axi_ARREADY), // input wire m00_axi_arready .m00_axi_rdata(axi_RDATA), // input wire [31 : 0] m00_axi_rdata .m00_axi_rresp(axi_RRESP), // input wire [1 : 0] m00_axi_rresp .m00_axi_rvalid(axi_RVAILD), // input wire m00_axi_rvalid .m00_axi_rready(axi_RREADY), // output wire m00_axi_rready .m00_axi_aclk(axi_aclk), // input wire m00_axi_aclk .m00_axi_aresetn(axi_aresetn), // input wire m00_axi_aresetn .m00_axi_init_axi_txn(app_txn), // input wire m00_axi_init_axi_txn .m00_axi_error(w_err), // output wire m00_axi_error .m00_axi_txn_done(w_txn_done) // output wire m00_axi_txn_done ); myip_Slave_0 u2 ( .s00_axi_awaddr(axi_AWADDR), // input wire [3 : 0] s00_axi_awaddr .s00_axi_awprot(axi_AWPROT), // input wire [2 : 0] s00_axi_awprot .s00_axi_awvalid(axi_AWVALID), // input wire s00_axi_awvalid .s00_axi_awready(axi_AWREADY), // output wire s00_axi_awready .s00_axi_wdata(axi_WDATA), // input wire [31 : 0] s00_axi_wdata .s00_axi_wstrb(axi_WSTRB), // input wire [3 : 0] s00_axi_wstrb .s00_axi_wvalid(axi_WVALID), // input wire s00_axi_wvalid .s00_axi_wready(axi_WREADY), // output wire s00_axi_wready .s00_axi_bresp(axi_BRESP), // output wire [1 : 0] s00_axi_bresp .s00_axi_bvalid(axi_BVALID), // output wire s00_axi_bvalid .s00_axi_bready(axi_BREADY), // input wire s00_axi_bready .s00_axi_araddr(axi_ARADDR), // input wire [3 : 0] s00_axi_araddr .s00_axi_arprot(axi_ARPROT), // input wire [2 : 0] s00_axi_arprot .s00_axi_arvalid(axi_ARVALID), // input wire s00_axi_arvalid .s00_axi_arready(axi_ARREADY), // output wire s00_axi_arready .s00_axi_rdata(axi_RDATA), // output wire [31 : 0] s00_axi_rdata .s00_axi_rresp(axi_RRESP), // output wire [1 : 0] s00_axi_rresp .s00_axi_rvalid(axi_RVAILD), // output wire s00_axi_rvalid .s00_axi_rready(axi_RREADY), // input wire s00_axi_rready .s00_axi_aclk(axi_aclk), // input wire s00_axi_aclk .s00_axi_aresetn(axi_aresetn) // input wire s00_axi_aresetn ); endmodule

下面这个这个fpga工程的仿真脚本

`timescale 1ns / 1ps ////////////////////////////////////////////////////////////////////////////////// // Company: // Engineer: // // Create Date: 2018/05/21 11:10:59 // Design Name: // Module Name: test_tb // Project Name: // Target Devices: // Tool Versions: // Description: // // Dependencies: // // Revision: // Revision 0.01 - File Created // Additional Comments: // ////////////////////////////////////////////////////////////////////////////////// module test_tb(); reg axi_aclk; // AXI总线时钟 reg axi_aresetn; // 系统复位信号 reg r_app_txn; wire w_err; // 状态指示,出现错误 wire w_txn_done; // 状态指示,发送完毕 test_axi u1 ( .axi_aclk(axi_aclk), .axi_aresetn(axi_aresetn), .app_txn(r_app_txn), .state_err(w_err), .state_done(w_txn_done) ); always begin #10; axi_aclk = ~axi_aclk; end initial begin axi_aclk = 1'b0; axi_aresetn = 1'b1; r_app_txn = 1'b1; #10; axi_aresetn = 1'b0; #5; r_app_txn = 1'b0; #5; axi_aresetn = 1'b1; #5; r_app_txn = 1'b1; end endmodule

这个是运行仿真脚本后的master写的波形

这个是运行仿真脚本后master读的波形

对比写和读可以发现写入的和读出的是一致的说明这个master对这个slave进行读写是成功的

对于这个axi协议的各个引脚代表的含义我这里不做一一介绍,下面的截图里面已经说得比较清楚了

我这里主要介绍一个主机master对这个从机slave进行读写的详细过程

master slave

从机采集到主机的地址和数据从机内部开始进行执行写

assign slv_reg_wren = axi_wready && S_AXI_WVALID && axi_awready && S_AXI_AWVALID;(从机开始写数据的使能条件)

从机写完成后:

上面介绍的是一个master对slave写的全部过程

这里介绍的是master对slave读

master slave

assign slv_reg_rden = axi_arready & S_AXI_ARVALID & ~axi_rvalid;(进行读时使能条件)

主机读取完成后:

这里最后将这个读写过程总结一下

主机master进行写

主机master进行读

将这个当做笔记来进行记录以免以后自己忘记了

http://www.gsyq.cn/news/1345791.html

相关文章:

  • 东南大学论文模板:告别格式烦恼,专注学术创新的8倍效率解决方案
  • 2023B卷,响应报文时间
  • 如何在Linux上安装SOLIDWORKS:终极完整指南
  • 预训练模型技术演进史:从Word2Vec到多模态大模型
  • AI专著撰写新利器!一键生成20万字专著,高效又便捷的写作体验!
  • GitHub中文插件:3分钟让GitHub界面全面中文化,提升中文开发者效率的终极方案
  • 技术深度解析:Mac Mouse Fix的架构设计与实战优化
  • 如何在浏览器中免费制作专业电子书:EPubBuilder完整指南
  • 3步解锁百度网盘全速下载:baidu-wangpan-parse技术解析与应用实践
  • C++概念约束编程
  • 仅限云南开发者获取:ElevenLabs方言微调私有API密钥申请通道(含已通过审核的12家本地企业白名单参考)
  • 薪资翻倍的秘诀:2026届如何用AIGC作品集,拿下大模型相关岗位的入场券?
  • 从需求到设计:我用PowerDesigner画数据流图踩过的3个坑和避坑指南
  • 3步告别GitHub英文界面:中文插件让代码协作更轻松
  • 智慧医疗【全细胞数据集 如何训练医疗细胞检测数据集 构建基于深度学习YOLOV8细胞检测系统 全细胞检测数据集(血小板/红细胞/白细胞)+ YOLOv8 完整检测系统
  • 如何免费将纸质乐谱数字化:Audiveris开源工具完整指南
  • 魔兽争霸3终极兼容性修复:5分钟搞定所有现代系统问题
  • 开发AI应用时如何利用Taotoken模型广场进行模型选型
  • 远程医疗系统的四层架构
  • 5分钟快速上手SMUDebugTool:AMD Ryzen硬件调试终极指南
  • 中石化加油卡回收正规渠道揭秘:价格行情与平台选择全攻略 - 猎卡回收公众号
  • 2026本地口碑精选|杭州年会策划公司推荐哪家好 - GEO排行榜
  • 2026丽水市本地人必选的瓷砖空鼓专业维修公司TOP5推荐!卫生间空鼓翘边,厨房空鼓翘边,客厅空鼓翘边,全天响应,免费上门,5月专业瓷砖空鼓修复公司持证上岗师傅排名最新深度调研方案) - 一休修缮
  • GESP5级C++考试语法知识(十七、二分算法提高篇(一))
  • 利用 AI Agent 优化日常办公自动化流程
  • 2026陇南市本地人必选的瓷砖空鼓专业维修公司TOP5推荐!卫生间空鼓翘边,厨房空鼓翘边,客厅空鼓翘边,全天响应,免费上门,5月专业瓷砖空鼓修复公司持证上岗师傅排名最新深度调研方案) - 一修哥修缮
  • 全国外勤管理软件赛道盘点,技术赋能轨迹定位+客户拜访迎来转型 - 深度智识库
  • 2026北京劳力士手表回收评测,本地首选靠谱不踩雷 - 奢侈品回收测评
  • Windows任务栏透明美化神器:5分钟掌握TranslucentTB完整使用指南
  • 告别泊车翻车!用Python手把手教你搭建二自由度车辆模型(附代码)