当前位置: 首页 > 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.jsqmd.com/news/864292/

相关文章:

  • AI专著撰写新利器!一键生成20万字专著,高效又便捷的写作体验!
  • DazToBlender插件终极指南:如何实现Daz Studio到Blender的无缝资产迁移
  • GitHub中文插件:3分钟让GitHub界面全面中文化,提升中文开发者效率的终极方案
  • 预训练模型技术演进史:从Word2Vec到多模态大模型
  • 蔚蓝档案主题鼠标指针:5分钟快速安装指南
  • 2026溧阳市本地人必选的瓷砖空鼓专业维修公司TOP5推荐!卫生间空鼓翘边,厨房空鼓翘边,客厅空鼓翘边,全天响应,免费上门,5月专业瓷砖空鼓修复公司持证上岗师傅排名最新深度调研方案) - 一休修缮
  • 基于AI流动性监测模型的黄金波动分析:油价跳水与美元回落下的黄金震荡企稳机制解析
  • 如何在浏览器中免费制作专业电子书:EPubBuilder完整指南
  • 如何利用 AI Agent 优化日常办公自动化流程?
  • 2026跑遍武汉:哪家店回收名表最爽快?检测流程和压价幅度全对比 - 李宏哲1
  • 3步解锁百度网盘全速下载:baidu-wangpan-parse技术解析与应用实践
  • 2026临安市本地人必选的瓷砖空鼓专业维修公司TOP5推荐!卫生间空鼓翘边,厨房空鼓翘边,客厅空鼓翘边,全天响应,免费上门,5月专业瓷砖空鼓修复公司持证上岗师傅排名最新深度调研方案) - 一休修缮
  • 3分钟搞定Android开发环境:Windows平台ADB驱动终极安装指南
  • G-Helper终极指南:3步释放华硕笔记本完整性能的轻量控制革命
  • Windows任务栏透明美化神器:5分钟掌握TranslucentTB完整使用指南
  • 仅限云南开发者获取:ElevenLabs方言微调私有API密钥申请通道(含已通过审核的12家本地企业白名单参考)
  • iOS与Android市场份额变动背后的多维动因与未来趋势
  • 别再乱用set_clock_group了!搞懂异步时钟、逻辑/物理独立时钟的实战区别与避坑指南
  • DroidCam OBS Plugin终极指南:将手机秒变专业摄像头
  • 大润发购物卡回收:几分钟就能完成的便捷变现方式 - 团团收购物卡回收
  • 2026林芝市本地人必选的瓷砖空鼓专业维修公司TOP5推荐!卫生间空鼓翘边,厨房空鼓翘边,客厅空鼓翘边,全天响应,免费上门,5月专业瓷砖空鼓修复公司持证上岗师傅排名最新深度调研方案) - 一休修缮
  • 突发环境事件怎么模拟?用Python+GIS实现高斯烟团模型(附完整代码)
  • IDEA配置Tomcat热部署翻车实录:war exploded模式启动失败?看这篇就够了
  • 海南商贸公司注册代办TOP4推荐 2026本土正规商贸企业代办机构甄选 - 速递信息
  • 基于AI联储治理模型的政策重构分析:沃什试图重塑美联储,但现实复杂度远超预期
  • 2026利川市本地人必选的瓷砖空鼓专业维修公司TOP5推荐!卫生间空鼓翘边,厨房空鼓翘边,客厅空鼓翘边,全天响应,免费上门,5月专业瓷砖空鼓修复公司持证上岗师傅排名最新深度调研方案) - 一休修缮
  • Fluent结果后处理进阶:用自定义场函数挖掘仿真数据里的“隐藏信息”(以应变率+速度为例)
  • 3步告别GitHub英文界面:中文插件让代码协作更轻松
  • 2026年AI写标书平台哪个好?深度测评推荐: - 陈工0237
  • 别再死记硬背SPI时序了!用W25Q256JV Flash和STM32CubeMX,5分钟搞定SPI通信配置