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

【AXI总线专题】-AXI-LITE总线解读

【AXI总线专题】-AXI-LITE总线解读

  • 1.axi-lite概述
  • 2.信号定义
    • Write address channel
    • Write data channel
    • Write response channel
    • Read address channel
    • Read data channel
  • 3.测试
  • 4.仿真波形
  • 5.工程文件

参考手册
《3-2-03米联客2022版AXI4总线专题-20211123.pdf》
《IHI0022E_amba_axi_and_ace_protocol_spec.pdf》
内容已包含在下载文件中

1.axi-lite概述

AXI-LITE总线只支持单次突发,也就是说每次传输只能传一个数据。另外,传输的数据位宽只支持32bit或者64bit
在这里插入图片描述

2.信号定义

在这里插入图片描述

Write address channel

在这里插入图片描述在这里插入图片描述在这里插入图片描述
AWPORT一般默认为0,定义为:

output wire [2 : 0] M_AXI_AWPROT,

Write data channel

在这里插入图片描述在这里插入图片描述
这里的WSTRB类似与掩码。如果总线位宽为32bit,则WSTRB[3:0]=4’b1111,表示32bit位宽的数据每一位都是有效的。

Write response channel

在这里插入图片描述在这里插入图片描述在这里插入图片描述
BRESP反馈信号的值,返回值为0表示OKAY;注意这里的valid的方向,是从机到主机,和上面的写地址通道以及写数据通道是反方向的。

Read address channel

在这里插入图片描述在这里插入图片描述在这里插入图片描述

Read data channel

在这里插入图片描述在这里插入图片描述

3.测试

使用代码手动实现一个axi-lite-master的功能。用户可以通过该代码,对axi-lite-slave进行读写操作。
需要注意的是,该代码中使用了fifo对数据进行缓存。目的是axi-lite只支持单次突发,也就是一次只能传输一个数据。但是用户侧如果在执行写操作的时候,往往会一次性写入很多数据,这里就需要通过fifo执行缓存,数据先写入fifo,然后再慢慢通过axi-lite发送出去。
axi-lite-slave使用官方生成的代码。
仿真tb代码参考如下:

`timescale 1ns / 1ps
//
// Company: 
// Engineer: 
// 
// Create Date: 2025/05/07 15:25:31
// Design Name: 
// Module Name: sim_top_tb
// Project Name: 
// Target Devices: 
// Tool Versions: 
// Description: 
// 
// Dependencies: 
// 
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
// 
//module sim_top_tb();reg clk,rst;initial beginrst = 0;#100;@(posedge clk)rst = 1;
end always beginclk = 0;#10;clk = 1;#10;
endparameter                       P_ADDR_WIDTH = 32;
parameter                       P_DATA_WIDTH = 32;  
wire                           M_AXI_ACLK        ;
wire                           M_AXI_ARESETN     ;wire  [P_ADDR_WIDTH - 1 : 0]   M_AXI_AWADDR      ;
wire  [2 :0]                   M_AXI_AWPROT      ;
wire                           M_AXI_AWVALID     ;
wire                           M_AXI_AWREADY     ;wire  [P_DATA_WIDTH - 1   : 0] M_AXI_WDATA       ;
wire  [P_DATA_WIDTH/8 - 1 : 0] M_AXI_WSTRB       ;
wire                           M_AXI_WVALID      ;
wire                           M_AXI_WREADY      ;wire  [1 :0]                   M_AXI_BRESP       ;
wire                           M_AXI_BVALID      ;
wire                           M_AXI_BREADY      ;wire  [P_ADDR_WIDTH - 1 : 0]   M_AXI_ARADDR      ;
wire  [2 :0]                   M_AXI_ARPROT      ;
wire                           M_AXI_ARVALID     ;
wire                           M_AXI_ARREADY     ;wire  [P_DATA_WIDTH - 1   : 0] M_AXI_RDATA       ;
wire  [1 :0]                   M_AXI_RRESP       ;
wire                           M_AXI_RVALID      ;
wire                           M_AXI_RREADY      ;
reg  [P_ADDR_WIDTH - 1:0]     ri_write_addr      ;
reg  [P_DATA_WIDTH - 1:0]     ri_write_data      ;
reg                           ri_write_valid     ;
reg  [P_ADDR_WIDTH - 1:0]     ri_read_addr       ;
reg                           ri_read_valid      ;
wire  [P_DATA_WIDTH - 1:0]    w_read_data        ;
wire                          w_read_data_valid  ;assign  M_AXI_ACLK     =  clk;  
assign  M_AXI_ARESETN  =  rst;
//assign  M_AXI_WSTRB    =  1;AXI_LITE_Master#(.P_ADDR_WIDTH        (P_ADDR_WIDTH     ) ,.P_DATA_WIDTH        (P_DATA_WIDTH     ) //axi-lite总线支持32bit和64bit两种位宽
)
AXI_LITE_Master_u0
(         /*----axi lite----*/ .M_AXI_ACLK          (M_AXI_ACLK       ),.M_AXI_ARESETN       (M_AXI_ARESETN    ),  .M_AXI_AWADDR        (M_AXI_AWADDR     ),.M_AXI_AWPROT        (M_AXI_AWPROT     ),.M_AXI_AWVALID       (M_AXI_AWVALID    ),.M_AXI_AWREADY       (M_AXI_AWREADY    ),   .M_AXI_WDATA         (M_AXI_WDATA      ),.M_AXI_WSTRB         (M_AXI_WSTRB      ),//M_AXI_WSTRB.M_AXI_WVALID        (M_AXI_WVALID     ),.M_AXI_WREADY        (M_AXI_WREADY     ),         .M_AXI_BRESP         (M_AXI_BRESP      ),.M_AXI_BVALID        (M_AXI_BVALID     ),.M_AXI_BREADY        (M_AXI_BREADY     ),     .M_AXI_ARADDR        (M_AXI_ARADDR     ),.M_AXI_ARPROT        (M_AXI_ARPROT     ),.M_AXI_ARVALID       (M_AXI_ARVALID    ),.M_AXI_ARREADY       (M_AXI_ARREADY    ),  .M_AXI_RDATA         (M_AXI_RDATA      ),.M_AXI_RRESP         (M_AXI_RRESP      ),.M_AXI_RVALID        (M_AXI_RVALID     ),.M_AXI_RREADY        (M_AXI_RREADY     ),/*----user prot----*//*为什么分axi接口和用()户接口。这里的是将用户自定义接口转成axi接口,这样就可以和axi接口的其他IP直接相连*/.i_write_addr        (ri_write_addr    ),.i_write_data        (ri_write_data    ),.i_write_valid       (ri_write_valid   ),     .i_read_addr         (ri_read_addr     ),.i_read_valid        (ri_read_valid    ),.o_read_data         (w_read_data      ),.o_read_data_valid   (w_read_data_valid)
);axi_lite_slave_v1_0_S00_AXI #(.C_S_AXI_DATA_WIDTH	(P_DATA_WIDTH),.C_S_AXI_ADDR_WIDTH	(P_ADDR_WIDTH))
axi_lite_slave_v1_0_S00_AXI_u0(.S_AXI_ACLK        (M_AXI_ACLK    ),.S_AXI_ARESETN     (M_AXI_ARESETN ),.S_AXI_AWADDR      (M_AXI_AWADDR  ),.S_AXI_AWPROT      (M_AXI_AWPROT  ),.S_AXI_AWVALID     (M_AXI_AWVALID ),.S_AXI_AWREADY     (M_AXI_AWREADY ),.S_AXI_WDATA       (M_AXI_WDATA   ),   .S_AXI_WSTRB       (M_AXI_WSTRB   ),.S_AXI_WVALID      (M_AXI_WVALID  ),.S_AXI_WREADY      (M_AXI_WREADY  ),.S_AXI_BRESP       (M_AXI_BRESP   ),.S_AXI_BVALID      (M_AXI_BVALID  ),.S_AXI_BREADY      (M_AXI_BREADY  ),.S_AXI_ARADDR      (M_AXI_ARADDR  ),.S_AXI_ARPROT      (M_AXI_ARPROT  ),.S_AXI_ARVALID     (M_AXI_ARVALID ),.S_AXI_ARREADY     (M_AXI_ARREADY ),.S_AXI_RDATA       (M_AXI_RDATA   ),.S_AXI_RRESP       (M_AXI_RRESP   ),.S_AXI_RVALID      (M_AXI_RVALID  ),.S_AXI_RREADY      (M_AXI_RREADY  ));task write_data(input [31:0] addr,input [31:0]data);
begin:write_taskri_write_addr  <= 'd0;ri_write_data  <= 'd0;ri_write_valid <= 'd0;@(posedge clk);ri_write_addr  <= addr;ri_write_data  <= data;ri_write_valid <= 'd1;@(posedge clk);ri_write_addr  <= 'd0;ri_write_data  <= 'd0;ri_write_valid <= 'd0;@(posedge clk);
end
endtasktask read_data(input [31:0] addr);
begin:read_taskri_read_addr   <= 'd0;ri_read_valid  <= 'd0;@(posedge clk);ri_read_addr   <= addr;ri_read_valid  <= 'd1;@(posedge clk);ri_read_addr   <= 'd0;ri_read_valid  <= 'd0;@(posedge clk);
end
endtaskinitial
beginri_write_addr  = 0;ri_write_data  = 0;ri_write_valid = 0;ri_read_addr   = 0;ri_read_valid  = 0;wait(rst);//wait后面的括号中填的是退出等待的条件repeat(10);write_data(10,100);//这边的代码是顺序执行的,先写再读read_data(10);forkwrite_data(1,99);//使用fork需要注意的是,这两句代码是并行执行,不是顺序执行的read_data(1);//也就是同时执行写和读的操作joinendendmodule

4.仿真波形

下图所示,是在tb中执行用户端口信号的操作
首先是往地址为10的空间写入数据100;然后再执行读地址100处的数据,这里就有先写后读的顺序
其次是往地址为1的空间写入数据99;同时执行读操作。这里的写和读就是同时进行的
在这里插入图片描述

用户侧的逻辑代码,到axi这里实现的效果如下。
在上面我们执行往地址1处写入数据99的操作,同时执行读操作。到axi这里就进行了仲裁,把原来同时进行的读写,这里进行了变换,可以看出,先往地址1上写入数据99;然后再执行了读的操作。
在这里插入图片描述

5.工程文件

基于axi-lite-master的逻辑代码实现与仿真

http://www.xdnf.cn/news/4769.html

相关文章:

  • 307.重新格式化电话号码
  • MySQL中MVCC的实现原理
  • WarpDemuX
  • AI开发跃迁指南(第三章:第四维度1——Milvus、weaviate、redis等向量数据库介绍及对比选型)
  • docker镜像误删恢复
  • 网络字节序 - 大端
  • 三格电子—ProfiNet 转 CAN/CANopen 网关应用案例
  • pygame联网飞机大战游戏实现
  • Ubuntu18.04 设置开机服务自启
  • 蓝桥杯FPGA赛道积分赛
  • 【愚公系列】《Manus极简入门》026-市场分析专家:“市场洞察家”
  • Centos系统详解架构详解
  • 深度学习工程化:基于TensorFlow的模型部署全流程详解
  • 力扣刷题Day 42:缺失的第一个正数(238)
  • Linux防火墙
  • DVWA保姆级通关教程--05文件上传
  • LeetCode 热题 100 131. 分割回文串
  • 对 Kotlin 中的 data 关键字的理解,相比于普通类有哪些特点?
  • 在浏览器使用 MCP,纯边缘函数实现 MCP Client Server
  • 软考错题(三)
  • JavaSE核心知识点02面向对象编程02-01(类与对象)
  • Ubuntu 安装 Nginx
  • networkmanager 和 resolv.conf 可能有覆盖需要配置DNS
  • OpenHarmony平台驱动开发(八),MIPI CSI
  • 旧版 Flutter 写的项目, 想要在新的环境上运行?
  • Kotlin 遍历
  • Spring普通配置类 vs 自动配置类-笔记
  • USRP B210 TX_IQ处理
  • Ceph PG unfound/lost 问题排查与解决
  • 记录Token反序列化OAuth2Authentication(主要是直接存储用户信息的UserDetails )